如何在Cartopy中设置范围以绘制完美正方形地图?
解决Cartopy Plate Carrée投影绘制正方形地图的白边问题
问题根源:Plate Carrée投影虽直接映射经纬度,但仅设置经纬度跨度相等不足以保证最终显示为正方形——Cartopy默认不会强制坐标轴等比例,且地理坐标转投影坐标后,若不主动匹配投影坐标的跨度,易出现边缘白边。
正确实现步骤
- 在投影坐标空间定义正方形范围(而非直接用经纬度),确保x、y方向跨度完全一致;
- 将投影坐标转回地理坐标,作为地图的显示范围;
- 强制坐标轴长宽比为1,锁定正方形显示效果。
修正后的代码示例
import matplotlib.pyplot as plt import cartopy.crs as ccrs # 初始参数:中心经纬度 + 目标跨度(这里用经度跨度作为正方形边长) lon_center = (-120 + -60) / 2 lat_center = (15 + 75) / 2 target_span = 60 # 正方形边长对应的投影坐标跨度 # 初始化Plate Carrée投影 proj = ccrs.PlateCarree() # 将中心地理坐标转换为投影坐标 center_x, center_y = proj.transform_point(lon_center, lat_center, ccrs.Geodetic()) # 计算投影坐标下的正方形范围 x_min = center_x - target_span / 2 x_max = center_x + target_span / 2 y_min = center_y - target_span / 2 y_max = center_y + target_span / 2 # 将投影坐标转回地理坐标,得到最终的显示范围 lon_min, lat_min = proj.transform_point(x_min, y_min, proj) lon_max, lat_max = proj.transform_point(x_max, y_max, proj) # 创建画布并绘制地图 fig, ax = plt.subplots(subplot_kw={'projection': proj}, figsize=(8, 8)) ax.set_extent([lon_min, lon_max, lat_min, lat_max], crs=ccrs.PlateCarree()) ax.coastlines() # 强制坐标轴等比例,确保显示为正方形 ax.set_aspect('equal', adjustable='box') plt.show()
关键说明
- 直接用经纬度跨度相等时,Cartopy的坐标轴会根据画布大小自动拉伸,导致实际显示不是正方形,进而出现边缘白边;
- 先在投影坐标空间定义正方形,再转回地理坐标,能保证地图内容完全填充正方形区域;
set_aspect('equal', adjustable='box')是锁定正方形显示的核心,避免画布拉伸破坏比例。
内容的提问来源于stack exchange,提问作者Pontis
相关产品推荐
相关产品推荐

