Cartopy地图可视化完全指南:从核心功能到高级应用
2026-03-11 04:26:45作者:郁楠烈Hubert
Cartopy是一个基于matplotlib的Python地图绘制库,提供了强大的地理数据处理和可视化功能。本文将通过"核心功能解析→场景化应用→进阶技巧"的三段式框架,全面介绍Cartopy地图可视化的实现方法,帮助你掌握Cartopy地图绘制的关键技术,创建专业级的地理数据展示效果。
一、核心功能解析:构建地图可视化基础
选择合适的地图投影:打造专业地理视角
如何为不同研究区域选择最佳投影方式?Cartopy提供了多种地图投影,每种投影都有其适用场景。以下是几种常用投影的实现方法:
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
# 创建不同投影的地图对比
projections = {
"PlateCarree": ccrs.PlateCarree(),
"Mercator": ccrs.Mercator(),
"Robinson": ccrs.Robinson(),
"LambertConformal": ccrs.LambertConformal()
}
fig, axes = plt.subplots(2, 2, figsize=(15, 10), subplot_kw={'projection': None})
for i, (name, crs) in enumerate(projections.items()):
ax = axes[i//2, i%2]
ax = plt.subplot(2, 2, i+1, projection=crs)
ax.set_global()
ax.coastlines()
ax.set_title(f'{name} Projection')
plt.tight_layout()
plt.show()
对于极地研究,Lambert投影能有效减少极地区域的变形:
# 创建南半球Lambert投影地图
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(1, 1, 1, projection=ccrs.LambertConformal(
central_latitude=-90, standard_parallels=(-70, -30)
))
ax.set_extent([-180, 180, -90, -30], crs=ccrs.PlateCarree())
ax.coastlines(resolution='50m')
ax.gridlines()
plt.title('Lambert Conformal Projection for Southern Hemisphere')
plt.show()
添加基础地理特征:丰富地图信息层次
如何快速为地图添加基础地理要素?Cartopy的feature模块提供了丰富的预定义地理特征:
import cartopy.feature as cfeature
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())
ax.set_extent([-180, 180, -90, 90])
# 添加基础地理特征
ax.add_feature(cfeature.LAND, facecolor='lightgreen')
ax.add_feature(cfeature.OCEAN, facecolor='lightblue')
ax.add_feature(cfeature.COASTLINE, linewidth=0.8)
ax.add_feature(cfeature.BORDERS, linestyle='--', edgecolor='gray')
ax.add_feature(cfeature.LAKES, facecolor='lightblue', alpha=0.5)
ax.add_feature(cfeature.RIVERS, edgecolor='blue')
# 添加网格线
ax.gridlines(draw_labels=True, linewidth=0.5, color='gray', linestyle='--')
plt.title('Global Map with Basic Geographic Features')
plt.show()
二、场景化应用:解决实际地理可视化问题
突出显示特定区域:聚焦研究目标
如何在地图中突出显示研究区域?通过自定义几何图形可以实现对特定区域的高亮显示:
from shapely.geometry import Polygon
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
# 创建地图
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())
ax.set_extent([-10, 30, 35, 70], crs=ccrs.PlateCarree())
# 添加基础地理特征
ax.add_feature(cfeature.LAND, facecolor='lightgray')
ax.add_feature(cfeature.COASTLINE)
ax.add_feature(cfeature.BORDERS, linestyle=':')
# 定义研究区域多边形(欧洲中部)
europe_central = Polygon([
(5, 45), (15, 45), (15, 55), (5, 55)
])
# 添加自定义多边形区域
ax.add_geometries([europe_central], ccrs.PlateCarree(),
facecolor='yellow', edgecolor='red', alpha=0.3)
# 添加文本标注
ax.text(10, 50, '研究区域', transform=ccrs.PlateCarree(),
fontsize=12, ha='center', bbox=dict(facecolor='white', alpha=0.7))
ax.gridlines(draw_labels=True)
plt.title('突出显示欧洲中部研究区域')
plt.show()
展示地理路径:可视化空间关系
如何在地图上绘制两地之间的最短路径?使用Cartopy的地理路径功能可以直观展示空间连接:
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
# 创建地图
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(1, 1, 1, projection=ccrs.Robinson())
ax.set_global()
# 添加基础地理特征
ax.add_feature(cfeature.LAND, facecolor='lightgreen')
ax.add_feature(cfeature.OCEAN, facecolor='lightblue')
ax.add_feature(cfeature.COASTLINE)
ax.add_feature(cfeature.BORDERS, linestyle='--', alpha=0.5)
# 定义城市坐标
cities = {
'北京': (116.4, 39.9),
'伦敦': (-0.1, 51.5),
'纽约': (-74.0, 40.7),
'悉尼': (151.2, -33.8)
}
# 绘制城市间路径
city_pairs = [('北京', '伦敦'), ('伦敦', '纽约'), ('北京', '悉尼')]
colors = ['red', 'green', 'blue']
for (city1, city2), color in zip(city_pairs, colors):
lon1, lat1 = cities[city1]
lon2, lat2 = cities[city2]
# 绘制大圆路径
ax.plot([lon1, lon2], [lat1, lat2], color=color, linewidth=2,
transform=ccrs.Geodetic(), label=f'{city1}-{city2}')
# 添加城市标记
ax.plot(lon1, lat1, 'o', color='black', markersize=6, transform=ccrs.PlateCarree())
ax.plot(lon2, lat2, 'o', color='black', markersize=6, transform=ccrs.PlateCarree())
# 添加城市名称
ax.text(lon1+3, lat1+3, city1, transform=ccrs.PlateCarree(),
bbox=dict(facecolor='white', alpha=0.7))
ax.text(lon2+3, lat2+3, city2, transform=ccrs.PlateCarree(),
bbox=dict(facecolor='white', alpha=0.7))
ax.legend()
plt.title('全球主要城市间航线路径')
plt.show()
可视化气候数据:展示空间分布模式
如何将气象数据与地理信息结合可视化?Cartopy可以轻松实现气候数据的空间分布展示:
import numpy as np
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
from matplotlib import cm
# 生成模拟温度数据
lon = np.linspace(-180, 180, 360)
lat = np.linspace(-90, 90, 180)
lon_grid, lat_grid = np.meshgrid(lon, lat)
# 创建模拟温度场(以亚洲为中心的热异常)
temp = 20 * np.exp(-((lon_grid - 100)**2)/3000 - ((lat_grid - 30)**2)/1000)
# 创建地图
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 14),
subplot_kw={'projection': ccrs.PlateCarree()})
# 绘制温度分布
im1 = ax1.pcolormesh(lon, lat, temp, transform=ccrs.PlateCarree(),
cmap=cm.jet, vmin=0, vmax=20)
ax1.set_title('亚洲区域温度异常分布(PlateCarree投影)')
ax1.coastlines()
fig.colorbar(im1, ax=ax1, orientation='horizontal', label='温度异常 (°C)')
# 使用不同投影展示同一数据
ax2 = plt.subplot(2, 1, 2, projection=ccrs.Robinson())
im2 = ax2.pcolormesh(lon, lat, temp, transform=ccrs.PlateCarree(),
cmap=cm.jet, vmin=0, vmax=20)
ax2.set_title('亚洲区域温度异常分布(Robinson投影)')
ax2.coastlines()
fig.colorbar(im2, ax=ax2, orientation='horizontal', label='温度异常 (°C)')
plt.tight_layout()
plt.show()
三、进阶技巧:提升地图可视化质量
自定义地图样式:打造专属视觉语言
如何创建符合研究主题的个性化地图样式?通过自定义特征属性和颜色方案实现:
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
# 创建自定义颜色映射
custom_cmap = LinearSegmentedColormap.from_list(
'custom_terrain', ['#e8e0d0', '#a0d080', '#60a040', '#307030']
)
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(1, 1, 1, projection=ccrs.AlbersEqualArea(
central_latitude=30, central_longitude=105
))
ax.set_extent([70, 140, 15, 55])
# 添加自定义样式的地理特征
land = cfeature.NaturalEarthFeature(
'physical', 'land', '50m',
edgecolor='face',
facecolor=custom_cmap(0.2)
)
ocean = cfeature.NaturalEarthFeature(
'physical', 'ocean', '50m',
edgecolor='face',
facecolor='#a0c0e0'
)
ax.add_feature(ocean)
ax.add_feature(land)
# 添加自定义边界样式
borders = cfeature.NaturalEarthFeature(
'cultural', 'admin_0_countries', '50m',
edgecolor='#505050',
facecolor='none',
linewidth=0.8
)
ax.add_feature(borders)
# 添加河流和湖泊
rivers = cfeature.NaturalEarthFeature(
'physical', 'rivers_lake_centerlines', '50m',
edgecolor='#60a0ff',
facecolor='none',
linewidth=0.5
)
ax.add_feature(rivers)
ax.gridlines(draw_labels=True, linewidth=0.5, color='gray', linestyle='--')
plt.title('中国区域自定义地图样式')
plt.show()
常见问题解决:攻克地图可视化难题
1. 投影变形问题
问题:在高纬度地区,地图投影变形严重,如何选择合适的投影方式?
解决方案:根据研究区域选择适当的投影:
- 极地地区:使用极方位投影(AzimuthalEquidistant)
- 中纬度地区:使用Lambert Conformal或Albers Equal Area投影
- 全球展示:使用Robinson或Mollweide投影
# 极地地区投影示例
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(1, 1, 1, projection=ccrs.AzimuthalEquidistant(
central_latitude=90
))
ax.set_extent([-180, 180, 60, 90], crs=ccrs.PlateCarree())
ax.add_feature(cfeature.LAND)
ax.add_feature(cfeature.COASTLINE)
ax.gridlines()
plt.title('北极地区等距方位投影')
plt.show()
2. 数据加载失败
问题:添加Natural Earth数据时出现下载失败或文件缺失。
解决方案:手动指定数据路径或使用本地数据:
import os
import cartopy.feature as cfeature
# 设置本地数据路径
data_dir = os.path.join(os.path.dirname(__file__), 'data', 'natural_earth')
os.makedirs(data_dir, exist_ok=True)
# 使用本地数据加载特征
land = cfeature.NaturalEarthFeature(
'physical', 'land', '50m',
edgecolor='face',
facecolor=cfeature.COLORS['land'],
data_dir=data_dir
)
# 异常处理
try:
ax.add_feature(land)
except FileNotFoundError:
print("无法找到数据文件,请确保Natural Earth数据已下载到指定目录")
# 可以在这里添加自动下载代码或提示用户手动下载
项目场景模板:快速复用的地图可视化方案
模板1:区域研究地图
def create_region_map(extent, title, projection=ccrs.PlateCarree()):
"""
创建区域研究地图模板
参数:
extent: 地理范围 [lon_min, lon_max, lat_min, lat_max]
title: 地图标题
projection: 地图投影方式
"""
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(1, 1, 1, projection=projection)
ax.set_extent(extent, crs=ccrs.PlateCarree())
# 添加基础地理特征
ax.add_feature(cfeature.LAND, facecolor='lightgray')
ax.add_feature(cfeature.COASTLINE, linewidth=0.8)
ax.add_feature(cfeature.BORDERS, linestyle='--', edgecolor='gray')
# 添加网格线
gl = ax.gridlines(draw_labels=True, linewidth=0.5, color='gray', linestyle='--')
gl.top_labels = False
gl.right_labels = False
plt.title(title)
return fig, ax
# 使用示例
fig, ax = create_region_map(
extent=[70, 140, 15, 55],
title='东亚区域研究地图',
projection=ccrs.AlbersEqualArea(central_latitude=35, central_longitude=105)
)
plt.show()
模板2:路径分析地图
def create_route_map(route_points, title, projection=ccrs.Robinson()):
"""
创建路径分析地图模板
参数:
route_points: 路径点列表,每个点为(lon, lat)元组
title: 地图标题
projection: 地图投影方式
"""
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(1, 1, 1, projection=projection)
ax.set_global()
# 添加基础地理特征
ax.add_feature(cfeature.LAND, facecolor='lightgreen')
ax.add_feature(cfeature.OCEAN, facecolor='lightblue')
ax.add_feature(cfeature.COASTLINE)
# 提取经纬度
lons, lats = zip(*route_points)
# 绘制路径
ax.plot(lons, lats, 'r-', linewidth=2, transform=ccrs.Geodetic())
# 标记路径点
ax.plot(lons, lats, 'bo', markersize=6, transform=ccrs.PlateCarree())
plt.title(title)
return fig, ax
# 使用示例
route = [(0, 51.5), (30, 30), (100, 35), (116.4, 39.9)] # 伦敦到北京的大致路径
fig, ax = create_route_map(route, '伦敦到北京航线路径分析')
plt.show()
模板3:气候数据可视化地图
def create_climate_map(data, lons, lats, title, projection=ccrs.PlateCarree()):
"""
创建气候数据可视化地图模板
参数:
data: 要可视化的数据数组
lons: 经度数组
lats: 纬度数组
title: 地图标题
projection: 地图投影方式
"""
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(1, 1, 1, projection=projection)
ax.set_global()
# 绘制数据
mesh = ax.pcolormesh(lons, lats, data, transform=ccrs.PlateCarree(), cmap='jet')
# 添加海岸线
ax.coastlines()
# 添加颜色条
cbar = plt.colorbar(mesh, ax=ax, orientation='horizontal', pad=0.05)
cbar.set_label('温度 (°C)')
plt.title(title)
return fig, ax
# 使用示例
lon = np.linspace(-180, 180, 360)
lat = np.linspace(-90, 90, 180)
lon_grid, lat_grid = np.meshgrid(lon, lat)
data = np.sin(np.radians(lat_grid)) * np.cos(np.radians(lon_grid)) * 20
fig, ax = create_climate_map(
data, lon, lat, '全球温度分布模拟'
)
plt.show()
通过本文介绍的Cartopy核心功能、场景化应用和进阶技巧,你已经掌握了创建专业地理数据可视化的关键技术。无论是区域研究、路径分析还是气候数据展示,Cartopy都能提供强大的支持,帮助你打造高质量的地图可视化作品。结合提供的项目场景模板,可以快速适应不同的应用需求,提升工作效率。
登录后查看全文
热门项目推荐
相关项目推荐
GLM-5智谱 AI 正式发布 GLM-5,旨在应对复杂系统工程和长时域智能体任务。Jinja00
LongCat-AudioDiT-1BLongCat-AudioDiT 是一款基于扩散模型的文本转语音(TTS)模型,代表了当前该领域的最高水平(SOTA),它直接在波形潜空间中进行操作。00
jiuwenclawJiuwenClaw 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。Python0248- QQwen3.5-397B-A17BQwen3.5 实现了重大飞跃,整合了多模态学习、架构效率、强化学习规模以及全球可访问性等方面的突破性进展,旨在为开发者和企业赋予前所未有的能力与效率。Jinja00
AtomGit城市坐标计划AtomGit 城市坐标计划开启!让开源有坐标,让城市有星火。致力于与城市合伙人共同构建并长期运营一个健康、活跃的本地开发者生态。01
HivisionIDPhotos⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。Python05
项目优选
收起
deepin linux kernel
C
27
13
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
641
4.19 K
Ascend Extension for PyTorch
Python
478
579
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
934
841
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
386
272
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
1.52 K
866
暂无简介
Dart
885
211
仓颉编程语言运行时与标准库。
Cangjie
161
922
昇腾LLM分布式训练框架
Python
139
163
🔥LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解
Java
69
21



