注意

This page was generated from 画廊/绘图底图背景.ipynb.
Interactive online version: Binder badge

向图表添加背景地图#

本示例演示了如何为使用 geopandas .plot() 方法创建的图形添加背景底图。这利用了 contextily 包从多个来源(OpenStreetMap, CartoDB)获取网页地图图块。还可以查看 contextily 的 入门指南 以了解此处未涵盖的可能新功能。

[1]:
import geopandas
import geodatasets
import contextily as cx

让我们使用在geopandas数据集中可获得的纽约市区边界数据。绘制这个会得到以下结果:

[2]:
df = geopandas.read_file(geodatasets.get_path("nybb"))
ax = df.plot(figsize=(10, 10), alpha=0.5, edgecolor="k")
../_images/gallery_plotting_basemap_background_3_0.png

匹配坐标系统#

在将网络地图瓦片添加到该图之前,我们首先需要确保瓦片和数据的坐标参考系统 (CRS) 匹配。网络地图瓦片通常是以 Web Mercator (EPSG 3857) 提供的,因此我们先来检查一下我们的纽约市区使用的是什么 CRS:

[3]:
df.crs
[3]:
<Projected CRS: EPSG:2263>
Name: NAD83 / New York Long Island (ftUS)
Axis Info [cartesian]:
- X[east]: Easting (US survey foot)
- Y[north]: Northing (US survey foot)
Area of Use:
- name: United States (USA) - New York - counties of Bronx; Kings; Nassau; New York; Queens; Richmond; Suffolk.
- bounds: (-74.26, 40.47, -71.8, 41.3)
Coordinate Operation:
- name: SPCS83 New York Long Island zone (US survey foot)
- method: Lambert Conic Conformal (2SP)
Datum: North American Datum 1983
- Ellipsoid: GRS 1980
- Prime Meridian: Greenwich

现在我们知道坐标参考系统(CRS)不匹配,所以我们需要选择一个我们希望可视化数据的坐标参考系统:要么是瓦片的坐标参考系统,要么是数据的坐标参考系统,甚至可以是另一个不同的坐标参考系统。

匹配 CRS 的第一个选项是利用 to_crs GeoDataFrames 方法将我们的数据的 CRS 转换为 Web Mercator:

[4]:
df_wm = df.to_crs(epsg=3857)

我们可以使用 add_basemap 函数来轻松地为我们的绘图添加背景地图:

[5]:
ax = df_wm.plot(figsize=(10, 10), alpha=0.5, edgecolor="k")
cx.add_basemap(ax)
../_images/gallery_plotting_basemap_background_9_0.png

如果我们想要转换瓦片的坐标参考系统,这对于大型数据集可能是明智的,我们可以使用 crs 关键字参数的 add_basemap,如下所示:

[6]:
ax = df.plot(figsize=(10, 10), alpha=0.5, edgecolor="k")
cx.add_basemap(ax, crs=df.crs)
../_images/gallery_plotting_basemap_background_11_0.png

这个函数将地图切片重新投影到目标坐标参考系统,这在某些情况下可能会导致清晰度损失。有关该主题的更多信息,请参阅 contextily’s guide on warping tiles

控制细节层级#

我们可以使用可选的 zoom 关键字来控制地图瓷砖的细节(注意不要指定过高的 zoom 级别,因为这可能会导致下载量大)。:

[7]:
ax = df_wm.plot(figsize=(10, 10), alpha=0.5, edgecolor="k")
cx.add_basemap(ax, zoom=12)
../_images/gallery_plotting_basemap_background_15_0.png

选择不同的样式#

默认情况下,contextily 使用 OpenStreetMap HOT 风格。我们可以使用 cx.providers 指定不同的风格:

[8]:
ax = df_wm.plot(figsize=(10, 10), alpha=0.5, edgecolor="k")
cx.add_basemap(ax, source=cx.providers.CartoDB.Positron)
ax.set_axis_off()
../_images/gallery_plotting_basemap_background_18_0.png

作为覆盖添加标签#

有时候,当你在底图上绘制数据时,这些数据会遮挡一些重要的地图元素,比如标签,这些元素你希望可以清晰可见。一些地图瓷砖提供者提供多个部分透明的瓷砖集来解决这个问题,而 contextily 会尽力自动检测这些透明层并将它们放在顶部。

[9]:
ax = df_wm.plot(figsize=(10, 10), alpha=0.5, edgecolor="k")
cx.add_basemap(ax, source=cx.providers.CartoDB.PositronNoLabels)
cx.add_basemap(ax, source=cx.providers.CartoDB.PositronOnlyLabels)
../_images/gallery_plotting_basemap_background_21_0.png

通过像这样划分图层,您还可以独立地操作每个图层的缩放级别,例如,可以在仍显示大量细节的同时使标签更大。

[10]:
ax = df_wm.plot(figsize=(10, 10), alpha=0.5, edgecolor="k")
cx.add_basemap(ax, source=cx.providers.CartoDB.PositronNoLabels, zoom=12)
cx.add_basemap(ax, source=cx.providers.CartoDB.PositronOnlyLabels, zoom=10)
../_images/gallery_plotting_basemap_background_23_0.png