跳到主要内容

前言

​ 在用 python 进行气象数据可视化时,尤其是在使用 matplotlib 和 cartopy 这两个包进行地图投影时,常常需要添加地理行政边界,有时更是要添加河流道路等信息。

​ 那么如何在图中添加这些信息呢?网上有各种各样的方式去添加,我建议是用到 cartopy 中的一个函数 Reader,利用这个函数,我们可以读取现有的地图文件,在我们所需要画的图上添加各种各样的信息。我的理由是:通过其他方式添加的地理信息并不全面,而且画出的图会出现敏感问题,不好分享。通过文件导入的方式可以有效的避免这样的问题,一是可以可以添加比较新的信息,二是这些信息得到许可,就不会存在那样的敏感问题。具体调用方式是:

from cartopy.io.shapereader import Reader

举个例子:

首先先导入相关的包

import matplotlib.pyplot as plt ## 常用的画图工具
import cartopy.crs as ccrs ## 确定地图投影,例如圆柱等距投影,兰伯特投影
import cartopy.feature as cfeature ##画特征,例如海岸线这些
from cartopy.io.shapereader import Reader # 通过文件来添加边界信息的

然后创建一个画布

fig = plt.figure(figsize=(9, 6), dpi=150)  # 画布大小
ax = fig.subplots(1, 1,subplot_kw={'projection':ccrs.LambertConformal(central_longitude=105,central_latitude=30)})

接下来就可以添加所需要添加的地理信息

ax.add_feature(cfeature.COASTLINE.with_scale('50m'))

ax.add_geometries(Reader('D:\\maplist\\China_province\\bou2_4l.shp').geometries(),ccrs.PlateCarree(),facecolor='none', edgecolor='gray', linewidth=0.8) ###添加省界

ax.add_geometries(Reader('D:\\maplist\\zhengzhou\\郑州市.shp').geometries(),ccrs.PlateCarree(),facecolor='none', edgecolor='r', linewidth=0.8) ###添加郑州市界

第一行就是添加海岸线这种的

第三行和第五行就是 Reader 函数的具体使用方式,一般搭配 add_geometries 使用

这样在我们所要画的图上就有了海岸线,中国各个省份的界线还有郑州市的市界。

具体效果:

a

下载 shp 文件

​ 可以看到 Reader 函数里的文件是以.shp 结尾的文件(没试过导入其他类型的文件,建议还是导入 shp 类型的文件)。shp 文件在网上可以下载到,本文推荐的是通过去阿里云可视化平台下载 json 文件,然后把 json 文件转换成 shp 文件的方法。

阿里云 DataV - 数据可视化平台 (aliyun.com) 下载 json 文件

mapshaper json 转 shp

在阿里云下载 json 文件

在进入阿里云 DataV - 数据可视化平台 (aliyun.com) 之后,选择自己所需要的区域,然后选择要不要包含子区域。(好像不能多选多个省市)

然后访问右边的网址,在新网页中你会看到一串数字,

按下Ctrl+S保存成 Json 文件(Ctrl+S之后他就默认 json 文件不用选择)

json 转 shp

在下载完 json 文件之后,去mapshaper 页面,选择你刚下载号的 json 文件,然后选择一些选项,比如保不保留分割线,选完之后点击 import 查看效果。

确认无误之后,点击右上角的 export,

在 File Format 选择 Shapefile 类型,

点击下面的 export 之后会下载一个压缩包,包里有三个文件,把他们放在同一个目录下,使用时导入 shp 文件即可。

这个网址还支持多个 json 文件一起输出成 shp 文件