在Cartopy中的makegrid等效方法,从Basemap迁移到Cartopy

3

我已经在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进行绘图。

非常感谢您的帮助...


使用 numpy.meshgrid(),让你快乐。 - swatchai
1个回答

4
makegrid文档指出,它返回的纬度和经度在投影坐标系统中等间距。我想你大多数情况下会使用它将投影数据放在任何地图上,让basemap给你提供纬度/经度位置信息。Cartopy的操作方式则完全不同,因为你可以在本机坐标系统中指定坐标的坐标系。

因此,如果您知道数据在(Lambert Conformal Conic)中的坐标,则可以将其传递给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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接