目录

上一个主题

11. [补充] Cartopy 地图绘图

下一个主题

11.2. 开始使用 Cartopy

关注公众号


常见问题

  1. Windows下的安装说明
  2. Jupyter免费在线实验环境
  3. 勘误与补充


>>> import helper; helper.info();
页面更新时间: 2020-03-01 15:38:36
操作系统/OS: Linux-4.19.0-8-amd64-x86_64-with-debian-10.3 ;Python: 3.7.3

11.1. Cartopy 介绍

Cartopy是一个Python包,用于地理空间数据处理,以便生成地图和其他地理空间数据分析。 Cartopy利用了强大的PROJ.4、NumPy和Shapely库,并在Matplotlib之上构建了一个编程接口,用于创建发布质量的地图。 cartopy的主要特点是面向对象的投影定义,以及在投影之间转换点、线、向量、多边形和图像的能力。 您会发现 Cartopy 对于大尺度/小比例尺数据特别有用,在这些数据中,球数据的笛卡尔假设通常会被打破。 如果你曾经经历过极点的奇点或日期线的截止点,你很可能会欣赏 Cartopy 的独特功能!

11.1.1. 入门

《安装指南》提供了有关启动和运行的信息。Cartopy的文档是以用户指南的形式排列的,其中有内联的参考文档。

  • Cartopy 中的坐标系

  • Cartopy 投影列表

  • 将cartopy与matplotlib一起使用

  • Cartopy 特性接口

  • 理解变换和投影关键字

  • 使用cartopy shapereader

  • Cartopy开发人员接口

11.1.2. 参与其中

Cartopy最初是在英国气象局开发的,目的是让科学家能够快速、方便、最重要的是准确地在地图上可视化他们的数据。 Cartopy是根据GNU Lesser通用公共许可证的条款免费提供的。它适用于各种科学领域,具有积极的发展群体。 有很多方法可以参与到cartopy的开发中:

  • 如果你写了一篇使用Cartopy的论文,请考虑引用它。

  • 如果您发布地图和绘图,请考虑数据所需的版权归属。

  • https://github.com/SciTools/cartopy/issues 报告代码或文档中的错误和问题(在生成新的错误之前,请查看是否有任何未解决的错误覆盖了该问题)。

  • 在StackOverflow上帮助其他人回答Cartopy问题。

  • 有助于文档修改排版,添加示例,更清楚地解释事物,甚至重新设计其布局/标志等。文档源与源代码保存在同一个存储库中。

  • 提供bug修复(github上可以找到未解决的bug列表)。

  • 为问题跟踪程序提供增强功能和新功能。

  • 在Gitter聊天室与用户和开发人员聊天。

11.1.3. 将 Cartopy 与 Matplotlib 一起使用

简单地图

Cartopy公开了一个接口,可以使用matplotlib轻松创建地图。 创建基本地图非常简单,只需告诉Matplotlib使用特定的地图投影,然后在轴上添加一些海岸线:

>>> %matplotlib inline
>>> import cartopy.crs as ccrs
>>> import matplotlib.pyplot as plt
>>>
>>> ax = plt.axes(projection=ccrs.PlateCarree())
>>> ax.coastlines()
>>>
>>> # Save the plot by calling plt.savefig() BEFORE plt.show()
>>> plt.savefig('coastlines.pdf')
>>> plt.savefig('coastlines.png')
>>>
>>> plt.show()
_images/cartopy-intro_3_0.png

与Matplotlib一起使用的可用投影的列表可以在Cartopy投影列表页上找到。 直线plt.axes(projection=ccrs.PlateCarree())建立了一个GeoAxes实例,该实例公开了各种其他与地图相关的方法,在前面的例子中,我们使用了coolides()方法将海岸线添加到地图中。 要保存图形,请使用Matplotlib的savefig()函数。 允许在不同投影中创建另一个地图,并使用stock_img()方法将参考底图图像添加到地图:

>>> import cartopy.crs as ccrs
>>> import matplotlib.pyplot as plt
>>>
>>> ax = plt.axes(projection=ccrs.Mollweide())
>>> ax.stock_img()
>>> plt.show()
_images/cartopy-intro_5_0.png

在这一点上,你可以选择你自己的投影,并创建一个顶部有海岸线的图像底图地图。

向地图添加数据

一旦你有了你想要的地图,数据可以添加到它完全一样的方式与正常的Matplotlib轴。 默认情况下,添加到地理轴的任何数据的坐标系都与地理轴本身的坐标系相同, 要控制给定数据所在的坐标系,可以使用适当的 cartopy.crs.crs 实例添加 transform 关键字:

>>> import cartopy.crs as ccrs
>>> import matplotlib.pyplot as plt
>>>
>>> ax = plt.axes(projection=ccrs.PlateCarree())
>>> ax.stock_img()
>>>
>>> ny_lon, ny_lat = -75, 43
>>> delhi_lon, delhi_lat = 77.23, 28.61
>>>
>>> plt.plot([ny_lon, delhi_lon], [ny_lat, delhi_lat],
>>>          color='blue', linewidth=2, marker='o',
>>>          transform=ccrs.Geodetic(),
>>>          )
>>>
>>> plt.plot([ny_lon, delhi_lon], [ny_lat, delhi_lat],
>>>          color='gray', linestyle='--',
>>>          transform=ccrs.PlateCarree(),
>>>          )
>>>
>>> plt.text(ny_lon - 3, ny_lat - 12, 'New York',
>>>          horizontalalignment='right',
>>>          transform=ccrs.Geodetic())
>>>
>>> plt.text(delhi_lon + 3, delhi_lat - 12, 'Delhi',
>>>          horizontalalignment='left',
>>>          transform=ccrs.Geodetic())
>>>
>>> plt.show()
_images/cartopy-intro_7_0.png

请注意,在平板地图上,纽约和德里之间的蓝色线不是直线,这是因为大地坐标系是一个真正的球面坐标系,其中两点之间的线被定义为地球上这些点之间的最短路径,而不是二维笛卡尔空间。

11.1.4. 注意

默认情况下,Matplotlib会根据打印的数据自动设置轴的限制。因为 Cartopy 实现了一个 GeoAxes 类,这相当于结果映射的限制。 有时这种自动缩放是一种理想的特性,而其他时候则不是。

要设置 Cartopy 地理轴的范围,有几个方便的选项:

  • 对于“全局”绘图,使用 set_global() 方法。

  • 要基于边界框在任何坐标系中设置地图的范围,请使用 set_extent() 方法。

  • 或者,可以在 GeoAxes 的本机坐标系中使用标准限制设置方法(例如 set_xlim()set_ylim() )。