在 cartopy 墨卡托投影上绘制一个圆圈

问题描述

对于一个项目,我需要创建一个可视化效果,在地图上的某些位置周围绘制一个圆圈。可视化使用 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,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),但是,这些不适用于墨卡托投影,遗憾的是我缺乏投影/转换知识来使它们适应我的问题。

Circle on Mercator projection

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

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

解决方法

谢谢@swatchai 这是缺少的提示,所以对于那些有兴趣的人来说,代码现在看起来像这样,它确实有效!万岁!

tiles = GoogleTiles()
fig = plt.figure(figsize=(15,15))
ax = fig.add_subplot(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 '

Circle on Mercator map

再次感谢@swatchai,你救了我的一天!

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...