如何选择合适的cartopy投影解决德国地图绘制形状变形问题
问题描述
使用cartopy库开展德国区域数据可视化工作时,数据层绘制逻辑运行正常(示例代码中已暂时删除数据相关代码),但受投影参数设置影响,输出的德国国境轮廓存在明显变形。最初采用PlateCarree投影,后续尝试更换为Orthographic等其他投影后,变形问题仍未解决,需选择适配投影优化地图形状。

原有实现代码
import matplotlib.pyplot as plt import cartopy.crs as ccrs from cartopy.io import shapereader import geopandas # 获取国界数据 resolution = '10m' category = 'cultural' name = 'admin_0_countries' shpfilename = shapereader.natural_earth(resolution, category, name) df = geopandas.read_file(shpfilename) poly = df.loc[df['ADMIN'] == 'Germany']['geometry'].values[0] # 绘图 ax = plt.axes(projection=ccrs.PlateCarree()) ax.set_extent([5.8, 15.1, 47.25, 55.1], crs=ccrs.PlateCarree()) ax.add_geometries(poly, crs=ccrs.PlateCarree(), facecolor='gainsboro', edgecolor='slategray', lw=0.1, alpha=.8) # 保存结果 save_path = 'germany.png' plt.savefig(save_path, dpi=250, bbox_inches='tight', pad_inches=0.) plt.close()
原因分析
PlateCarree属于等距圆柱投影,设计目标是全球尺度展示,高纬度区域会存在明显的横向拉伸变形,德国位于47°N-55°N的中高纬度区域,使用该投影必然出现轮廓拉宽的问题。Orthographic属于正射方位投影,是模拟太空视角的半球级投影,小区域下会存在透视形变,不适合国家尺度的精确轮廓展示。
适配投影选择方案
对于德国这类中纬度、东西跨度小于15经度的区域,**兰伯特等角圆锥投影(Lambert Conformal Conic)**是最优选择,该投影是欧洲地区官方制图的标准投影之一,区域内形状畸变极小,能还原符合日常认知的国境轮廓。
设置投影时需要匹配德国的地理中心参数,将变形控制到最小:
- 中央经线取德国中心经度约10.5°E
- 中心纬度取德国中心纬度约51°N
- 标准纬线取区域南北边界向内1-2个纬度的位置,即48°N、54°N,保证绘图范围内投影变形最低
修正后代码
import matplotlib.pyplot as plt import cartopy.crs as ccrs from cartopy.io import shapereader import geopandas # 获取国界数据 resolution = '10m' category = 'cultural' name = 'admin_0_countries' shpfilename = shapereader.natural_earth(resolution, category, name) df = geopandas.read_file(shpfilename) poly = df.loc[df['ADMIN'] == 'Germany']['geometry'].values[0] # 绘图:替换为适配德国区域的兰伯特等角圆锥投影 proj = ccrs.LambertConformal( central_longitude=10.5, central_latitude=51, standard_parallels=(48, 54) ) ax = plt.axes(projection=proj) # set_extent的crs保持为PlateCarree即可,因为输入的经纬度范围是WGS84地理坐标 ax.set_extent([5.8, 15.1, 47.25, 55.1], crs=ccrs.PlateCarree()) # 加载矢量的crs保持为PlateCarree即可,Natural Earth数据源为WGS84经纬度坐标 ax.add_geometries(poly, crs=ccrs.PlateCarree(), facecolor='gainsboro', edgecolor='slategray', lw=0.1, alpha=.8) # 保存结果 save_path = 'germany_fixed.png' plt.savefig(save_path, dpi=250, bbox_inches='tight', pad_inches=0.) plt.close()
投影选择通用规则
日常做小区域可视化时,不要直接套用全球/半球尺度投影,按区域位置选对应类型即可:
- 赤道附近东西延伸区域:选等距圆柱、墨卡托投影
- 中纬度东西延伸区域(如德国、中国、美国本土):选兰伯特等角圆锥、阿尔伯斯等积圆锥投影
- 南北向延伸区域:选横轴墨卡托(UTM)投影
- 极地区域:选正轴方位投影
内容的提问来源于stack exchange,提问作者clear
相关产品推荐
相关产品推荐

