编程语言
首页 > 编程语言> > python-Matplotlib:使用speste投影专注于特定的lon / lat

python-Matplotlib:使用speste投影专注于特定的lon / lat

作者:互联网

我正在尝试使用Python中matplotlib包中的“ spstere”投影将地图聚焦于南极洲的特定区域.我可以绘制整个南极洲的地图,但是这次我想“放大”并仔细查看该大陆的特定区域.

使用其他投影(Pyplot contour plot – clabel spacing; http://matplotlib.org/basemap/api/basemap_api.html; https://matplotlib.org/basemap/users/examples.html)的类似示例可以在网上获得,但我无法将其应用于南极上的“ speste”投影.

我基本上想将地图重点放在南极半岛地区,该地区大致

llcrnrlon = -100,urcrnrlon = -30,llcrnrlat = -90,urcrnrlat = -55.0

我试图将此代码与“ spstere”项目一起使用,但python仅考虑boundinglat和lon_0.我尝试过更改boundinglat和lon_0的值,但是它也不起作用.

知道我该怎么做吗?我也尝试过使用其他投影,例如’cyl’,但没有得到像’spstere’proj这样的漂亮正方形,而是得到了一个水平矩形.

m = Basemap(projection='cyl',lon_0=0,lat_0=0,\
      llcrnrlon=-180,urcrnrlon=180,llcrnrlat=-90,urcrnrlat=-55.0,resolution='c')

任何帮助将不胜感激!

解决方法:

使用Polar Stereographic Projection投影“ 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()

enter image description here

请注意,“ spstere”始终位于南极的中心.
为了获得不以南极为中心的地图,您需要使用“立体”投影.设置“立体”投影的角不会向前.

因此,可以在“ 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()

enter image description here

使用这些点(-150,-70,-30,-55)作为地图的拐角,然后可以使用“立体”投影来绘制地图.

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)

enter image description here

如果不希望使用这种启发式方法,则可以通过在“ spstere”投影中创建虚拟贴图来自动执行此过程,并根据相关矩形计算坐标(llcrnrlon = -100,urcrnrlon = -30,llcrnrlat = -90,urcrnrlat = -55.0),并使用它们在立体投影中创建新的底图.以下功能取自ActiveState site(作者PG).

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

enter image description here

标签:projection,matplotlib,coordinates,python
来源: https://codeday.me/bug/20191111/2017666.html