一、介绍
Cartopy是一个Python开源地图制图库。它提供了一种简单而有效的方式来处理和可视化地理信息数据,并可以与众多其他Python数据处理库集成使用。Cartopy的主要目标是支持MATLAB用户和其他科学Python用户在地理坐标系中进行数据处理和绘图,从而使得地理数据处理变得更加容易。
二、功能
Cartopy提供了一些开放式源数据和地图投影转换工具,以及所有Earth Observation (EO)数据所需的地图制图功能。功能包含以下三个部分:
① 地理坐标系统(CRS)–实现了从输入投影(投影后坐标系)到输出投影(投影后坐标系)之间的基本转换,这是任何地图制图应用程序的基础。
② 地图特征–提供了一些标准的地图特征,比如河流、湖泊和国家边界等,方便制作基本图。
③ 矢量数据–Cartopy支持geojson、shapely或任何其他类型的矢量输入数据。
三、Cartopy安装指南(Python 3.x)
pip install cartopy
如果您使用的是Ubuntu 14.04及以上的操作系统,可以使用以下命令安装:
sudo apt-get install libproj-dev proj-data proj-bin
使用Anaconda环境,可以使用以下命令安装:
conda install -c conda-forge cartopy
四、使用Cartopy处理地理数据
1. 绘制简单地理数据
在Cartopy中,我们可以轻松地绘制各种地理数据。以下是一个使用Cartopy画出地球的例子:
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(10, 4))
ax = fig.add_subplot(1, 1, 1,
projection=ccrs.PlateCarree())
ax.coastlines()
plt.show()
在这个例子中,我们使用ccrs.PlateCarree()定义绘图的投影方式,并使用ax.coastlines()绘制海岸线。
2. 绘制地理数据和点
以下示例展示如何在一个Cartopy图形中绘制地图数据和点:
import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
lat = np.array([42.58, 40.01])
lon = np.array([-121.52, -113.80])
fig = plt.figure(figsize=(9, 4))
ax = fig.add_subplot(1, 1, 1,
projection=ccrs.PlateCarree())
transform = ccrs.PlateCarree()._as_mpl_transform(ax)
ax.add_feature(cfeature.OCEAN)
ax.add_feature(cfeature.LAND)
ax.add_feature(cfeature.COASTLINE)
ax.add_feature(cfeature.BORDERS)
ax.scatter(lon, lat, s=40, marker='o',
color='red', transform=transform)
plt.show()
在这个例子中,我们添加了POLITICAL和OCEAN特征,并使用ax.scatter()在地图上绘制出两个点。
3. 绘制等值线和色带
以下示例展示了如何在Cartopy中绘制等值线和色带图:
import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
x = np.linspace(-10, 10, 500)
y = np.linspace(-10, 10, 500)
X, Y = np.meshgrid(x, y)
Z = np.sin(X)*np.cos(Y)+np.random.rand(*X.shape)*0.1
fig = plt.figure(figsize=(10, 4))
ax = fig.add_subplot(1, 1, 1, projection=ccrs.Robinson())
levels = np.linspace(-1.2, 1.2, 40)
plt.contourf(X, Y, Z, levels=levels, cmap='RdBu_r')
plt.colorbar()
ax.coastlines()
plt.show()
在这个例子中,我们首先使用np.linspace()和np.meshgrid()函数生成一些数据,然后在调用plt.contourf()函数时指定等值线的级别和色带颜色。
4. 绘制覆盖层和标记
以下示例展示了如何在Cartopy中绘制温度数据、省界和标记:
import cartopy.crs as ccrs
from cartopy.mpl.ticker import (LongitudeFormatter,
LatitudeFormatter)
import matplotlib.pyplot as plt
import cartopy.feature as cfeature
import pandas as pd
from cartopy.io import shapereader
from matplotlib import cm
data = pd.read_csv('temperature.csv')
province = shapereader.Reader('province.shp')
res = []
for record in province.records():
name = record.attributes['name']
geometry = record.geometry
res.append((name, geometry))
fig = plt.figure(figsize=(10, 6))
ax = fig.add_axes([0.05, 0.05, 0.9, 0.9],
projection=ccrs.PlateCarree())
for name, geometry in res:
ax.add_geometries([geometry], crs=ccrs.PlateCarree(),
edgecolor='black', facecolor='none',
linewidths=0.5)
lats = data['latitude']
lons = data['longitude']
temp = data['temperature']
norm = plt.Normalize(temp.min(), temp.max())
cmap = cm.RdYlBu_r
ax.scatter(lons, lats, s=50, c=temp, cmap=cmap, norm=norm,
transform=ccrs.PlateCarree())
ax.set_extent([110, 125, 30, 43], crs=ccrs.PlateCarree())
ax.set_xticks(np.arange(110, 126, 5), crs=ccrs.PlateCarree())
ax.set_yticks(np.arange(30, 44, 5), crs=ccrs.PlateCarree())
lon_formatter = LongitudeFormatter(zero_direction_label=True)
lat_formatter = LatitudeFormatter()
ax.xaxis.set_major_formatter(lon_formatter)
ax.yaxis.set_major_formatter(lat_formatter)
ax.add_feature(cfeature.LAND.with_scale('50m'))
ax.add_feature(cfeature.OCEAN.with_scale('50m'))
ax.add_feature(cfeature.RIVERS.with_scale('50m'))
plt.show()
在这个例子中,我们在地图上添加了省级界线特征,使用plt.Normalize()函数来规范化温度,然后使用ax.scatter()绘制温度数据点和标记。
五、总结
Cartopy是Python中用于制作地图和处理地理数据的最佳库之一。Cartopy内置了广泛的地图特征,可以集成地形图、国家边界、海洋和河流等信息。同时,Cartopy还支持多种地图投影方式和数据格式,适合各种地图制图需求。尽管在绘制过程中可能需要花费一些时间,但使用Cartopy可以轻松地绘制复杂的地图,定制化地显示您的数据,并使您的科学数据更加易于理解。