Северополярная стереографическая проекция не работает

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

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()

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

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

Карта с ограничениями


person Phil    schedule 04.03.2019    source источник


Ответы (1)


Использование азимутального типа картографической проекции всегда требует набора правильных параметров для получения хорошего результата. В этом случае стереографическая проекция с центром на северном полюсе, ее правильные параметры не те, которые вы обычно используете при реализации с часто используемой проекцией 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):

введите здесь описание изображения

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

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):

введите здесь описание изображения

Указав правильные значения 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):

карта3

person swatchai    schedule 05.03.2019
comment
Спасибо - это действительно полезно. Если бы мне нужна была только левая сторона этой карты, как бы я ее построил? Аргументы urcrnrlon и т. д. в данном случае не работают. - person Phil; 06.03.2019
comment
Спасибо @swatchai - но как мне воспроизвести карту (которая не только имеет другую центральную точку, но и повернута?) Карта прикреплена в конце моего исходного сообщения. - person Phil; 08.03.2019
comment
@Phil: Лучший способ сказать спасибо - нажать кнопку accept в моем ответе. :) - person swatchai; 13.03.2019