原文链接如下:
本文介绍了如何使用 Python 对大规模地理空间数据进行可视化。
作者通过引入datashader、geopandas 和 colorcet 等库,演示了如何处理和展示大规模数据,以及如何创建地理空间数据的可视化效果。
从读取空间数据到创建画布并聚合数据,再到使用 Datashader 进行数据渲染和导出图像,全面介绍了处理大规模地理空间数据的步骤和技巧。
以下是正文
在上一篇文章中,我讨论了如何从 Google 和 Microsoft 下载全世界建筑轮廓数据。
接下来的事情就是如何在我的机器上可视化几个G甚至更大的大数据。例如,我下载了印度尼西亚地区的 Microsoft 建筑轮廓,大小为 20.7 GB。
将如此大量的数据加载到 QGIS 中可视化只能使其崩溃。
所以最后,我们使用 Python 可视化了印度尼西亚的整个建筑物,如图 1 所示,其中仅截取了爪哇岛。
图 1. 印度尼西亚爪哇岛的建筑密度
下载了大型地理空间数据后,你可以会面临打不不开、各种操作卡顿等问题,那么您并不孤单。
这篇文章就是为了解决此类情况而量身定制的。在本教程中,我将指导您使用 Python 可视化大量数据。在本教程结束时,您应该能够可视化您自己的大规模地理空间数据。
第一步导入一些库(例如 datashader、geopandas 和 colorcet)开始本教程。
Datashader 是本教程中的一个主要库,它通过三个步骤可视化大数据:投影、聚合和转换。输出是栅格或图像,可将数据聚合可视化到图像的每个像素中。将大数据转换为栅格格式将极大地减小数据的大小,并且可以更快地查看。
Geopandas 用于在 Python 中处理空间数据,基本上它用于输入/输出空间数据、空间处理和分析。
最后,colorcet 库用于颜色映射。
import datashader as ds, datashader.transfer_functions as tfimport geopandas as gpdimport colorcet as cc
导入所有必需库后,可以获取并读取数据。
在本教程中,我使用了 Microsoft 道路数据集。该数据提取自 2020 到 2022 年间的 Bing 地图影像,包括 Maxar 和空客。
数据覆盖全球,总长度为4890万公里。它可以通过 Open Data Commons Open Database License(ODbL) 免费下载。另一个示例数据集可以从 geoparquet 网站获得。
要读取数据,我们可以使用 geopandas read_parquet() 函数,如下所示。
road_df=gpd.read_parquet('Roads.parquet')
数据将作为 dataframe 加载。因此,您可以使用 dataframe head() 方法快速查看数据行,如图 2 所示。此外,您还可以使用info()或describe()方法获取有关数据的其他信息。
road_df.head()
图 2. 道路 dataframe
在渲染数据之前,我们需要先创建一个画布。
以下代码用于创建宽 500 像素、高 400 像素的画布。
canvas = ds.Canvas(plot_width=500, plot_height=400)agg = canvas.line(road_df, geometry='geometry', agg=ds.count())
在下一行中,我们使用 canvas 对象的 line() 方法来渲染来自名为 road_df 的 DataFrame 的线条。我们来分解一下参数:
因此, agg 对象将表现 road_df 聚合到画布上的线,其中每个像素表示在该像素处重叠的线的数量。然后可以使用各种绘图库将这种聚合表示可视化。
聚合数据后,现在让我们可视化数据。
为此,我们需要创建一个包含 datashader 转换函数和一些已定义变量的变量,如以下代码所示
img = tf.shade(agg.where(agg>10), cmap=cc.fire, how="eq_hist")tf.set_background(img,"black")
让我解释一下这些变量:
在下一行中,我们使用转换模块中的 set_background() 函数将图像的背景颜色设置为黑色。
运行代码后,图像将如图 3 所示。
图3.东南亚道路
我们从一个大数据集中对东南亚区域进行了道路可视化,如果我们想查看数据的某些部分,例如特定地区或国家/地区,该怎么办?
为此,我们可以在 canvas 方法中定义 x_range 和 y_range 参数。这些参数由最小坐标和最大坐标组成。例如,我想查看菲律宾的道路,最小/最大经度(x)是119.756/126.726,最小/最大纬度(y)是5.099/19.069,如以下代码所示。
ph=((119.756,126.726),(5.099,19.069))canvas_ph = ds.Canvas(plot_width=300, plot_height=400,x_range=ph[0],y_range=ph[1])agg = canvas_ph.line(road_df,geometry='geometry', agg=ds.count())img = tf.shade(agg,cmap=cc.fire, how="eq_hist")tf.set_background(img,"black")
运行代码后,它将返回一个图像,显示菲律宾的道路,如图 4 所示。
图4.菲律宾道路
让我们尝试更多的可视化效果。
假设我们想突出显示最大的道路密度。为此,我创建了十个类灰色映射表,如下面代码中的第 4 行所示。
之后,我在颜色图列表中添加了“红色”,因为我想用红色突出显示最后 10% 的数据。结果如图 5 所示。
import numpy as npcanvas_ph = ds.Canvas(plot_width=300, plot_height=400,x_range=ph[0],y_range=ph[1])agg = canvas_ph.line(road_df,geometry='geometry', agg=ds.count())colormap = [(i,i,i) for i in np.linspace(0,255,9)]colormap += ["red"]img=tf.shade(agg, cmap = colormap, how='eq_hist')tf.set_background(img,"black")
图5.菲律宾道路。红色中表示密度最高
在创建了漂亮的可视化之后,我们当然希望将其保存到本地磁盘以用于其他目的,例如与其他人共享。
要获得图像输出,我们可以将其导出为图像。
from functools import partialfrom datashader.utils import export_imageexport = partial(export_image, background = "black", export_path="export")export(tf.shade(agg, cmap=colormap),"philippines roads")
总之,该代码设置了一个需要指定背景颜色和导出路径的函数,然后以“philippines roads”作为名称导出之前聚合数据渲染的图像。
这就是使用 Python 进行地理空间大数据可视化的全部教程。在本教程中,我们学习了如何使用 Python 中的 Datashader 读取大数据、数据聚合以及创建可视化。希望本教程有用