Cartopy 入门


Basemap 程序包的功能相似,Cartopy 是一款专门绘制地图的 Python 程序包。由于 2020 年以后,Basemap 不再进行维护,因此官方建议 Basemap 用户逐渐转移到 Cartopy 上,目前 Cartopy 已经实现了 Basemap 的部分绘图功能。

绘图前奏

在绘制离线地图之前,建议到 Natural Earth 数据中心下载一些矢量图形文件以作备用。图形文件主要包括三种类型:Cultural、Physical、Raster,而每类图形文件都有三种比例尺(除 Raster 文件外):1cm:100km(适用于小尺度空间)、1cm:500km(适用于中等尺度空间)、1cm:1100km(适用于大尺度空间)。Cultural 图形文件主要包括全球的国界、省界/州界等信息,部分国家的著名的城市、交通运输线(公路、铁路、机场、港口)、公园,全球的时区分界线和城镇区域。Physical 图形文件主要包括海岸线、陆地、海洋、岛屿、江河、湖泊、水库、南极冰架、高山冰川、海底地形等信息。Raster 主要为立体化的(shaded)地形起伏数据。1cm:100km 的 Raster 文件包括陆地地形、水体、海底地形;1cm:500km 的 Raster 文件只包括陆地地形、水体,不包括海底地形。下载完三种类型的文件后,需要将所有的 Cultural 文件和 Physical 文件分别放入路径/Users/lichunxiao/.local/share/cartopy/shapefiles/natural_earthculturalphysical 目录中。

绘制全球地图

首先设置投影为正交投影,然后设置绘图范围为全球,最后添加陆地、海洋、海岸线、江河、湖泊等元素。

输出图像为

用 Cartopy 绘制全球地图
正交投影下全球的陆地和海洋

上例中陆地、海洋、海岸线、江河、湖泊的默认尺度为 1cm:1100km,下例将正交投影修改为 PlateCarree 投影,并添加了经纬度标示和背景图片。

输出图像为

世界地形

背景图片采用了 Cartopy 默认的 50-natural-earth-1-downsampled.png,该图片为简化的 1cm:500km 的 Raster 地形起伏。

绘制区域地图

基于亚洲地区的高分辨率地形图,结合 Natural Earth 的 Railroads 数据和 Urban Areas 数据绘制该地区的铁路网和城镇分布。

输出的图像为

亚洲地区的高分辨率地形、铁路网和城镇分布

上例采用了 1cm:500km 的高分辨率 Raster 地形起伏和 1cm:500km 的海岸线和 1cm:100km 的国界。通常数据的原始坐标系为 PlateCarree(),若投影坐标系不是 PlateCarree(),那么在使用数据作图(imshow、contour、contourf)时一定要声明 PlateCarree(),即务必要添加 transform=ccrs.PlateCarree()crs = ccrs.PlateCarree()

绘制 Contour

用 GLDASv2.1 的热流数据绘制亚洲地区的热流图。参考 GLDAS 数据下载及使用,下载 2002/04 ~ 2016/08 共 173 个月的 gldas 月文件(空间分辨率为 $0.25^{\circ}$)。以文件 “GLDAS_NOAH025_M.A200806.021.nc4” 为例,用 xarray 来读取 NETCDF 格式的文件内容。

输出结果为

打印 2008 年 6 月份,($25.125^{\circ}$N, $102.375^{\circ}$E)的 Latent heat net flux 信息。

输出结果为

打印 2008 年 6 月份,($25.125^{\circ}$N,$102.375^{\circ}$E)的 Sensible heat net flux 信息。

输出结果为

热流的单位为 $mW/m^2$,而不是 $W/m^2$,这点需要注意。下面的代码用来读取 173 个月的热流数据并计算 2002/04 ~ 2016/08 的平均热流。由于 xarray 读取 .nc4 文件速度较慢,因此这里用 Dataset 来读取 netCDF4 文件。

因为全球的数据量太大,因此为了节省计算时间,下面的代码用来提取亚洲地区的热流数据。

对亚洲地区的热流数据进行高斯光滑,然后将光滑后的热流绘制到地图上。

输出图像为

2002/04 ~ 2016/08 亚洲地区的平均表面热流

contourf 中的 zorder 命令为指定图层的顺序,0 表示最底层,越大的数值越接近顶层。


参考

发表评论

电子邮件地址不会被公开。 必填项已用*标注