【问题标题】:Moving from basemap to cartopy从底图转移到 cartopy
【发布时间】:2020-01-20 07:42:30
【问题描述】:

我正在尝试从 python2 中的 Basemap 移动到 python3 中的 cartopy。但是,我发现很难将一些 Basemap 代码块转换为 cartopy:

底图(python2.7)

from mpl_toolkits.basemap import Basemap
bmap = Basemap(projection='merc', resolution='c', llcrnrlon=-125, llcrnrlat=26, urcrnrlon=-56, urcrnrlat=46)

print bmap.makegrid(4, 4)[0]
[[-125. -102.  -79.  -56.]
 [-125. -102.  -79.  -56.]
 [-125. -102.  -79.  -56.]
 [-125. -102.  -79.  -56.]]

print bmap.makegrid(4, 4)[1]
[[26.         26.         26.         26.        ]
 [33.23223798 33.23223798 33.23223798 33.23223798]
 [39.91267019 39.91267019 39.91267019 39.91267019]
 [46.00000132 46.00000132 46.00000132 46.00000132]]

cartopy (python 3.7)

import cartopy.crs as ccrs
mrc = ccrs.Mercator()
lons = np.array([-125, -56])
lats = np.array([26, 46])
width = 4
height = 4
projected_corners = mrc.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)
print(xs)
[-14248894.82153902  -6567849.95680314]
print(ys)
[2736034.98592771 6413524.59416364]

注意:我正在尝试按照here 中提到的步骤使用墨卡托投影来获得类似于 makegrid 的行为,但结果与上面看到的 Basemap 不匹配。

【问题讨论】:

  • 请显示您的所有代码。我怀疑你错过了一些重要的步骤。
  • 我正在寻找单个块的 cartopy 等价物。分开声明以明确这一点。谢谢。
  • 请详细说明`结果与底图不匹配`。显示您获得的结果以及您的期望。
  • 在您的示例中,BM 在地理坐标中制作网格,CP 将一组地理坐标投影到制图参考系统中。每个库都按照指示执行。
  • 如果我了解 Basemap 文档,bmap.makegrid(4, 4, returnxy = True) (也)做了 Cartopy 所做的事情,反之,我会说必须转换回地理坐标,这是看的问题进入 Cartopy 的文档...

标签: python-3.x projection matplotlib-basemap cartopy


【解决方案1】:

如果在相同的基础(坐标系)上进行比较,结果非常一致。这是可运行的代码和结果:

import numpy as np
import cartopy.crs as ccrs
import matplotlib.pyplot as plt

mrc = ccrs.Mercator()
lons = np.array([-125, -56])
lats = np.array([26, 46])
width = 4
height = 4
projected_corners = mrc.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)
x2d, y2d = np.meshgrid(xs, ys)

ax = plt.axes(projection = mrc)
ax.coastlines()
ax.scatter(x2d, y2d)
ax.gridlines(draw_labels=True)

plt.show()

输出图:

以及网格点坐标(经纬度)的计算:

platecarr = ccrs.PlateCarree()
lon_lat_list = platecarr.transform_points(ccrs.Mercator(), xs, ys)
print(lon_lat_list)

[[-125.           26.            0.        ]
 [-102.           33.23738591    0.        ]
 [ -79.           39.91736844    0.        ]
 [ -56.           46.            0.        ]]

【讨论】:

  • 感谢您的帮助。
猜你喜欢
  • 2019-05-21
  • 2018-12-21
  • 1970-01-01
  • 2017-06-19
  • 2019-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-26
相关资源
最近更新 更多