一、Cartopy库简介
Cartopy是一个功能强大的Python地理空间数据处理和可视化库,主要用于绘制地图、处理地理数据以及进行空间分析。它与Matplotlib无缝集成,支持多种地图投影、地理特征(如海岸线、湖泊、国家边界等)以及地理数据的叠加显示。无论是科研人员、数据分析师还是地理信息系统(GIS)开发者,Cartopy都能提供强大的支持。资源绑定附上完整cartopy库学习资源供读者参考学习!
Cartopy的主要特点:
-
支持多种地图投影:包括常见的墨卡托投影、等距圆柱投影、极地投影等。
-
丰富的地理特征:内置海岸线、湖泊、河流、国家边界等地理数据。
-
与Matplotlib无缝集成:可以使用Matplotlib的绘图功能增强地图的可视化效果。
-
支持多种数据格式:包括GeoJSON、Shapefile、NetCDF等。
-
易于扩展:支持自定义地理特征和数据源。
安装Cartopy:
bash
pip install cartopy
二、常见操作示例
示例1:绘制基础地图
这是最简单的地图绘制示例,展示如何创建一个空白地图并添加基本的地理特征。
Python示例代码
import matplotlib.pyplot as plt
import pylab as mpl
import cartopy.crs as ccrs
import cartopy.feature as cfeaturempl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False# 创建地图
fig, ax = plt.subplots(figsize=(10, 6), subplot_kw={'projection': ccrs.PlateCarree()})# 添加地理特征
ax.add_feature(cfeature.LAND, facecolor='lightgray')
ax.add_feature(cfeature.OCEAN, facecolor='skyblue')
ax.add_feature(cfeature.COASTLINE)
ax.add_feature(cfeature.BORDERS, linestyle=':')
ax.add_feature(cfeature.LAKES, alpha=0.5)
ax.add_feature(cfeature.RIVERS)# 设置标题
ax.set_title('基础地图示例')plt.show()
效果展示
示例2:绘制带投影的地图
使用不同的地图投影,比如等距圆柱投影。
Python示例代码
import matplotlib.pyplot as plt
import pylab as mpl
import cartopy.crs as ccrs
import cartopy.feature as cfeaturempl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False# 创建地图,使用等距圆柱投影
fig, ax = plt.subplots(figsize=(10, 6), subplot_kw={'projection': ccrs.EqualEarth()})# 添加地理特征
ax.add_feature(cfeature.LAND, facecolor='lightgreen')
ax.add_feature(cfeature.OCEAN, facecolor='lightblue')
ax.add_feature(cfeature.COASTLINE, linewidth=0.5)
ax.add_feature(cfeature.BORDERS, linestyle=':', alpha=0.5)# 设置标题
ax.set_title('等距圆柱投影地图')plt.show()
效果展示
示例3:在地图上绘制点和线
在地图上标记特定的地理点或绘制路径。
Python示例代码
import matplotlib.pyplot as plt
import pylab as mpl
import cartopy.crs as ccrs
import cartopy.feature as cfeaturempl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False# 创建地图
fig, ax = plt.subplots(figsize=(10, 6), subplot_kw={'projection': ccrs.PlateCarree()})# 添加地理特征
ax.add_feature(cfeature.LAND, facecolor='lightgray')
ax.add_feature(cfeature.OCEAN, facecolor='skyblue')
ax.add_feature(cfeature.COASTLINE)
ax.add_feature(cfeature.BORDERS, linestyle=':')# 绘制点(北京和纽约)
beijing = (116.4, 39.9)
new_york = (-74.0, 40.7)
ax.plot(beijing[0], beijing[1], 'ro', markersize=8, label='海口')
ax.plot(new_york[0], new_york[1], 'bo', markersize=8, label='巴塞罗那')# 绘制连接线
ax.plot([beijing[0], new_york[0]], [beijing[1], new_york[1]], 'k--', transform=ccrs.Geodetic(), label='大圆航线')# 设置标题和图例
ax.set_title('地图上的点和线')
ax.legend()plt.show()
效果展示
三、高级示例
示例4:绘制全球温度分布
使用NetCDF数据绘制全球温度分布图。
Python示例代码
import matplotlib.pyplot as plt
import pylab as mpl
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import numpy as np
import netCDF4 as ncmpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False# 加载NetCDF数据(示例数据)
data = nc.Dataset('example_temperature.nc')
lons = data.variables['lon'][:]
lats = data.variables['lat'][:]
temp = data.variables['temperature'][:]# 创建地图
fig, ax = plt.subplots(figsize=(12, 8), subplot_kw={'projection': ccrs.PlateCarree()})# 添加地理特征
ax.add_feature(cfeature.LAND, facecolor='lightgray')
ax.add_feature(cfeature.OCEAN, facecolor='skyblue')
ax.add_feature(cfeature.COASTLINE)# 绘制温度分布
contour = ax.contourf(lons, lats, temp[0], levels=20, cmap='coolwarm', transform=ccrs.PlateCarree())
cbar = plt.colorbar(contour, ax=ax, orientation='horizontal', pad=0.05)
cbar.set_label('Temperature (°C)')# 设置标题
ax.set_title('全球温度分布')plt.show()
效果展示
示例5:制作动画地图
使用Matplotlib的动画功能制作地图动画。
Python示例代码
import matplotlib.pyplot as plt
import pylab as mpl
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import numpy as np
from matplotlib.animation import FuncAnimationmpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False# 创建地图
fig, ax = plt.subplots(figsize=(10, 6), subplot_kw={'projection': ccrs.PlateCarree()})# 添加地理特征
ax.add_feature(cfeature.LAND, facecolor='lightgray')
ax.add_feature(cfeature.OCEAN, facecolor='skyblue')
ax.add_feature(cfeature.COASTLINE)# 初始化动画
def init():return []# 更新动画
def update(frame):ax.clear()ax.add_feature(cfeature.LAND, facecolor='lightgray')ax.add_feature(cfeature.OCEAN, facecolor='skyblue')ax.add_feature(cfeature.COASTLINE)# 绘制动态点(示例:移动的点)x = np.sin(frame / 10) * 170y = np.cos(frame / 10) * 85ax.plot(x, y, 'ro', markersize=10, label=f'Frame {frame}')ax.legend()return []# 创建动画
ani = FuncAnimation(fig, update, frames=50, init_func=init, blit=True)
plt.title('动态地图动画')
plt.show()
效果展示
示例6:叠加遥感影像
在地图上叠加遥感影像。
Python示例代码
import matplotlib.pyplot as plt
import pylab as pl
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from cartopy.io.img_tiles import Stamenpl.rcParams['font.sans-serif'] = ['SimHei']
pl.rcParams['axes.unicode_minus'] = False# 创建地图
fig, ax = plt.subplots(figsize=(12, 8), subplot_kw={'projection': ccrs.PlateCarree()})# 添加遥感影像
tiler = Stamen('terrain-background')
ax.add_image(tiler, 6)# 添加地理特征
ax.add_feature(cfeature.COASTLINE)
ax.add_feature(cfeature.BORDERS, linestyle=':')# 设置范围(以中国为例)
ax.set_extent([70, 140, 15, 55], crs=ccrs.PlateCarree())# 设置标题
ax.set_title('叠加遥感影像的地图')plt.show()
效果展示
四、Cartopy常用函数及参数总结
以下是Cartopy库中常用函数及其参数的总结,帮助你快速查找和使用。
函数 | 参数 | 作用 | 示例值 |
---|---|---|---|
ccrs.PlateCarree() | 无 | 创建墨卡托投影 | ccrs.PlateCarree() |
ccrs.EqualEarth() | 无 | 创建等距圆柱投影 | ccrs.EqualEarth() |
ccrs.Orthographic() | central_latitude , central_longitude | 创建极地投影 | ccrs.Orthographic(90, 0) |
ax.add_feature() | feature , facecolor , edgecolor , zorder | 添加地理特征 | ax.add_feature(cfeature.LAND, facecolor='lightgray') |
ax.coastlines() | resolution , color , linewidth | 添加海岸线 | ax.coastlines(resolution='50m', color='black') |
ax.stock_img() | 无 | 添加默认背景图 | ax.stock_img() |
ax.set_extent() | extent , crs | 设置地图范围 | ax.set_extent([70, 140, 15, 55], crs=ccrs.PlateCarree()) |
ax.gridlines() | draw_labels , xlocs , ylocs , color | 添加网格线 | ax.gridlines(draw_labels=True) |
cfeature.NaturalEarthFeature() | category , name , scale , facecolor | 创建自定义地理特征 | cfeature.NaturalEarthFeature('physical', 'ocean', '50m', facecolor='skyblue') |
五、总结
通过本文的介绍和示例,你已经掌握了Cartopy库的基本用法和一些高级技巧。Cartopy不仅功能强大,而且易于使用,能够帮助你快速绘制出专业级别的地图。无论是科研、数据分析还是地理信息系统开发,Cartopy都是一个不可或缺的工具。希望你能通过这些示例激发出更多的创意,动手实践,绘制出属于自己的地图。资源绑定附上完整cartopy库学习资源供读者参考学习!