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
相关产品推荐
相关产品推荐

