gpt4 book ai didi

python - Matplotlib:使用 spstere 投影专注于特定的经/纬度

转载 作者:太空宇宙 更新时间:2023-11-03 15:53:10 25 4
gpt4 key购买 nike

我正在尝试使用 Python 中 matplotlib 包中的“spstere”投影将我的 map 聚焦在南极洲的特定区域。我能够绘制整个南极洲,但这次我想“放大”并仔细观察大陆的特定区域。

使用其他投影(Pyplot contour plot - clabel spacinghttp://matplotlib.org/basemap/api/basemap_api.htmlhttps://matplotlib.org/basemap/users/examples.html)的类似示例可在线获取,但我无法将它们应用于南极洲上空的“spstere”投影。

我基本上想将我的 map 集中在南极半岛区域,该区域大致跨越

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

非常感谢任何帮助!

最佳答案

使用极地赤平投影 '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'始终以南极为中心。
为了获得不以南极为中心的 map ,您需要使用 "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()

enter image description here

使用这些点,(-150,-70, -30,-55) ,作为 map 的角,然后您可以使用 'stere' 绘制 map 投影。

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' 中创建虚拟 map 来自动执行此过程。投影,从有问题的矩形 (llcrnrlon=-100,urcrnrlon=-30,llcrnrlat=-90,urcrnrlat=-55.0) 计算坐标,并在 stere 中创建一个新 basemap 投影与他们。下面的函数取自 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

关于python - Matplotlib:使用 spstere 投影专注于特定的经/纬度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45302485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com