【问题标题】:Plot a circle on a cartopy mercator projection在 cartopy 墨卡托投影上画一个圆
【发布时间】:2021-02-27 15:24:29
【问题描述】:

对于一个项目,我需要创建一个可视化,在地图上的某些位置周围画一个圆圈。可视化使用Cartopy v.0.18.0 来渲染地图。它使用GoogleTiles 类获取并显示相关区域中的图块,并使用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())。

我在网上找到了几种不同的解决方案(例如Drawing Circles with cartopy in orthographic projection),但是这些不适用于墨卡托投影,我很遗憾缺乏投影/转换知识来适应我的问题。

我能够生成圆形补丁的唯一方法是将fig.add_subplot 上的projection 参数设置为ccrs.PlateCarree()。然而,这会扭曲地图并且标签会变得模糊,因此很遗憾,这不是一个可接受的解决方案。

由于项目即将到期,我们将不胜感激。

【问题讨论】:

  • 使用 ScaledTranslation,详见matplotlib.org/stable/tutorials/advanced/…
  • 谢谢,试试这个,但我认为这不是一个非常优雅的解决方案,因为转换的值必须根据我目前看到的经验来确定。你知道这些必要的 x 和 y 缩放值是否可以从某个地方获得吗?纬度/经度方向的长度差异不计入圆的变形。
  • @Jody Klymak 遗憾地不适用于 cartopy - 或者更好地说我没有让它工作。
  • 也许tissot's indicatrix 更好,试试ax.tissot(rad_km=15, lons=[-122.4015], lats=[37.7877])。这将是墨卡托投影上的一个圆圈。

标签: python matplotlib visualization geospatial cartopy


【解决方案1】:

感谢@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,你拯救了我的一天!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    相关资源
    最近更新 更多