Невозможно нанести круги на проекцию карты в базовой карте с помощью Python - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь нанести круги на карту проекции Миллера, используя центральную широту, долготу и радиус.Я не могу заставить круги отображаться на карте.Я попытался построить их, используя различные методы, как показано в ссылках.

Как нарисовать круг в базовой карте или добавить артист

Как сделать сглаживаниекруги на проекциях базовой карты

Вот мой код:

def plot_notams(dict_of_filtered_notams):

''' Create a map of the US and plot all NOTAMS from a given time period.'''

'''Create the map'''
fig = plt.figure(figsize=(8,6), dpi=200)
ax = fig.add_subplot(111)
m = Basemap(projection='mill',llcrnrlat=20, urcrnrlat=55, llcrnrlon=-135, urcrnrlon=-60, resolution='h')
m.drawcoastlines()
m.drawcountries(linewidth=2)
m.drawstates()
m.fillcontinents(color='coral', lake_color='aqua')
m.drawmapboundary(fill_color='aqua')
m.drawmeridians(np.arange(-130, -65, 10), labels=[1,0,0,1], textcolor='black')
m.drawparallels(np.arange(20, 60, 5), labels=[1,0,0,1], textcolor='black')

''' Now add the NOTAMS to the map '''

notam_data = dict_of_filtered_notams['final_notam_list']

for line in notam_data:
    notam_lat = float(line.split()[0])
    notam_lon = float(line.split()[1])
    coords = convert_coords(notam_lon, notam_lat)
    notam_lon, notam_lat = coords[0], coords[1]
    FL400_radius = np.radians(float(line.split()[2]))
    x,y = m(notam_lon, notam_lat)
    print("notam_lon = ",notam_lon, "notam_lat = ", notam_lat,"\n")
    print("x,y values = ",'%.3f'%x,",",'%.3f'%y,"\n")
    print("FL400_radius = ",('% 3.2f' % FL400_radius))
    print("")
    cir = plt.Circle((x,y), FL400_radius, color="white", fill=False)
    ax.add_patch(cir)

(Функция convert_coords просто форматирует значения notam_lon / notam_lat в пригодный для использования формат, как показано в данных ниже.)

Вот как выглядят мои данные (вы можете увидеть, где они печатаются в приведенном выше коде):

notam_lon = -117.7839 notam_lat = 39.6431

x, y значения = 1914342,075, 2398770,441

FL400_radius = 6,98

Вот изображение того, что мой код дает выше: My map projection

Я также попытался использовать функцию map.plot () (в частности, m.plot (x, y, "o")) вместо "ax.add_patch (cir)".Это сработало, но наметил точки или «о», конечно.Вот изображение, полученное путем замены "ax.add_patch (cir)" на "m.plot (x, y," o ")."
Plot using map.plot() function in place of ax.add_patch()

И какпоследнее замечание, я использую базовую карту 1.2.0-1 и matplotlib 3.0.3.Я не нашел никаких признаков того, что эти версии несовместимы.Кроме того, эта неспособность построить круг не была проблемой 2 месяца назад, когда я делал это в последний раз.Я в недоумении здесь.Я ценю любые отзывы.Спасибо.

1 Ответ

0 голосов
/ 05 марта 2019

Чтобы нарисовать круги на карте, вам нужны соответствующие местоположения (x, y) и радиус.Вот рабочий код и результирующий график.

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np

# make up 10 data points for location of circles
notam_lon = np.linspace(-117.7839, -100, 10)
notam_lat = np.linspace(39.6431, 52, 10)

# original radius of circle is too small
FL400_radius = 6.98   # what unit?

fig = plt.figure(figsize=(8,6))
ax = fig.add_subplot(111)
m = Basemap(projection='mill', llcrnrlat=20, urcrnrlat=55, llcrnrlon=-135, urcrnrlon=-60, resolution='l')

# radiusm = (m.ymax-m.ymin)/10. is good for check plot
radiusm = FL400_radius*10000  # meters, you adjust as needed here

for xi,yi in zip(notam_lon, notam_lat):
    # xy=m(xi,yi): conversion (long,lat) to (x,y) on map
    circle1 = plt.Circle(xy=m(xi,yi), radius=radiusm, \
                         edgecolor="blue", facecolor="yellow", zorder=10)
    #ax.add_patch(circle1)  # deprecated
    ax.add_artist(circle1)  # use this instead

m.drawcoastlines()
m.drawcountries(linewidth=2)
m.drawstates()
m.fillcontinents(color='coral', lake_color='aqua')

# m.drawmapboundary(fill_color='aqua') <-- causes deprecation warnings
# use this instead:
rect = plt.Rectangle((m.xmin,m.ymin), m.xmax-m.xmin, m.ymax-m.ymin, facecolor="aqua", zorder=-10)
ax.add_artist(rect)

m.drawmeridians(np.arange(-130, -65, 10), labels=[1,0,0,1], textcolor='black')
m.drawparallels(np.arange(20, 60, 5), labels=[1,0,0,1], textcolor='black')

plt.show()

Карта вывода:

enter image description here

Надеюсь, это полезно.

...