所以,多年来我一直在 Python 2.7 中使用 Basemap,我正在转向 Python3.7 并且想转向 cartopy。我处理大量数据,其中我有投影信息,但我没有数据的纬度和经度网格。这就是我在 Basemap 中处理事情的方式。
m=Basemap(
llcrnrlon=-118.300,
llcrnrlat=20.600,
urcrnrlon=-58.958,
urcrnrlat=51.02,
projection='lcc',
lat_1=38.,
lat_2=38.,
lon_0=-95.,
resolution ='l',
area_thresh=1000.
)
mwidth = 1008 #for 163 5km AWIPS2 grid
mheight = 722 #for 163 5km AWIPS2 grid
所以我在 basemap 中设置了引用网格“m”... 然后绘制数据......我用这个:
lons,lats=m.makegrid(mwidth,mheight)
x,y=m(lons,lats)
然后我可以像这样使用 contourf 或 pcolormesh:
m.contourf(x,y,data)
我基本上是在寻找 cartopy、pyproj 或 osgeo 中的等效项。我想传递带有网格大小的投影信息并获取纬度/经度,以便我可以使用 cartopy 进行绘图。
感谢任何帮助...
最佳答案
makegrid docs声明它返回在投影坐标系中等距分布的纬度和经度。我想您主要使用它通过让 basemap 为您提供纬度/经度位置来将投影数据放到任何 map 上。 Cartopy 以完全不同的方式运行,因为您完全可以在 native 坐标系中指定坐标系。
因此,如果您知道数据在 lcc
(Lambert Conformal Conic)中的坐标,那么您可以将这些坐标传递给 cartopy,cartopy 会根据需要为您重新投影:
xs = np.linspace(llc_x0, llc_x1, n_xs),
ys = np.linspace(llc_y0, llc_y1, n_ys),
plt.contourf(xs, ys, data, transform=ccrs.LambertConformalConic())
实际上,您实际上不需要讨论经度/纬度才能绘制数据。
在极少数情况下,即使数据投影在另一个空间中,您也只知道纬度/经度。 Cartopy 处理这个问题:
plt.contourf(lons, lats, data, transform=ccrs.PlateCarree())
最后,如果您在投影空间中有一个边界框,但边界框角在经/纬度中,那么您可以简单地变换角然后使用 linspace。以下(未经测试的)代码应该可以解决问题:
import cartopy.crs as ccrs
import numpy as np
llc = ccrs.LambertConformal()
width = 20
height = 25
llcrnrlon=-118.300
llcrnrlat=20.600
urcrnrlon=-58.958
urcrnrlat=51.02
lons = np.array([llcrnrlon, urcrnrlon])
lats = np.array([llcrnrlat, urcrnrlat])
projected_corners = llc.transform_points(
ccrs.PlateCarree(), lons, lats)
xs = np.linspace(
projected_corners[0, 0], projected_corners[1, 0], width)
ys = np.linspace(
projected_corners[0, 1], projected_corners[1, 1], height)
关于python-3.x - makegrid 在 cartopy 中等效,从 basemap 移动到 cartopy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53873435/