如何在Matplotlib的笛卡尔网格上绘制海岸线?
在笛卡尔网格上绘制海岸线的解决方案
当然可以不用转换你的气象数据到经纬度网格,直接在米单位的笛卡尔坐标系上画海岸线——核心思路是把海岸线的经纬度点转换成你的局部笛卡尔坐标,而非反过来动你的气象数据。以下是具体实现步骤:
1. 明确投影关系
你已知网格中心经纬度(lon0, lat0),且x/y单位为米,说明你的网格是以中心为原点的局部平面直角坐标系。我们只需要把全球海岸线的经纬度点,通过投影转换到这个坐标系下即可。
2. 获取海岸线数据
用cartopy自带的开源海岸线数据就行,按需选择精度:
import cartopy.feature as cfeature # 110m=低精度(全球范围),50m=中精度,10m=高精度(局部小范围) coastline = cfeature.NaturalEarthFeature('physical', 'coastline', scale='10m')
3. 搭建坐标转换器
用pyproj(cartopy底层依赖的投影库)构建经纬度到局部笛卡尔坐标的转换器:
from pyproj import Transformer # WGS84经纬度坐标系(EPSG:4326) crs_geo = "EPSG:4326" # 以你的网格中心为原点的横墨卡托投影(单位米) crs_local = f"+proj=tmerc +lat_0={lat0} +lon_0={lon0} +units=m +ellps=WGS84" # 创建转换工具:经纬度 → 局部笛卡尔坐标 transformer = Transformer.from_crs(crs_geo, crs_local, always_xy=True)
4. 转换并绘制海岸线
先画你的气象数据,再把海岸线坐标转换后叠加上去:
import matplotlib.pyplot as plt # 绘制你的气象等值面 plt.contourf(x, y, meteorological_data) # 遍历海岸线的每个几何图形,转换坐标后绘制 for geom in coastline.geometries(): lon, lat = geom.xy x_coast, y_coast = transformer.transform(lon, lat) # 自定义海岸线样式(颜色、线宽等) plt.plot(x_coast, y_coast, color='k', lw=0.8) # 锁定你的网格范围,避免海岸线数据超出显示 plt.xlim(x.min(), x.max()) plt.ylim(y.min(), y.max()) plt.show()
实用提示
- 如果你的网格范围很大(跨多个经度/纬度),横墨卡托投影可能有变形,建议改用对应区域的UTM分区投影(需要先确定网格所在的UTM带)
- 不想用cartopy的话,也可以用
geopandas加载公开的海岸线SHP文件,再用同样的转换器处理坐标 - 小范围地图选
10m精度的海岸线,大范围选110m,避免数据量过大拖慢绘图速度
内容的提问来源于stack exchange,提问作者Bernard Postema
相关产品推荐
相关产品推荐

