Python 在卡通墨卡托投影上绘制一个圆

Python 在卡通墨卡托投影上绘制一个圆,python,matplotlib,visualization,geospatial,cartopy,Python,Matplotlib,Visualization,Geospatial,Cartopy,对于一个项目,我需要创建一个可视化,在地图上的一些位置周围画一个圆圈。用于渲染地图的可视化。它使用GoogleTiles类获取并显示相关区域中的tile,并使用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) a

对于一个项目,我需要创建一个可视化,在地图上的一些位置周围画一个圆圈。用于渲染地图的可视化。它使用
GoogleTiles
类获取并显示相关区域中的tile,并使用
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_sublot
上设置
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 '
/opt/conda/lib/python3.8/site packages/cartopy/mpl/geoaxes.py:761:UserWarning:使用PlateCarree投影近似坐标系。
warning.warn('


所以再次感谢@swatchai你救了我一天!

使用“谢谢”中详细介绍的缩放翻译,可以尝试一下,但我认为这不是一个非常优雅的解决方案,因为转换的值必须根据我目前看到的经验来确定。你知道这些必要的x和y缩放值是否可以从s中获得omewhere?纬度方向/逻辑方向上一度的长度差异并不能解释圆的扭曲。@Jody Klymak遗憾地不适用于cartopy,或者更确切地说,我没有让它工作。也许天梭的指示器更好,试试ax.tissot(rad_km=15,lons=[-122.4015],lats=[37.7877])。它将是墨卡托投影上的一个圆。