美文网首页大数据开发
地理索引(Uber h3)

地理索引(Uber h3)

作者: 麦三刀 | 来源:发表于2019-03-12 19:36 被阅读0次

动态空间划分(R-tree)

静态空间划分(GeoHash、S2、H3)

    空间划分知识:http://www.cocoachina.com/cms/wap.php?action=article&id=20309

    GeoHash

        四叉树

                    经度、纬度的二分来分块,逻辑最简单。

        Z-行空间遍历

        编码方式

                所在层级经纬度二分下标(0、1),先经后纬,逐层排列。

    Google S2

        正方体投影

            以正方体投影作为基准,六个面逐级纬度二分。

        希尔伯特曲线

                相邻相近

                等距连续?

        编码方式

                六面ID+ 所在层级经纬度二分下标(0、1),受曲线旋转影响,逐层排列。

        映射修正

                使面积差距小

                线性变换:s = 0.5 * (1 + u)

                tan变换:s = 2 / pi * (atan(u) + pi / 4) = 2 * atan(u) / pi + 0.5

                二次变换(Uber选择):u >= 0,s = 0.5 * sqrt(1 + 3*u) 

                                                            u < 0, s = 1 - 0.5 * sqrt(1 - 3*u)

    Uber H3

        官网

                https://uber.github.io/h3/#/documentation/overview/introduction

        怎么划分空间

                假设正x多边形,y个顶点相接:360 / y = ((x-2)*180) / x 

y = 2x / (x-2)

                        正整数解只有(3,6、4,4、6,3)

                正六多边形优点

                        相邻单元距离相等

                        近似圆

                                自身近似圆形,贴合密度概念,很适合大多数的汇总分析场景。

                                周围相近近似圆形且等距,方便附近查找,阶梯分析等

                Uber怎么做?

                         想要的一个优点,分割后面积相同。

                        面积相同的正六边形不能构建成球形。

                        正二十面体

 正二十面体

                        基本单元

H3基本块

                                正二十面体,交点有五个边。每一个基本单元做上图图示的分割。

                                全球被划分为12个正五边形和110个正六边形的基本单元。

                        Dymaxion map

                                戴美克森氏地图(Dymaxion map)或称富勒地图(Fuller map),Richard Buckminster Fuller发明。建筑师。

                                dymaxion(最大限度利用能源的,以最少结构提供最大强度的),这个词来源于三个单词:Dynamic,意思是动力,Maximum,意思是最多、最大,还有ion,是一个原子或是一个电极中一组原子。

                                选择二十面体的顶点在水中,尽量避免常规应用中同时使用五边形和六边形。

                        逐级等分

                                可支持16级拆分

                                第一层基础单元格,15级(编码方式决定)的等面积拆分。

        基本元素

            单元格(cell)

                    普通的各级分裂的结果

            有向格

                    单元格增加一个以六条边为基础的维度,可以表示从一个单元格到另一个共边单元格的意向,相当于记录两个有共边的单元格,当需要时,可以将边缘转换回原始索引或目标索引。

                    分为单向格(Unidirectional Edge)和双向格(bidirectional edge)。

            IJK坐标系

                    一种平面六边形网络中的三轴坐标系。为六边形网络中的每一个元素提供唯一路径。

            FaceIJK坐标系

                    H3 核心运算使用的坐标系。

                    由二十面体基本单元ID + IJK坐标系构成。有两种类型(R. Buckminster Fuller定义):

                    0层使用ClassII;逐层摇摆,交替使用。

            其他坐标系

                    https://uber.github.io/h3/#/documentation/core-library/coordinate-systems

        编码方式

                使用64位,一个Long值的长度来记录一个基本类型。

                ·· 前4位表示索引模式:0:无效;1:单元格;2:单向格;3:双向格。

                ·· 3位表示共边ID(模式2和模式3有效)。

                ·· 4位表示当前索引级别(0-15)。

                ·· 7位表示基本单元格ID(0-121)。

                ·· 每3位一个层级,逐层排列(3*15)。

                ·· 队尾未被使用的位置1。

                拆分编码:( 五边形拆分中废弃下标1)

            应用场景

                    普通索引

                            高精度的数据,模糊到选定的H3粒度,作为数据的索引使用。

                    附近搜

                            K环(kRing):

                                    根据指定中心点,得到指定单位距离内(K)的其他单元格,非常方便的实现附近的需要。发挥近似圆的优势。

                    多边形索引

                            指定粒度切分指定多边形,得到多边形覆盖的单元格,并且提供压缩功能。

        jar使用

                groupId:com.uber

                artifactId:h3

                version:

                H3Core h3 = H3Core.newInstance();

                h3.xxx();

        性能

                普通应用场景和geohash的使用场景并无实质性的区别,但是等面积、近圆的特性,在一些场景,会降低实现算法的难度。

                多边形索引的场景,需要围栏预处理工作,然后做两个Btree的关联运算,具体性能对比,待测试。

        缺点

                上下级的不完全覆盖(蓝色区域举例),一些应用场景要注意。

            编码方式对普通索引不友好

如下:同一个经纬度,在不同层级的索引值

000100000000011000111111111111111111111111111111111111111111111

8031fffffffffff

000100000010011000110111111111111111111111111111111111111111111

8131bffffffffff

000100000100011000110011111111111111111111111111111111111111111

82319ffffffffff

000100010010011000110011101101010101001110000111111111111111111

89319daa9c3ffff

000100011110011000110011101101010101001110000011101000000110011

8f319daa9c1d033

如果使用压缩算法,上级(压缩后)的索引值和下级(压缩前)的索引值,没有办法命中普通数据库之类的的普通索引,大大的限制了压缩算法的使用场景。

解决方式:

擦除索引层级标记

000100000100011000110011111111111111111111111111111111111111111&111111100001111111111111111111111111111111111111111111111111111

000100010010011000110011101101010101001110000111111111111111111&111111100001111111111111111111111111111111111111111111111111111

-->

000100000000011000110011111111111111111111111111111111111111111

000100000000011000110011101101010101001110000111111111111111111

截断后面无效的1

000100000000011000110011111111111111111111111111111111111111111

000100000000011000110011101101010101001110000111111111111111111

-->

000100000000011000110011

000100000000011000110011101101010101001110000

base8编码?

就可以在使用压缩算法节省存储空间的同时,又可以命中普通Btree索引。

跨Base区怎么办?

        分割(投影)算法不完美

不只有概念描述中的五边形、六边形;   

会有七边形,甚至十边形(出现在正二十面体的交线上);

相关文章

  • 地理索引(Uber h3)

    动态空间划分(R-tree) 静态空间划分(GeoHash、S2、H3) 空间划分知识:http://www.co...

  • Uber H3使用

    Uber H3地理索引 正六边形优点 首先正六边形相邻单元距离相等,且近似圆,不仅自身近似圆形,贴合密度概念,很适...

  • mongodb

    完全的索引支持 单键索引,多键索引,数组索引,全文索引,地理位置索引。

  • 数据库索引融会贯通

    索引的各种规则纷繁复杂,不了解索引的组织形式就没办法真正地理解数据库索引。通过本文,你可以深入地理解数据库索引在数...

  • MongoDB地理空间索引

    MongoDB支持几种类型的地理空间索引,其中最常用的使2dsphere索引(用于地球表面类型的地图)和2d索引(...

  • What I Read(3) 地理空间数据库原理(C) 地理空间

    引用部分均为笔者思考. 1. 引入 1.1 何谓地理空间索引 地理空间索引是在存储空间数据时依据空间对象的位置和形...

  • 👋嗨,介绍一款地理数据可视化神器——keplergl

    简介 keplergl是由Uber开源的一款地理数据可视化工具,通过keplergl我们可以在Jupyter no...

  • 硅谷没看到的机会

    2016-06-28丁小贝(译) 硅谷被看作是数字创新的地理中心。从Google到Facebook,从Uber到N...

  • 地理位置索引-2d索引

    ``` > db.location.ensureIndex({"w":"2d"}) { "createdColle...

  • MongoDB实现地理位置查询

    Mongodb地理位置查询文档MongoDB支持地理位置索引,可以直接用于位置距离计算和查询。查询结果默认将会由近...

网友评论

    本文标题:地理索引(Uber h3)

    本文链接:https://www.haomeiwen.com/subject/suxopqtx.html