跳转到主要内容
工程的博客

放大与地理空间分析洞察你的行业

通过Raela王

2021年2月11日 工程的博客

分享这篇文章

数据科学越来越普遍,大多数公司都利用分析和商业智能来帮助数据驱动的业务决策。但你增压与地理空间数据分析和决策?位置的情报,特别是地理空间分析,有助于揭示重要的区域趋势和行为影响你的生意。这超越看着位置数据聚合的邮政编码,有趣的是在美国和世界其他地方的不是一个好表示地理边界。

你是一个零售商试图找出是谁设置你的下一个商店或理解人流量,你的竞争对手正在在同一个小区?或者你在看该地区的房地产趋势来指导你的下一个最好的投资?你处理物流和供应链数据,确定仓库和燃料站位于哪里?或者你需要确定网络或服务热点,这样你可以调整供应来满足需求?这些用例都有一个共同的点,你可以运行一个点包容操作关联这些纬度和经度坐标各自地理几何图形。

技术实现

通常的实现方式点包容操作是使用一个SQL函数像st_intersects或从PostGIS st_contains,开源地理信息系统(GIS)的项目。你也可以使用Apache火花™几包像Apache塞多纳(以前称为Geospark)或Geomesa提供类似的功能在一个分布式的方式执行,但这些函数通常涉及一个昂贵的地理空间加入这将需要一段时间来运行。在这篇文章中,我们将看看如何使用H3与火花帮助加速大点包容问题,这可以说是最常见的一个地理空间的工作负载,许多人将从中获益。

我们介绍了超级的H3图书馆过去的博客。作为一个回顾,H3是一个地理空间网格系统,接近地理特性,比如多边形或分一组固定的可识别的六角形细胞。这可以帮助规模大或计算昂贵的大数据的工作量。

在我们的示例中,WKT数据集,我们使用的是包含多多边形,可能不适合与H3 polyfill实现。确保我们的管道返回准确的结果,我们需要把多多边形分割成单独的多边形。

将多多边形转化为多边形在加入之前将确保最准确的结果当使用H3为地理空间分析网格系统。
% scala进口org.locationtech.jts.geom.GeometryFactory进口scala.collection.mutable.ArrayBufferdef getPolygon = udf ((几何:几何)= >{varnumGeometries = geometry.getNumGeometries ()varpolygonArrayBuffer =ArrayBuffer(几何)()(geomIter

多边形分割后,下一步是创建函数,定义一个H3指数点和多边形。规模与火花,你需要包装您的Python或Scala函数到火花UDF年代。

% scalaval res =7/ / H3的分辨率指数1.2公里val点= df.withColumn (“h3index”十六进制(geoToH3(坳(“pickup_latitude”)、坳(“pickup_longitude”),点燃(res))))points.createOrReplaceTempView (“点”)
              val多边形= wktDF.withColumn (“h3index”,multiPolygonToH3(坳(“the_geom”),点燃(res))).withColumn (“h3”爆炸(美元)“h3index”)).withColumn (“h3”十六进制(美元)“h3”))polygons.createOrReplaceTempView (“多边形”)

H3支持决议0 - 15 0是六边形的长度约1107公里,15是一个细粒度的六边形的长度约50厘米。你应该选择一个决议,是理想的数量的倍数独特的多边形数据集。在这个例子中,我们一起去解决7。

地理空间分析的H3网格系统支持决议0-15。

这里要注意的一件事是,使用H3为点包容操作会给你近似结果,我们本质上是为速度而牺牲准确性。选择一个粗粒度的决议可能意味着你失去一些多边形边界精度,但您的查询将运行很快。选择一个细粒度的分辨率会给你更好的准确性也增加即将到来的连接查询的计算成本,因为你将有更多独特的六边形加入。选择正确的决议是一种艺术,你应该考虑具体你需要你的结果。考虑到你的GPS点可能不准确,也许放弃一些对速度精度是可以接受的。

点和多边形和H3索引,是时候运行连接查询。而不是运行一个空间命令st_intersects或st_contains这里,这将触发一个昂贵的空间加入,现在您可以运行一个简单的火花H3索引列内连接。你点包容的顺序查询现在可以运行分钟数十亿点和数千或数百万多边形。

%sql选择*点p内心的加入多边形年代p.h3=s.h3

如果你需要更多的准确性,另一个可能的方法是利用H3指数减少传递到地理空间连接的行数。您的查询将会看起来像这样,你st_intersects()或st_contains()命令将来自第三方包就像Geospark或者Geomesa:

%sql选择*点p内心的加入形状的年代p.h3=s.h3在哪里st_intersects (st_makePoint (p。pickup_longitude p.pickup_latitude) s.the_geom);

潜在的优化

这是常见的运行与地理空间数据数据倾斜。例如,您可能会收到更多的手机GPS数据点从城市地区相比,人烟稀少的地区。这意味着可能会有某些H3指数比其他人有更多的数据,而这引发SQL join介绍倾斜。这是真的在我们的数据集笔记本的例子我们看到一个巨大的数量的出租车接送点在纽约曼哈顿的其他部分相比。我们可以利用斜提示来帮助连接性能。

首先,确定你的顶级H3指数。

显示器(points.groupBy (h3)。().orderBy(美元“数”。desc))

然后,重新运行与斜提示连接查询定义的最高指数或指数。你也可以尝试广播多边形表如果是小到可以装进你的记忆工作节点。

选择/ * +斜(points_with_id_h3, h3, (892 a100c68fffff))、广播(多边形)* /*点p内心的加入多边形年代p.h3=s.h3

同时,别忘了有桌子有行左边的加入。在加入这降低了洗牌,可以极大地提高性能。

注意,引发3.0的新的吗自适应查询执行(AQE),需要手动广播或优化倾斜可能会消失。如果你最喜欢的地理空间包支持火花3.0今天,做看看如何利用AQE,加快你的工作!

数据可视化

可视化H3六边形的一个好方法是使用Kepler.gl,这也是由超级。有一个为开普勒PyPi图书馆。gl砖内,你可以利用笔记本。指的是这个笔记本的例子如果你有兴趣尝试。

开普勒。gl库运行在一台机器上。这意味着你需要样本可视化前大型数据集。您可以创建一个随机样本的结果点包容加入和把它变成熊猫dataframe并传递到Kepler.gl。

地理空间分析的H3网格系统支持决议0-15。

现在,您可以探索点,多边形和内六角网格地图上砖笔记本。这是一个伟大的方式来验证你点包容映射的结果!

试着笔记本

请注意:笔记本时可能不会正确显示在浏览器中查看。为达到最佳效果,请下载并运行在你的砖工作区。

免费试着砖

相关的帖子

看到所有工程的博客的帖子