前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Python对大规模地理空间数据可视化

使用Python对大规模地理空间数据可视化

作者头像
陈南GISer
发布2024-05-30 17:01:22
1330
发布2024-05-30 17:01:22
举报
文章被收录于专栏:点点GIS点点GIS
今天是转载翻译的一篇 Python 教程文章,文章内容看上去不错,翻译+润色后分享给大家,不过GIS荟没有去复现尝试,极有存在一些翻译不到位、错误的地方,请注意。

原文链接如下:

  • Geospatial Big Data Visualization with Python.https://www.geodose.com/2024/03/geospatial-big-data-visualization-python.html

本文介绍了如何使用 Python 对大规模地理空间数据进行可视化。

作者通过引入datashader、geopandas 和 colorcet 等库,演示了如何处理和展示大规模数据,以及如何创建地理空间数据的可视化效果。

从读取空间数据到创建画布并聚合数据,再到使用 Datashader 进行数据渲染和导出图像,全面介绍了处理大规模地理空间数据的步骤和技巧。

以下是正文

在上一篇文章中,我讨论了如何从 Google 和 Microsoft 下载全世界建筑轮廓数据。

  • https://www.geodose.com/2023/08/how-to-download-google-microsoft-building-data.html

接下来的事情就是如何在我的机器上可视化几个G甚至更大的大数据。例如,我下载了印度尼西亚地区的 Microsoft 建筑轮廓,大小为 20.7 GB。

将如此大量的数据加载到 QGIS 中可视化只能使其崩溃。

所以最后,我们使用 Python 可视化了印度尼西亚的整个建筑物,如图 1 所示,其中仅截取了爪哇岛。

图 1. 印度尼西亚爪哇岛的建筑密度

下载了大型地理空间数据后,你可以会面临打不不开、各种操作卡顿等问题,那么您并不孤单。

这篇文章就是为了解决此类情况而量身定制的。在本教程中,我将指导您使用 Python 可视化大量数据。在本教程结束时,您应该能够可视化您自己的大规模地理空间数据。

导入库

第一步导入一些库(例如 datashader、geopandas 和 colorcet)开始本教程。

Datashader 是本教程中的一个主要库,它通过三个步骤可视化大数据:投影、聚合和转换。输出是栅格或图像,可将数据聚合可视化到图像的每个像素中。将大数据转换为栅格格式将极大地减小数据的大小,并且可以更快地查看。

Geopandas 用于在 Python 中处理空间数据,基本上它用于输入/输出空间数据、空间处理和分析。

最后,colorcet 库用于颜色映射。

代码语言:javascript
复制
import datashader as ds, datashader.transfer_functions as tfimport geopandas as gpdimport colorcet as cc

读取空间数据

导入所有必需库后,可以获取并读取数据。

在本教程中,我使用了 Microsoft 道路数据集。该数据提取自 2020 到 2022 年间的 Bing 地图影像,包括 Maxar 和空客。

  • Microsoft 道路数据集.https://github.com/microsoft/RoadDetections

数据覆盖全球,总长度为4890万公里。它可以通过 Open Data Commons Open Database License(ODbL) 免费下载。另一个示例数据集可以从 geoparquet 网站获得。

  • Open Data Commons 开放数据库许可证(ODbL).https://opendatacommons.org/licenses/odbl/
  • https://geoparquet.org/

要读取数据,我们可以使用 geopandas read_parquet() 函数,如下所示。

代码语言:javascript
复制
road_df=gpd.read_parquet('Roads.parquet')

数据将作为 dataframe 加载。因此,您可以使用 dataframe head() 方法快速查看数据行,如图 2 所示。此外,您还可以使用info()或describe()方法获取有关数据的其他信息。

代码语言:javascript
复制
road_df.head()

图 2. 道路 dataframe

创建画布和聚合数据

在渲染数据之前,我们需要先创建一个画布。

以下代码用于创建宽 500 像素、高 400 像素的画布。

代码语言:javascript
复制
canvas = ds.Canvas(plot_width=500,  plot_height=400)agg = canvas.line(road_df, geometry='geometry',  agg=ds.count())

在下一行中,我们使用 canvas 对象的 line() 方法来渲染来自名为 road_df 的 DataFrame 的线条。我们来分解一下参数:

  • road_df:这是包含我们要渲染的数据的DataFrame;
  • Geometry='geometry':此参数指定数据框中包含要绘制的线的几何信息(例如坐标)的列;
  • agg=ds.count():该参数指定我们要如何聚合数据。在本例中,我使用 ds.count() 来计算相关像素中数据的出现次数。

因此, agg 对象将表现 road_df 聚合到画布上的线,其中每个像素表示在该像素处重叠的线的数量。然后可以使用各种绘图库将这种聚合表示可视化。

使用 Datashader 渲染数据

聚合数据后,现在让我们可视化数据。

为此,我们需要创建一个包含 datashader 转换函数和一些已定义变量的变量,如以下代码所示

代码语言:javascript
复制
img = tf.shade(agg.where(agg>10), cmap=cc.fire,  how="eq_hist")tf.set_background(img,"black")

让我解释一下这些变量:

  • agg.where(agg > 10):过滤聚合数据 (agg),仅保留计数大于 10 的值。仅可视化具有较高线条密度的区域。
  • cmap=cc.fire:此参数指定用于为数据着色的颜色图。在本例中,我使用了 Colorcet 库中的“fire”颜色图。您可以在 Colorcet 文档中找到其他颜色图的名称。
    • https://colorcet.holoviz.org/
  • how="eq_hist":该参数指定映射颜色的直方图均衡方法。直方图均衡化通过拉伸范围来增强图像的对比度。

在下一行中,我们使用转换模块中的 set_background() 函数将图像的背景颜色设置为黑色。

运行代码后,图像将如图 3 所示。

图3.东南亚道路

查看数据指定区域

我们从一个大数据集中对东南亚区域进行了道路可视化,如果我们想查看数据的某些部分,例如特定地区或国家/地区,该怎么办?

为此,我们可以在 canvas 方法中定义 x_range 和 y_range 参数。这些参数由最小坐标和最大坐标组成。例如,我想查看菲律宾的道路,最小/最大经度(x)是119.756/126.726,最小/最大纬度(y)是5.099/19.069,如以下代码所示。

代码语言:javascript
复制
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 所示。

代码语言:javascript
复制
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.菲律宾道路。红色中表示密度最高

导出图像到本地

在创建了漂亮的可视化之后,我们当然希望将其保存到本地磁盘以用于其他目的,例如与其他人共享。

要获得图像输出,我们可以将其导出为图像。

代码语言:javascript
复制
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 读取大数据、数据聚合以及创建可视化。希望本教程有用

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 点点GIS 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 导入库
  • 读取空间数据
  • 创建画布和聚合数据
  • 使用 Datashader 渲染数据
  • 查看数据指定区域
  • 更多可视化
  • 导出图像到本地
相关产品与服务
大数据可视交互系统
RayData 是基于独有的渲染技术,结合云计算、AI、IoT,将大规模多样化的数据融合呈现,实现云数据实时可视化、场景化以及交互的管理方式,从而节省管理成本,提升数据辅助决策的效率。多年来丰富的大型项目交付经验辅以行业卓越的生态能力,使得 RayData 拥有远超行业水准的产品服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档