Что такое базовая карта, эквивалентная «ax1.add_collection (mylinecollection)» Matplotlib? - PullRequest
0 голосов
/ 27 марта 2019

Я вытягиваю широты / долготы из реляционной базы данных. Точки являются вершинами отрезков, и таблица базы данных организована так, что точки могут быть сгруппированы по номеру строки и упорядочены по порядковому номеру точки. В частности, таблица базы данных имеет следующие поля: широта, долгота, номер_строки, номер_порядка_рт.

Я вытащил все сегменты линий в коллекцию линий. Он строит, как и ожидалось, используя Matplotlib ax1.add_collection(mylinecollection). Обратите внимание, что я использовал наборы строк вместо цикла ax1.plot(long,lat), потому что некоторые наборы данных имеют тысячи строк и десятки тысяч точек (сбор строк выполняется намного быстрее и чище).

Однако мне нужно построить эти коллекции линий с помощью базовой карты (чтобы у меня был хороший затененный рельеф и масштабная линейка). Базовая карта не может пройти .add_collection(), и я не уверен, какова альтернатива. Я не мог найти ответ или очевидный альтернативный подход в Учебниках по базовой карте (но, возможно, я упустил его). Спасибо за любую помощь.

Текущий код:

# note linecollection variable produced in function; performs as expected with "ax1.add_collection(linecollection)"
latitude_range = [34.012965603200001, 34.721878621999998]
longitude_range = [-116.76151759999999, -116.33691841200002]

import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
from mpl_toolkits.basemap import Basemap

south, north = latitude_range[0], latitude_range[1]
west, east = longitude_range[0], longitude_range[1]
center = [(east+west)/2, (north+south)/2]

m = Basemap(llcrnrlon=west, llcrnrlat=south, urcrnrlon=east, urcrnrlat=north,
            resolution='c', epsg=4326,
            lon_0=center[0], lat_0=center[1])

m.arcgisimage(service = "World_Shaded_Relief", xpixels = 2000)
m.add_collection(linecollection) # throws error "AttributeError: 'Basemap' object has no attribute 'add_collection'"

plt.show()

1 Ответ

1 голос
/ 28 марта 2019

Предоставив комментарий выше в качестве ответа:

Базовая карта использует оси:

fig, ax = plt.subplots()
m = Basemap(..., ax=ax) 

, на этих осях вы можете вызвать любой метод, который вам нравится, например,

ax.add_collection(...)

Убедитесь, что координаты набора линий сначала преобразуются в единицы базовой карты.

...