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

Cartopy绘制大地线出现弯折问题:如何正确渲染大圆线段?

正射投影下Cartopy绘制大圆线出现弯折的原因及解决方法

问题描述

我尝试在地球表面绘制一条“直线”(大圆线),在非正对该曲线的正射投影(Orthographic)中它应呈现为曲线。但使用Cartopy的Geodetic变换连接两点时,线条出现弯折。请问该弯折的成因是什么?如何正确渲染大圆线段?

原测试代码

import matplotlib.pyplot as plt
import cartopy.crs as ccrs

lats = [0, 36]
lons = [15, 76]
ax = plt.axes(projection = ccrs.Orthographic(central_longitude=0, central_latitude=45))
ax.plot(lons, lats, transform=ccrs.Geodetic())
ax.set_global()
ax.gridlines()

异常效果示意图

弯折的大圆线

弯折成因

这个弯折的核心原因是Cartopy的Geodetic()变换默认仅对输入的离散端点做投影转换,没有在两点之间生成足够多的中间点来模拟大圆曲线的连续形态。当两点在正射投影下的投影轨迹跨越了投影的视野边缘(或投影不连续区域)时,直接连接两个投影后的端点就会出现这种突兀的折线。

正确渲染方法

要绘制平滑的大圆线段,需要手动在两点之间生成足够多的大圆路径上的中间点,再对这些密集点做投影转换后绘制。可以借助Cartopy内置的Geodesic工具类生成大圆上的密集点:

修改后的代码

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

# 定义起点和终点经纬度
start_lon, start_lat = 15, 0
end_lon, end_lat = 76, 36

# 生成大圆路径上的密集点(100个点足够保证曲线平滑)
geod = Geodesic()
n_points = 100
path = geod.interpolate([(start_lon, start_lat), (end_lon, end_lat)], n_points)
lons = path[:, 0]
lats = path[:, 1]

# 创建正射投影轴并绘制平滑大圆线
ax = plt.axes(projection=ccrs.Orthographic(central_longitude=0, central_latitude=45))
ax.plot(lons, lats, transform=ccrs.Geodetic())
ax.set_global()
ax.gridlines()

plt.show()

代码说明

通过Geodesic.interpolate方法在两点之间生成100个沿大圆路径分布的点,确保绘制的线条能完整贴合大圆的真实形态,避免出现弯折。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:16:31