我想要使用Cartopy显示一些卫星图像数据。我已经成功地遵循了详细here的图像示例。导致此代码:
import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
fig = plt.figure(figsize=(12, 12))
img_extent = (-77, -59, 9, 26)
ax = plt.axes(projection=ccrs.PlateCarree())
# image data coming from server, code not shown
ax.imshow(img, origin='upper', extent=img_extent)
ax.set_xmargin(0.05)
ax.set_ymargin(0.10)
# mark a known place to help us geo-locate ourselves
ax.plot(-117.1625, 32.715, 'bo', markersize=7)
ax.text(-117, 33, 'San Diego')
ax.coastlines()
ax.gridlines()
plt.show()
此代码生成以下图像
我的问题是卫星图像数据不在PlateCarree投影中,而是墨卡托投影。
但是当我用
获取轴对象时ax = plt.axes(projection=ccrs.Mercator())
我失去了海岸线。
我看到了here报告的问题。但
ax.set_global()
生成此图片:
数据不存在,圣地亚哥位置错误。纬度/经度范围也发生了变化。我做错了什么?
发布讨论更新
主要问题是我没有使用transform_points
方法在目标投影中正确指定图像范围。我还必须具体了解菲尔建议的imshow
方法中的坐标参照系。这是正确的代码:
import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
proj = ccrs.Mercator()
fig = plt.figure(figsize=(12, 12))
extents = proj.transform_points(ccrs.Geodetic(),
np.array([-77, -59]),
np.array([9, 26]))
img_extents = (extents[0][0], extents[1][0], extents[0][6], extents[1][7] )
ax = plt.axes(projection=proj)
# image data coming from server, code not shown
ax.imshow(img, origin='upper', extent=img_extents,transform=proj)
ax.set_xmargin(0.05)
ax.set_ymargin(0.10)
# mark a known place to help us geo-locate ourselves
ax.plot(-117.1625, 32.715, 'bo', markersize=7, transform=ccrs.Geodetic())
ax.text(-117, 33, 'San Diego', transform=ccrs.Geodetic())
ax.coastlines()
ax.gridlines()
plt.show()
导致这个正确地理投影的卫星图像:
答案 0 :(得分:4)
理想情况下,在使用cartopy绘图时(通过transform关键字),尽量始终具体说明数据所在的坐标参照系。这意味着您只需在脚本中切换投影,数据就会自动放在正确的位置。
因此,在您的情况下,plt.imshow
应该有一个transform=ccrs.Mercator()
关键字参数(您可能需要一个更具体的参数化Mercator实例)。如果您的范围是大地测量(拉特和长子),则必须将边界框转换为墨卡托坐标,但除此之外,其他所有区域都应按预期工作。
注意:我将去更新example以包含转换参数;-)(PR:https://github.com/SciTools/cartopy/pull/343)
HTH