Uber H3算法实现蜂窝六边形聚合

Uber H3算法实现蜂窝六边形聚合

比之前些年不同,蜂窝多边形是近几年点数据聚合的主要趋势。

640?wx_fmt=jpeg

经纬度的聚合最早也最常用的方式的geohash:

640?wx_fmt=jpeg

GeoHash的原理就是按照区域,把经纬度进行编码,按照不同的网格精度,变成不同位数的编码,在同一区域中的编码相同。

比如上图里面的那个例子,如果两个坐标的前6位相同,那么表示在第六级精度格网上,两个坐标处于同一个格网。这样,我们就可以按照编码的内容,按照不同的精度聚合位置点数据了。

但是geohash一类的矩形算法,有以下两个显著的缺陷:

1、在不同纬度的地区会出现地理单元单位面积差异较大的情况: 

640?wx_fmt=jpeg

2、在常用的地理范围查询中,基于矩形的查询方法,存在8邻域到中心网格的距离不相等的问题,也就是说六边形网格与周围网格的距离有且仅有一个,而四边形存在两类距离,三角形有三类距离:

640?wx_fmt=jpeg

六边形的周围邻居到中心网格的距离却是相等的,从形状上来说更加接近于圆形。而且六边形也是边数最多的无缝多边形。

所以,基于hexagon的地理单元已经成为各大厂家的首选,比如 Uber 和 Didi 的峰时定价服务。

这种这种背景下,六边形的应用也来越广,比如ArcGIS Desktop在10.3之后,专门内置生成蜂窝多边形的工具:

640?wx_fmt=jpeg

而且我以前也写过一遍,如何自己制作蜂窝多边形的算法:

而如果想要在比如Spark中实现蜂窝多边形聚合,怎么办呢?Uber开源了他的蜂窝多边形算法H3,让我们能够非常轻松的完成这个任务: 

640?wx_fmt=jpeg

具体算法和论文的地址: https://eng.uber.com/h3/

算法什么的,我这里就不去做解析,贯彻拿来主义和学以致用的原则,这里主要给大家介绍一下这个算法包的用法。

首先这个包是用C写的,要在Python上用,就必须要gccmake来进行编译,目前在Windows上木有编译成功,所以我就直接安装到了linux上面。

640?wx_fmt=jpeg

你也可以用pip进行安装,但是用pip安装的话,里面还有一些乱七八糟的编译过程可能会出问题,所以我这里直接用下载了源码包,用setuptools进行安装,如果你的系统里面没有cc、make和cmake的话,这个包还会自动给你安装,比如我这里还自动给安装了一个cmake:

640?wx_fmt=jpeg

最后经过一系列的编译,完成安装:

640?wx_fmt=jpeg

python包的地址:

https://pypi.org/project/h3/

安装完之后,我们来测试一下效果:

640?wx_fmt=jpeg

640?wx_fmt=jpeg

看第一级格网的时候,可以显著的发现,不同纬度,格网的大小是不同的,而随着级别增加,粒度更细的时候,网格的大小趋近于相等——实际上学过投影与坐标系的同学都知道,投影坐标系在大比例尺的时候,形变基本就可以忽略不计了。

最后给出h3的格网分级粒度:

640?wx_fmt=jpeg

需要进行哪个级别的聚合,只需要选择不同的精度就行,关键这个接口计算完成之后,还可以恢复回六边形的JSON坐标串,直接可以进行生成数据和可视化。真是居家旅行,杀人灭口必备之物。

下面给出H3的github地址,更多内容大家可以自行查阅

https://uber.github.io/h3/#/

里面有多种代码的实现:

640?wx_fmt=jpeg

大家按需取用。

上文中的代码,大家可以在我的github中自行下载

https://github.com/allenlu2008/PythonDemo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虾神说D

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值