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

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Uber Golang规范是Uber专门为其Golang代码库制定的一套代码编写指南和规范。以下是Uber Golang规范的主要特点: 命名规范:采用驼峰命名法,遵循Go语言的命名约定。使用有意义且描述性强的名称,避免使用缩写。 包和依赖管理:使用Go的标准工具go mod来管理包和依赖。在代码库的根目录下创建go.mod文件,明确定义需要使用的外部依赖。 代码布局:代码文件应按照功能逻辑进行组织,每个文件夹下应包含一个独立的Go模块。避免使用过深的嵌套文件夹结构。 错误处理:在函数签名中使用`error`类型,以便清晰地表示可能出现的错误。避免使用panic来处理错误,而是使用返回错误信息来处理。 并发:使用Go语言提供的并发原语,如goroutine和channel,来编写并发代码。避免使用传统的同步原语,如互斥锁。 测试:为每个包编写相应的测试代码,测试代码应放在与源代码相同的包中,以便方便进行单元测试。使用`go test`来运行测试。 文档:代码应有清晰的注释,包括每个公共函数和方法的文档注释。注释应使用规范的格式,方便生成文档。 性能优化:在编写代码时要考虑性能,并进行必要的性能优化。可以使用Go的性能分析工具来找出性能瓶颈并进行优化。 此外,Uber Golang规范还提供了关于代码风格、错误处理、日志记录、版本管理和代码重用等方面的指导。遵循这些规范可以使代码更易于理解、维护和扩展,并提高代码库的整体质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

虾神说D

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

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

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

打赏作者

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

抵扣说明:

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

余额充值