在 cartopy 墨卡托投影上绘制一个圆
Plot a circle on a cartopy mercator projection
对于一个项目,我需要创建一个可视化效果,在地图上的某些位置周围绘制一个圆圈。可视化使用 Cartopy v.0.18.0 渲染地图。它使用 GoogleTiles
class 获取并显示相关区域中的图块,并使用 add_patch(Patch.Circle(..., transform=ccrs.PlateCarree()))
方法绘制圆。
tiles = GoogleTiles()
fig = plt.figure(figsize=(15,15))
ax = fig.add_subplot(1, 1, 1, projection=tiles.crs)
ax.set_extent((-121.8,-122.55,37.25,37.85))
ax.add_image(tiles, 11)
ax.add_patch(Patch.Circle(xy=[-122.4015173428571, 37.78774634285715], radius = 0.021709041989311614 + 0.005, alpha=0.3, zorder=30, transform=ccrs.PlateCarree()))
plt.show()
然而,尽管我尝试了几个变换对象,但我得到的不是圆而是椭圆(例如使用 ccrs.PlateCarree()
)或者根本没有圆(例如使用 ccrs.Mercator()
)。
我在网上找到了几种不同的解决方案(例如 ),但是,这些不是墨卡托投影的解决方案,遗憾的是我缺乏 projection/transformation 知识来适应我的问题。
我能够制作圆形补丁的唯一方法是将 fig.add_subplot
上的 projection
参数设置为 ccrs.PlateCarree()
。然而,这会扭曲地图并且标签变得模糊,所以遗憾的是这不是一个可接受的解决方案。
项目即将到期,如能尽快回复,我们将不胜感激。
感谢@swatchai,这是缺少的提示,所以对于那些感兴趣的人来说,代码现在看起来像这样,而且它确实有效!万岁!
tiles = GoogleTiles()
fig = plt.figure(figsize=(15,15))
ax = fig.add_subplot(1, 1, 1, projection=tiles.crs)
ax.set_extent((-121.8,-122.55,37.25,37.85))
ax.add_image(tiles, 11)
# The diameter is in degrees in EPSG:4326 coordinates therefore, the degrees have
# to be converted to km. At 37N the degree latitude is 11.0977 km.
ax.tissot(rad_km=(0.021709041989311614 + 0.005) * 11.0977, lons=[-122.4015], lats=[37.7877], alpha=0.3)
plt.show()
执行上述代码时会抛出以下警告,但它对结果有明显影响:
/opt/conda/lib/python3.8/site-packages/cartopy/mpl/geoaxes.py:761: UserWarning: Approximating coordinate system <cartopy._crs.Geodetic object at 0x7fa4c7529770> with the PlateCarree projection.
warnings.warn('Approximating coordinate system {!r} with the '
再次感谢@swatchai,你拯救了我!
对于一个项目,我需要创建一个可视化效果,在地图上的某些位置周围绘制一个圆圈。可视化使用 Cartopy v.0.18.0 渲染地图。它使用 GoogleTiles
class 获取并显示相关区域中的图块,并使用 add_patch(Patch.Circle(..., transform=ccrs.PlateCarree()))
方法绘制圆。
tiles = GoogleTiles()
fig = plt.figure(figsize=(15,15))
ax = fig.add_subplot(1, 1, 1, projection=tiles.crs)
ax.set_extent((-121.8,-122.55,37.25,37.85))
ax.add_image(tiles, 11)
ax.add_patch(Patch.Circle(xy=[-122.4015173428571, 37.78774634285715], radius = 0.021709041989311614 + 0.005, alpha=0.3, zorder=30, transform=ccrs.PlateCarree()))
plt.show()
然而,尽管我尝试了几个变换对象,但我得到的不是圆而是椭圆(例如使用 ccrs.PlateCarree()
)或者根本没有圆(例如使用 ccrs.Mercator()
)。
我在网上找到了几种不同的解决方案(例如
我能够制作圆形补丁的唯一方法是将 fig.add_subplot
上的 projection
参数设置为 ccrs.PlateCarree()
。然而,这会扭曲地图并且标签变得模糊,所以遗憾的是这不是一个可接受的解决方案。
项目即将到期,如能尽快回复,我们将不胜感激。
感谢@swatchai,这是缺少的提示,所以对于那些感兴趣的人来说,代码现在看起来像这样,而且它确实有效!万岁!
tiles = GoogleTiles()
fig = plt.figure(figsize=(15,15))
ax = fig.add_subplot(1, 1, 1, projection=tiles.crs)
ax.set_extent((-121.8,-122.55,37.25,37.85))
ax.add_image(tiles, 11)
# The diameter is in degrees in EPSG:4326 coordinates therefore, the degrees have
# to be converted to km. At 37N the degree latitude is 11.0977 km.
ax.tissot(rad_km=(0.021709041989311614 + 0.005) * 11.0977, lons=[-122.4015], lats=[37.7877], alpha=0.3)
plt.show()
执行上述代码时会抛出以下警告,但它对结果有明显影响:
/opt/conda/lib/python3.8/site-packages/cartopy/mpl/geoaxes.py:761: UserWarning: Approximating coordinate system <cartopy._crs.Geodetic object at 0x7fa4c7529770> with the PlateCarree projection.
warnings.warn('Approximating coordinate system {!r} with the '
再次感谢@swatchai,你拯救了我!