You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Cartopy投影中绘制过指定点的圆的半径

在Cartopy投影中绘制指定半径的大地圆

原代码问题分析

  1. 存在语法错误:多余的linestyle="--")行,直接导致代码无法运行
  2. 使用ShapelyFeature添加多边形的方式略显繁琐,可改用更直接的方法

修正后的完整代码

import matplotlib.pyplot as plt
import cartopy.crs as ccrs
from cartopy.geodesic import Geodesic
from shapely.geometry import Polygon

fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(1, 1, 1, projection=ccrs.Mercator())

ax.set_extent([18, 28, 59.5, 64.1], crs=ccrs.PlateCarree())
ax.coastlines(linewidth=.5)

# 雷达参数:经纬度、半径(公里转米)
lon_ika = 23.076
lat_ika = 61.76
radius_km = 250
radius_m = radius_km * 1000
n_samples = 80

# 生成基于大地线的圆多边形
circle_poly = Polygon(Geodesic().circle(lon_ika, lat_ika, radius_m, n_samples=n_samples))

# 将圆添加到地图,指定几何图形的地理坐标系
ax.add_geometries([circle_poly], crs=ccrs.PlateCarree(), facecolor='none', edgecolor='black', linewidth=1, linestyle='-')

# 标记雷达站点
ax.plot(lon_ika, lat_ika, "o", c='r', transform=ccrs.PlateCarree(), markersize=6, label="Ikaalinen")

# 标记IOP位置
lon_hyy = 24.3
lat_hyy = 61.83
ax.plot(lon_hyy, lat_hyy, "x", c='r', transform=ccrs.PlateCarree(), markersize=6, label="Hyytiälä")

# 添加图例
plt.legend(loc='upper left', fontsize=12, framealpha=1, edgecolor='black')

plt.show()

关键说明

  • Geodesic().circle生成的是球面等距圆(大地圆),在Mercator投影下会呈现为椭圆,这是高纬度地区投影拉伸的正常现象,符合实际球面距离的分布
  • 若需要绘制视觉上的正圆(非球面等距),可通过极坐标转换生成点后再绘制,但这种圆在球面上的实际距离并不均等,需根据需求选择
  • 所有地理坐标点的绘制都需指定transform=ccrs.PlateCarree(),确保经纬度正确转换到当前的Mercator投影

内容的提问来源于stack exchange,提问作者Louschmuh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 02:46:17