Cartopy 系列教程:安装并绘制地图

Cartopy是一个为地理空间数据处理设计的Python包,目的是生成地图和其他地理空间数据分析。

Cartopy利用了功能强大的PROJ、NumPy和Shapely库,并包括一个构建在Matplotlib之上的编程接口,用于创建发布质量地图。

cartopy的主要特征是其面向对象的投影定义,以及在这些投影之间转换点、线、向量、多边形和图像的能力。

总的来说,cartopy是一个强大的绘图工具。

1.安装后遇到可能会遇到的错误

ImportError: DLL load failed while importing trace: 找不到指定的模块。

去网上一查是cartopy的依赖出现错误,于是把以下几个包卸载重新安装

pip uninstall Pillow
pip uninstall pyshp
pip uninstall Shapely
pip uninstall pyproj

2 安装新的wheel

https://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载win10下二进制安装文件

从上述链接下载所需要的wheel
找不到的wheel, pyshp下载地址

重新安装Pillow、pyshp、Shapely、pyproj

3运行

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
ax = plt.axes(projection=ccrs.PlateCarree())
plt.title('World')
ax.coastlines(resolution='110m')

# plt.savefig('map.png')

plt.show()

好家伙,又报错,这次是因为网络的错误,因为数据在国外,要把数据下载到本地才能显示。

  File "\Python\Python39\lib\urllib\request.py", line 494, in _call_chain
    result = func(*args)
  File "\Python\Python39\lib\urllib\request.py", line 1385, in https_open
    return self.do_open(http.client.HTTPSConnection, req,
  File "\Python\Python39\lib\urllib\request.py", line 1345, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [WinError 10054] 远程主机强迫关闭了一个现有的连接。>
python-BaseException

出现这个错误是因为request.py导致的,什么原因呢?是因为你在开着科学上网的东西,当你用着科学上网,request.py铁定会报错。同理,你用pip安装新的包时,也不要开着猫猫软件。

好的,现在完成了cartopy的显示。

xfvq6e.png

一旦你创建一个plt。坐标轴对象,你可以向它添加东西。最基本的是由海岸线函数给出的大陆的实际轮廓。分辨率有三种可能:110米,50米和10米,从最粗到最好。还有其他获得更多细节的方法,如国家边界等,我将在下次讨论。

然后,使用matplotlib保存和显示地图。你最终会在屏幕上看到一个交互式地图,这个地图被保存到一个文件中。它看起来是这样的:

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
ax = plt.axes(projection=ccrs.PlateCarree())
plt.title('asia')
ax.set_extent([80, 154, 50, 0], ccrs.PlateCarree())
ax.coastlines(resolution='110m')
plt.savefig('map.png')
plt.show()

要绘制的区域由四个数字给出:前两个表示经度间隔,后两个表示纬度间隔。要获得这些数字,只需使用运行第一个示例时得到的交互式地图。ax.set_extent设置一个显示范围(起止的经纬度)。将鼠标悬停在地图上将显示点的坐标。现在我们得到:

xfz8xS.png

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
ax = plt.axes(projection=ccrs.PlateCarree())
plt.title('asia')
ax.set_extent([80, 154, 50, 0], ccrs.PlateCarree())
ax.coastlines(resolution='110m')
plt.plot(109.5,19.4,  markersize=5, marker='o', color='red')
plt.savefig('map.png')
plt.show()

最后你需要知道的是如何绘制点。结合matplotlib,使用plt.plot。因为我们已经使用了Cartopy中的坐标系统,所以我们用(经度、纬度)来指定这些点的坐标。下面是完整的例子:

根据海南的经纬度,在cartopy上把它标记为红色。

xfzJKg.png

对地图上色,使用ax.stock_img()语句,完整代码如下:

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
ax = plt.axes(projection=ccrs.PlateCarree())
ax.stock_img()
plt.title('asia')
ax.set_extent([80, 154, 50, 0], ccrs.PlateCarree())
ax.coastlines(resolution='110m')
plt.plot(109.5,19.4,  markersize=5, marker='o', color='red')
plt.savefig('map.png')
plt.show()
Python 3.9.1 (tags/v3.9.1:1e5d33e, Dec  7 2020, 17:08:21) [MSC v.1927 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 8.1.1 -- An enhanced Interactive Python. Type '?' for help.
PyDev console: using IPython 8.1.1

xhPmN9.png

当然,你可能还想对地图做更多的事情,比如更花哨的图形,这将在以后的教程中介绍!