Северная полярная стереографическая проекция не работает - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь создать стереографический график, используя смещение базовой карты от северного полюса, но направления запад-восток явно поменялись местами.Это ошибка в моей реализации или ошибка?

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

m = Basemap(projection='stere',
        lat_0=90, lon_0=270,  lat_ts=(90.+35.)/2.,
        llcrnrlon=150,urcrnrlon=-60,llcrnrlat=50,urcrnrlat=50)

m.drawmeridians(np.arange(0,360,30),labels=[1,1,1,0])
m.drawparallels(np.arange(-90,90,5))
m.drawcoastlines()
m.shadedrelief()
plt.show()

Вот результат: результат из скрипта

Как я могу воспроизвести следующую карту (котораясмещено по центру и повернуто?)

Карта ограниченного доступа

1 Ответ

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

Использование азимутальной проекции карты всегда требует набора правильных параметров для получения хорошего результата.В этом случае стереографическая проекция центрирована на северном полюсе, ее правильные параметры не соответствуют тем, которые вы обычно используете при использовании с проекцией PlateCaree, которая часто используется.Вот рабочий код, который вы можете попробовать.

# Stereographic projection coverage
#   should be specified less than half of a hemisphere

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

m = Basemap(projection='stere', resolution='c',
        lat_0=90, lon_0=270,  lat_ts=(90.+35.)/2., width=15000000, height=10000000)
# (width, height) is the plot extents in meters

m.drawmeridians(np.arange(0, 360, 30), labels=[1,1,1,0])
m.drawparallels(np.arange(0, 90, 10), labels=[0,0,0,1])
m.drawcoastlines()
m.shadedrelief()
plt.show()

Полученный график (карта 1):

enter image description here

Получитьдругая часть мира в область построения достигается путем повторного центрирования карты.

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

# projection center point
lon0 = 180
lat0 = 60

m = Basemap(projection='stere', resolution='c',
        lat_0=lat0, lon_0=lon0,  lat_ts=lat0, width=15000000, height=10000000)

m.drawmeridians(np.arange(0, 360, 30), labels=[1,0,0,1])  # left, right, top, bottom
m.drawparallels(np.arange(0, 90, 10), labels=[0,1,1,0])
m.drawcoastlines()
m.shadedrelief()
plt.show()

Выходной график (карта 2):

enter image description here

Указав правильные значения llcrnrlon, urcrnrlon, llcrnrlat, urcrnrlat, в Basemap() можно получить экстенты карты по мере необходимости.Вот еще один пример графика, запрошенного ОП.

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

fig = plt.figure(figsize=(8,8))
m = Basemap(projection='stere', resolution='c',
        lat_0=90, lon_0=-90,  lat_ts=(90.+35.)/2.,
        llcrnrlon=-142, urcrnrlon=78, llcrnrlat=19, urcrnrlat=45)

m.drawmeridians(np.arange(0, 360, 30), labels=[1,0,1,0])  # left, right, top, bottom
m.drawparallels(np.arange(0, 90, 10), labels=[0,1,0,1])
m.drawcoastlines()
m.shadedrelief()
plt.show()

Результирующий график (карта 3):

map3

...