Python Matplotlib:使用spstere投影关注特定的lon/lat
我正试图使用Python中matplotlib包中的“spstere”投影,将我的地图集中在南极洲的一个特定区域。我能画出整个南极洲,但这次我想“放大”并更仔细地观察该大陆的一个特定区域 网上有使用其他投影(;)的类似例子,但我无法将这些应用于南极洲上空的“spstere”投影 我基本上想把我的地图集中在南极半岛的区域,该区域大致从Python Matplotlib:使用spstere投影关注特定的lon/lat,python,matplotlib,coordinates,projection,Python,Matplotlib,Coordinates,Projection,我正试图使用Python中matplotlib包中的“spstere”投影,将我的地图集中在南极洲的一个特定区域。我能画出整个南极洲,但这次我想“放大”并更仔细地观察该大陆的一个特定区域 网上有使用其他投影(;)的类似例子,但我无法将这些应用于南极洲上空的“spstere”投影 我基本上想把我的地图集中在南极半岛的区域,该区域大致从 llcrnrlon=-100,urcrnlon=-30,llcrnrlat=-90,urcrnlat=-55.0 我曾尝试将此代码与“spstere”proj一起使
llcrnrlon=-100,urcrnlon=-30,llcrnrlat=-90,urcrnlat=-55.0
我曾尝试将此代码与“spstere”proj一起使用,但python只考虑了boundinglat和lon_0。我试图更改boundinglat和lon_0的值,但也不起作用
你知道我该怎么做吗?我也尝试过使用其他投影,比如“cyl”,但是我没有得到像“spstere”项目那样漂亮的正方形,而是得到了一个水平矩形
m = Basemap(projection='cyl',lon_0=0,lat_0=0,\
llcrnrlon=-180,urcrnrlon=180,llcrnrlat=-90,urcrnrlat=-55.0,resolution='c')
任何帮助都将不胜感激 使用极赤平投影
'spstere'
,您可以使用例如boundinglat=-60
获得南极地区:
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
m = Basemap(projection='spstere',boundinglat=-60,lon_0=180,resolution='c')
m.drawcoastlines()
plt.show()
请注意,'spstere'
始终以南极为中心。为了得到一张不以南极为中心的地图,您需要使用
的“stere”
投影。为“stere”
投影设置角点不是向前倾斜的
因此,人们可以在'spstere'
投影中使用一个图,并找到一些可以包围感兴趣区域的点。在这种情况下,例如
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
m = Basemap(projection='spstere',boundinglat=-50,
lon_0=180+(-100+-30)/2.,resolution='c')
m.drawmeridians(np.arange(0,360,30),labels=[1,1,1,0])
m.drawparallels(np.arange(-90,90,5))
m.drawcoastlines()
xll, yll = m(-150,-70) # <-- find those points by looking at meridians and parallels
xur, yur = m(-30,-55)
m.scatter([xll,xur], [yll, yur], c="crimson")
plt.show()
如果不需要这种启发式方法,您可以通过在'spstere'
投影中创建一个虚拟地图,从所讨论的矩形中计算坐标(llcrnrlon=-100,urcrnlon=-30,llcrnrlat=-90,urcrnlat=-55.0
),并在stere
投影中使用它们创建一个新的基础地图,来自动化此过程。下面的函数取自作者(PG)
太棒了。正是我需要的。谢谢你的详细回答!回答得很好,很有帮助!
m = Basemap(projection='stere',resolution='c',
lat_0=-90, lon_0=(-100+-30)/2., lat_ts=(-90.+-55.)/2.,
llcrnrlon=-150,urcrnrlon=-30,llcrnrlat=-70,urcrnrlat=-55)
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
def polar_stere(lon_w, lon_e, lat_s, lat_n, **kwargs):
'''Returns a Basemap object (NPS/SPS) focused in a region.
lon_w, lon_e, lat_s, lat_n -- Graphic limits in geographical coordinates.
W and S directions are negative.
**kwargs -- Aditional arguments for Basemap object.
'''
lon_0 = lon_w + (lon_e - lon_w) / 2.
ref = lat_s if abs(lat_s) > abs(lat_n) else lat_n
lat_0 = np.copysign(90., ref)
proj = 'npstere' if lat_0 > 0 else 'spstere'
prj = Basemap(projection=proj, lon_0=lon_0, lat_0=lat_0,
boundinglat=0, resolution='c')
lons = [lon_w, lon_e, lon_w, lon_e, lon_0, lon_0]
lats = [lat_s, lat_s, lat_n, lat_n, lat_s, lat_n]
x, y = prj(lons, lats)
ll_lon, ll_lat = prj(min(x), min(y), inverse=True)
ur_lon, ur_lat = prj(max(x), max(y), inverse=True)
return Basemap(projection='stere', lat_0=lat_0, lon_0=lon_0,
llcrnrlon=ll_lon, llcrnrlat=ll_lat,
urcrnrlon=ur_lon, urcrnrlat=ur_lat, **kwargs)
llcrnrlon=-100
urcrnrlon=-30
llcrnrlat=-90
urcrnrlat=-55.0
m = polar_stere(llcrnrlon, urcrnrlon, llcrnrlat, urcrnrlat)
m.drawmeridians(np.arange(0,360,30),labels=[1,1,1,0])
m.drawparallels(np.arange(-90,90,30),labels=[1,1,1,1])
m.drawcoastlines()
plt.show()