本文来源公众号“python”,仅用于学术分享,侵权删,干货满满。
大家好,今天为大家分享一个有趣的 Python 库 - cartopy。
Github地址:https://github.com/SciTools/cartopy
在地理数据的可视化和空间分析中,Cartopy
是一个强大的 Python 库,专门用于处理和绘制地图及地理信息。它基于 Matplotlib 提供丰富的地理投影、轮廓图、等高线图等功能,广泛应用于气象学、地球科学、海洋学和其他与地理空间数据相关的领域。Cartopy
支持各种地图投影和坐标变换,能够轻松地将地理数据可视化,使研究人员和开发者能够对复杂的地理数据进行深入分析。
安装
Cartopy
的安装稍微复杂一些,因为它依赖于多个底层库,如 GEOS
、PROJ
和 Shapely
。
推荐使用 conda
进行安装,以确保所有依赖正确安装:
conda install -c conda-forge cartopy
如果使用的是 pip
,则可以尝试以下命令进行安装,但可能需要手动安装一些依赖项:
pip install cartopy
安装完成后,确保 Matplotlib 也已安装,因为 Cartopy
依赖它来绘制图形。
特性
-
多种地图投影:支持多种地图投影,如等经纬线投影(PlateCarree)、墨卡托投影、北极/南极投影等。
-
灵活的地理绘图:能够绘制大陆、湖泊、河流、海岸线等地理特征。
-
坐标变换:支持在不同的地图投影间进行坐标变换,确保地理数据的正确显示。
-
绘制地理数据:支持绘制矢量数据、栅格数据,如地理信息系统(GIS)文件和气象数据(如风场、等温线)。
-
与 Matplotlib 无缝集成:可以与 Matplotlib 配合使用,充分利用 Matplotlib 的绘图功能进行地理数据的展示。
基本功能
1. 创建基本地图
使用 Cartopy
,可以轻松创建一个基本的地图,并添加海岸线、国家边界等地理特征。
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
# 创建地图并使用 PlateCarree 投影
fig = plt.figure(figsize=(8, 6))
ax = plt.axes(projection=ccrs.PlateCarree())
# 添加海岸线
ax.coastlines()
# 设置标题
plt.title('基础地图示例')
plt.show()
在这个示例中,使用了 PlateCarree
投影来绘制一个简单的世界地图,并添加了海岸线。通过 Cartopy
,可以快速生成带有地理特征的基本地图。
2. 绘制国家边界和河流
除了海岸线之外,Cartopy
还支持绘制国家边界、河流、湖泊等地理特征。
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
# 创建地图并使用 Robinson 投影
fig = plt.figure(figsize=(8, 6))
ax = plt.axes(projection=ccrs.Robinson())
# 添加地理特征
ax.coastlines()
ax.add_feature(cartopy.feature.BORDERS, linestyle=':')
ax.add_feature(cartopy.feature.RIVERS)
# 设置标题
plt.title('带有边界和河流的地图')
plt.show()
在这个示例中,使用了 Robinson 投影,并添加了国家边界和河流。Cartopy
内置了多个地理特征,可以通过 cartopy.feature
轻松添加到地图上。
3. 坐标网格
Cartopy
支持在地图上添加经纬度网格,以便更好地展示地理信息。
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
# 创建地图并使用 PlateCarree 投影
fig = plt.figure(figsize=(8, 6))
ax = plt.axes(projection=ccrs.PlateCarree())
# 添加海岸线
ax.coastlines()
# 添加经纬度网格
ax.gridlines(draw_labels=True)
# 设置标题
plt.title('带有坐标网格的地图')
plt.show()
这个示例展示了如何在地图上绘制经纬度网格,并且显示网格标签(即经纬度坐标)。
高级功能
1. 坐标变换和地图投影
Cartopy
提供了对不同投影之间进行坐标变换的能力,这在需要展示不同地理区域或进行精确测量时非常重要。
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
# 创建地图并使用北极投影
fig = plt.figure(figsize=(8, 8))
ax = plt.axes(projection=ccrs.NorthPolarStereo())
# 添加海岸线
ax.coastlines()
# 设置标题
plt.title('北极投影地图')
plt.show()
在这个示例中,使用了 NorthPolarStereo
投影,绘制了一个以北极为中心的地图。
2. 绘制等高线图
Cartopy
支持在地图上绘制等高线图和等值线图,这对于展示气象或地形数据非常有用。
import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
# 生成模拟数据
lon = np.linspace(-180, 180, 181)
lat = np.linspace(-90, 90, 91)
lon2d, lat2d = np.meshgrid(lon, lat)
data = np.sin(np.radians(lat2d)) * np.cos(np.radians(lon2d))
# 创建地图
fig = plt.figure(figsize=(10, 5))
ax = plt.axes(projection=ccrs.PlateCarree())
# 添加海岸线
ax.coastlines()
# 绘制等高线
cs = ax.contour(lon, lat, data, levels=10, colors='k')
ax.clabel(cs, inline=1, fontsize=10)
# 设置标题
plt.title('等高线图示例')
plt.show()
这个示例展示了如何生成模拟的地理数据并绘制等高线图,能够有效地展示地形变化或气象数据。
3. 使用矢量数据
Cartopy
可以处理矢量数据文件,如 GeoJSON、Shapefile 等。可以通过 cartopy.io.shapereader
读取并展示这些矢量数据。
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.io.shapereader as shpreader
# 创建地图
fig = plt.figure(figsize=(8, 6))
ax = plt.axes(projection=ccrs.PlateCarree())
# 添加海岸线
ax.coastlines()
# 读取 Shapefile 数据
shapefile = shpreader.natural_earth(resolution='110m', category='cultural', name='admin_0_countries')
reader = shpreader.Reader(shapefile)
# 绘制国家边界
for record in reader.records():
ax.add_geometries([record.geometry], ccrs.PlateCarree(), edgecolor='black')
# 设置标题
plt.title('Shapefile 数据绘制示例')
plt.show()
通过这个示例,可以加载并绘制 Shapefile 数据,展示全球国家边界。
总结
Python Cartopy
是一个功能强大的地理数据可视化工具,广泛应用于气象学、地球科学、航空航天、海洋学和地理信息系统等多个领域。它基于 Matplotlib 提供丰富的地理投影、轮廓图和数据展示功能,帮助开发者轻松地处理复杂的地理数据。
THE END !