如何利用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的端点值。我设想可以设置线长、中点(经纬度)和旋转角度来生成线,但不确定是否可行。
解决方案
完全可以通过中点坐标、线长、旋转角度来生成固定长度的剖面线,核心是利用球面几何计算推导端点坐标,不用手动试错。
步骤说明
- 借助
pyproj的地理计算工具,基于WGS84椭球体处理球面距离与坐标的转换,避免平面近似的误差。 - 以设定的中点为起点,向正反两个方向各走一半线长,得到两个端点的经纬度。
- 用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
相关产品推荐
相关产品推荐

