You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何选择合适的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 22:54:29