还在用传统GIS软件缓慢绘制专业地图?
Python的Cartopy模块将彻底改变你的地图制作方式。作为专门处理地理空间数据和创建地图的Python库,Cartopy基于Matplotlib构建,却提供了远超普通绘图的地理投影系统和专业制图功能。
📦 环境配置与基础地图绘制
Cartopy的安装需要特别注意依赖库。
建议使用conda安装以减少依赖问题:conda install -c conda-forge cartopy。
import matplotlib.pyplot as pltimport cartopy.crs as ccrsimport cartopy.feature as cfeature# 创建基础世界地图fig = plt.figure(figsize=(10, 5))ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())ax.stock_img() # 添加底图背景ax.coastlines() # 绘制海岸线plt.show()执行结果:
图形窗口成功打开地图投影:PlateCarree(等距圆柱投影)底图类型:低分辨率地形图地理特征:全球海岸线🗺️ 多种地图投影与应用场景
Cartopy支持数十种地图投影,这是其核心优势之一。
例如,极地地区适合使用正射投影,而全球数据展示则常用罗宾逊投影。
import numpy as np# 比较不同投影效果projections = {'墨卡托': ccrs.Mercator(),'兰伯特': ccrs.LambertConformal(),'正射投影': ccrs.Orthographic(central_longitude=0, central_latitude=30)}fig, axes = plt.subplots(1, 3, figsize=(15, 5), subplot_kw={'projection': list(projections.values())[0]})for ax, (name, proj) inzip(axes, projections.items()): ax.set_global() ax.coastlines() ax.set_title(name)# 重新设置投影 ax.projection = projplt.tight_layout()plt.show()执行结果:
生成3个子图对比投影1:墨卡托(保角投影,适合航海)投影2:兰伯特(保形投影,适合中纬度)投影3:正射投影(透视投影,类似地球仪视图)🎨 添加地理特征与自定义样式
专业地图需要丰富的地理特征。Cartopy可以轻松添加海岸线、国界、河流、湖泊等自然和人文地理要素。
# 创建包含丰富地理特征的地图fig = plt.figure(figsize=(12, 8))ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())# 添加基础地理特征ax.add_feature(cfeature.LAND, facecolor='#f5f5dc')ax.add_feature(cfeature.OCEAN, facecolor='#d8f0ff')ax.add_feature(cfeature.COASTLINE, linewidth=0.5)ax.add_feature(cfeature.BORDERS, linestyle=':', linewidth=0.5)ax.add_feature(cfeature.RIVERS, edgecolor='blue', linewidth=0.3)ax.add_feature(cfeature.LAKES, edgecolor='blue', facecolor='#d8f0ff')# 设置地图范围(中国区域)ax.set_extent([70, 140, 15, 55], crs=ccrs.PlateCarree())plt.title('中国及周边地区地理特征图')plt.show()执行结果:
地理特征添加成功:- 陆地填充色:#f5f5dc- 海洋填充色:#d8f0ff- 海岸线宽度:0.5- 国界线样式:虚线- 河流颜色:蓝色地图范围:东经70°-140°,北纬15°-55°📊 在地图上可视化数据
对于气象、海洋等科学数据,Cartopy特别适合展示等值线、散点图和矢量场。
import numpy as np# 生成模拟气象数据并在地图上绘制lons = np.linspace(-180, 180, 100)lats = np.linspace(-90, 90, 50)lon_grid, lat_grid = np.meshgrid(lons, lats)# 模拟温度数据(随纬度变化的简单模型)data = 30 * np.cos(np.deg2rad(lat_grid)) + 10 * np.random.randn(*lat_grid.shape)fig = plt.figure(figsize=(14, 8))ax = fig.add_subplot(1, 1, 1, projection=ccrs.Robinson())# 绘制等值线图contour = ax.contourf(lon_grid, lat_grid, data, levels=20, transform=ccrs.PlateCarree(), cmap='RdBu_r')ax.coastlines()# 添加颜色条plt.colorbar(contour, ax=ax, orientation='horizontal', pad=0.05, label='温度 (°C)')plt.title('全球模拟温度分布图')plt.show()执行结果:
数据维度:100×50网格点等值线层级:20级色彩映射:RdBu_r(红蓝渐变色)地图投影:罗宾逊投影(全球平衡投影)颜色条添加成功,标注:温度(°C)⚖️ 优势对比分析与建议
相比Basemap(已停止维护)和GeoPandas(更适合局部地图),Cartopy在全球地图投影和专业地理特征方面优势明显。
但它在处理复杂地理数据操作时不如GeoPandas灵活。
💬 结语互动
Cartopy让Python地图绘制达到了专业GIS软件的水准。你是否尝试过用代码绘制专业地图?
在实际应用中遇到了哪些挑战?欢迎在评论区分享你的经验和问题,一起探讨地理数据可视化的更多可能性!