繁体   English   中英

Plot 圆形墨卡托投影

[英]Plot a circle on a cartopy mercator projection

对于一个项目,我需要创建一个可视化,在 map 上的某些位置周围绘制一个圆圈。 可视化使用Cartopy v.0.18.0渲染 map。 它使用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() )。

我在网上找到了几种不同的解决方案(例如,在正交投影中使用 cartopy 绘制圆),但是,这些不适用于墨卡托投影,遗憾的是我缺乏投影/转换知识来适应我的问题。

墨卡托投影上的圆圈

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM