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

如何利用Matplotlib/Cartopy绘制固定长度的地图叠加线?

固定长度剖面线的绘制方法(Matplotlib + Cartopy)

问题描述

我正在Python中使用matplotlib和cartopy在地图上绘制叠加线。目前的做法是确定两点的经纬度,然后绘制两点间的连线。由于我要沿这些线做剖面分析,希望找到一种方法,让线的长度保持固定(例如300km),无论将其放置在地图的哪个位置。是否可以不用试错调整端点坐标来实现?

现有相关代码如下:

lat1, lat2, lon1, lon2 = [34.5, 36, -100, -97]
x, y = [lon1, lon2], [lat1, lat2]

ax1.plot(x, y, color="black", marker="o", zorder=3, transform = ccrs.PlateCarree(), linewidth = 2.5)

这段代码可以正常运行,但我希望固定线的长度,而非修改lat1, lat2, lon1, lon2的端点值。我设想可以设置线长、中点(经纬度)和旋转角度来生成线,但不确定是否可行。

解决方案

完全可以通过中点坐标、线长、旋转角度来生成固定长度的剖面线,核心是利用球面几何计算推导端点坐标,不用手动试错。

步骤说明

  1. 借助pyproj的地理计算工具,基于WGS84椭球体处理球面距离与坐标的转换,避免平面近似的误差。
  2. 以设定的中点为起点,向正反两个方向各走一半线长,得到两个端点的经纬度。
  3. 用Cartopy完成投影转换后绘制这条固定长度的线。

完整代码示例

import matplotlib.pyplot as plt
import cartopy.crs as ccrs
from pyproj import Geod

# 自定义参数:中点经纬度、线长(km)、方位角(正北为0度,顺时针递增)
mid_lon, mid_lat = -98.5, 35.25
line_length_km = 300
angle_deg = 45  # 东北方向

# 初始化WGS84椭球体的地理计算对象
geod = Geod(ellps='WGS84')

# 计算两个端点:从中点向正反方向各走一半线长
lon1, lat1, _ = geod.fwd(mid_lon, mid_lat, angle_deg, line_length_km / 2 * 1000)
lon2, lat2, _ = geod.fwd(mid_lon, mid_lat, angle_deg + 180, line_length_km / 2 * 1000)

# 绘图
fig, ax1 = plt.subplots(subplot_kw={'projection': ccrs.PlateCarree()})
ax1.coastlines()
ax1.gridlines(draw_labels=True)

# 绘制固定长度剖面线
ax1.plot([lon1, lon2], [lat1, lat2], color="black", marker="o", zorder=3, 
         transform=ccrs.PlateCarree(), linewidth=2.5)
# 标记中点
ax1.scatter(mid_lon, mid_lat, color='red', marker='x', zorder=4, transform=ccrs.PlateCarree())

plt.show()

代码说明

  • Geod对象:基于WGS84椭球体计算,fwd方法可以精准根据起点坐标、方位角、距离算出终点坐标,适配全球任何纬度的球面距离计算。
  • 角度与长度控制:方位角以正北为0度顺时针递增,比如正东对应90度;把总长度拆成两半分别向正反方向延伸,保证线的中点就是设定的坐标,长度严格符合要求。
  • 全程无需手动调整端点坐标,只要修改参数就能生成任意位置、角度、长度的剖面线。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 11:45:29