如何利用Cartopy修改Patch边界以排除陆地区域?
用Cartopy实现仅包含海洋区域的自定义框
完全可以实现,核心是通过多边形差集运算,把初始矩形框和陆地区域做减法,只保留海洋部分的形状,同时陆地正常显示。具体步骤和代码示例如下:
实现思路
- 获取陆地的多边形集合:利用Cartopy自带的自然地理数据或者外部shapefile,提取非洲、欧洲等陆地的多边形,并合并成一个统一的陆地几何对象。
- 创建初始矩形的地理多边形:把你原来的矩形范围转换成Shapely多边形(要匹配地图的地理坐标系)。
- 差集运算:用Shapely的
difference方法,让矩形多边形减去陆地多边形,得到仅包含海洋的区域形状。 - 绘制结果:将运算后的海洋多边形转换成Cartopy支持的Patch,添加到地图轴上。
示例代码
import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.feature as cfeature from shapely.geometry import Polygon from shapely.ops import unary_union from cartopy.mpl.patch import geos_to_path import matplotlib.patches as mpatches # 1. 创建地图轴,指定投影 ax = plt.axes(projection=ccrs.PlateCarree()) # 2. 获取并合并陆地多边形(用10m分辨率的陆地数据,精度更高) land_feature = cfeature.NaturalEarthFeature( category='physical', name='land', scale='10m', facecolor='lightgray' ) # 提取所有陆地的几何对象,合并成一个整体 land_geometries = list(land_feature.geometries()) unified_land = unary_union(land_geometries) # 3. 定义你要的东大西洋初始矩形范围(根据需求调整坐标) rect_lon_min, rect_lat_min = -20, 0 rect_lon_max, rect_lat_max = 20, 40 rect_polygon = Polygon([ (rect_lon_min, rect_lat_min), (rect_lon_max, rect_lat_min), (rect_lon_max, rect_lat_max), (rect_lon_min, rect_lat_max) ]) # 4. 执行差集运算:矩形减去陆地,得到海洋区域 ocean_area = rect_polygon.difference(unified_land) # 5. 将海洋区域转换成Cartopy Patch并添加到地图 for path in geos_to_path(ocean_area): ocean_patch = mpatches.PathPatch( path, facecolor='rgba(0, 0, 255, 0.3)', # 半透明蓝色,可自定义 edgecolor='darkblue', linewidth=1, transform=ccrs.PlateCarree() ) ax.add_patch(ocean_patch) # 6. 添加陆地、海岸线等基础元素(陆地正常显示) ax.add_feature(land_feature) ax.add_feature(cfeature.COASTLINE, linewidth=0.5) # 设置地图显示范围 ax.set_extent([-30, 30, -10, 50]) plt.show()
注意事项
- 数据分辨率:代码里用的是
10m分辨率的陆地数据,精度较高但运算稍慢;如果对精度要求不高,可以换成50m或110m,速度更快。 - 多区域处理:差集运算后可能得到多个独立的多边形(比如矩形内的岛屿周围区域),代码中的循环会自动遍历并绘制所有海洋部分。
- 坐标系一致性:确保所有多边形的坐标系和地图投影一致(示例用的是PlateCarree,即经纬度坐标系)。
内容的提问来源于stack exchange,提问作者Logan
相关产品推荐
相关产品推荐

