首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

高效多维空间点索引算法 — GeohashGoogle S2

文章很长,如果来不及看完,只需要记得,如果你需要一种高效空间点索引算法来处理海量空间点查找需求,那么GeohashGoogle S2可以帮助到你。...并且 Z 阶曲线具有局部保序性。 Z 阶曲线通过交织点坐标值二进制表示来简单地计算多维度z。...解决多维空间点索引需要解决2个问题,第一,如何把多维降为低维或者一维?第二,一维曲线如何分形? 1....S2其实是来自几何数学一个数学符号 S²,它表示是单位球。S2 这个库其实是被设计用来解决球面上各种几何问题。...在 Google S2 ,它是把地球展开成如下样子: 如果上面展开6个面,假设都用5阶希尔伯特曲线表示出来的话,6个面会是如下样子: 回到 S2 上面来,S2是用正方形。

2.4K50

高效多维空间点索引算法 — GeohashGoogle S2

并且 Z 阶曲线具有局部保序性。 Z 阶曲线通过交织点坐标值二进制表示来简单地计算多维度z。...解决多维空间点索引需要解决2个问题,第一,如何把多维降为低维或者一维?第二,一维曲线如何分形? 1....S2其实是来自几何数学一个数学符号 S²,它表示是单位球。S2 这个库其实是被设计用来解决球面上各种几何问题。...本篇文章讲解以 Go 这个版本为主。 接下来就看看怎么用 S2解决多维空间点索引问题。 1. 球面坐标转换 按照之前我们处理多维空间思路,先考虑如何降维,再考虑如何分形。...S2 Cell ID 数据结构 最后需要来谈谈 S2 Cell ID 数据结构,这个数据结构直接关系到不同 Level 对应精度问题。 ? 在 S2 ,每个 CellID 是由64位组成

3.3K60
您找到你想要的搜索结果了吗?
是的
没有找到

【系统设计】邻近服务

可能你已经发现了一些规律,上图每个网格,它们都相同前缀 wtw3。是的,Geohash 特点是,两个网格相同前缀部分越长,就表示它们位置是邻近。...如下图,比如确保每个网格数量不超过10,如果超过,就拆分为四个小网格。 请注意,四叉树是一种内存数据结构,它不是数据库解决方案。它运行在每个LBS 服务上,数据结构是在服务启动时构建。...Google S2希尔伯特曲线 Google S2 库是这个领域另一个重要参与者,和四叉树类似,它是一种内存解决方案。它基于希尔伯特曲线把球体映射到一维索引。...希尔伯特曲线一个重要特点是 降维,可以把多维空间转换成一维数组,可以通过动画看看它是如何实现。 在一维空间上搜索比在二维空间上搜索效率高得多了。...总结 在本文中,我们设计了一个邻近服务,介绍了4种常见了实现方式,分别是二维搜索,Geohash, 四叉树和 Google S2

1K10

Google S2 CellID 是如何生成

笔者在《高效多维空间点索引算法 — GeohashGoogle S2》文章详细分析了 Google S2 算法实现思想。文章发出来以后,一部分读者对它实现产生了好奇。...前一篇文章《高效多维空间点索引算法 — GeohashGoogle S2》里面有谈到这个问题,读者有些疑惑点,这里再最终解释一遍。...至此已经说清楚了希尔伯特曲线方向和在 Google S2 中生成希尔伯特曲线阶数,五阶希尔伯特曲线。...关于希尔伯特曲线生成动画,见上篇《高效多维空间点索引算法 — GeohashGoogle S2》—— 希尔伯特曲线构造方法 这一章节。 那么现在我们再推算55就比较简单了。...---- 空间搜索系列文章: 如何理解 n 维空间和 n 维时空 高效多维空间点索引算法 — GeohashGoogle S2 Google S2 CellID 是如何生成

1.7K20

Redis GeoHash核心原理解析

但是对于空间上一个点(二维,包括经度和纬度),如何排序呢?又如何索引呢?解决方法很多,下文介绍一种方法来解决这一问题。...思想:如果能通过某种方法将二维点数据转换成一维数据,那样不就可以继续使用B树索引了嘛。那这种方法真的存在嘛,答案是肯定。...这个问题往往产生在边界处。 解决思路很简单,我们查询时,除了使用定位点GeoHash编码进行匹配外,还使用周围8个区域GeoHash编码,这样可以避免这个问题。 2....注意点 我们已经知道现有的GeoHash算法使用是Peano空间填充曲线,这种曲线会产生突变,造成了编码虽然相似但距离可能相差很大问题,因此在查询附近餐馆时候,首先筛选GeoHash编码相似的POI...计算出GeoHash,然后和数据库精度更高GeoHash前缀比较 8.空间索引 常见问题如何根据自己所在位置查询来查询附近50米POI(point of interest,比如商家、景点等

1.4K20

Geospatial Data 在 Nebula Graph 实践

地理空间索引用于基于空间谓词函数地理形状快速过滤,如:ST_Intersects、ST_Covers 等。 Nebula 使用Google S2库做空间索引。...S2 库将地球表面投影到一个外切正方体上,然后对正方体每一个正方形表面递归地进行 n 次四等,最后使用一条空间填充曲线--希尔伯特曲线去连接这些小正方格子中心。...当 n 无穷大时,这条希尔伯特曲线就几乎填满了正方形。 S2使用是 30 阶希尔伯特曲线。...因此,地理对象空间索引就是构建完全覆盖该地理形状 S2 格子集合。 当构建地理空间对象索引时,会构造一个完全覆盖被索引对象不同 S2 单元格集合。...S2 单元格来表示它,因此一个 point 对应一个索引条目;对于形状为 linestring 和 polygon 地理数据,我们使用多个不同 level S2 单元格来覆盖,因此会对应多个索引条目

75870

GeoHash核心原理解析

但是对于空间上一个点(二维,包括经度和纬度),如何排序呢?又如何索引呢?解决方法很多,下文介绍一种方法来解决这一问题。   ...思想:如果能通过某种方法将二维点数据转换成一维数据,那样不就可以继续使用B树索引了嘛。那这种方法真的存在嘛,答案是肯定。...GeoHash编码与我们一样(因为在同一个GeoHash区域块上),而较近餐馆GeoHash编码与我们不一致。...这个问题往往产生在边界处。 ? 解决思路很简单,我们查询时,除了使用定位点GeoHash编码进行匹配外,还使用周围8个区域GeoHash编码,这样可以避免这个问题。...2)我们已经知道现有的GeoHash算法使用是Peano空间填充曲线,这种曲线会产生突变,造成了编码虽然相似但距离可能相差很大问题,因此在查询附近餐馆时候,首先筛选GeoHash编码相似的POI点,

1.1K30

Geohash原理

Geohash编码,字符串相似的表示距离相近(特殊情况后文阐述),这样可以利用字符串前缀匹配来查询附近POI信息。...但是由于Peano曲线实现更加简单,在使用时候配合一定解决手段,可以很好满足大部分需求,因此TD内部Geohash算法采用是Peano空间填充曲线。 6. 使用注意点 a. ...GeoHash编码与我们一样(因为在同一个GeoHash区域块上),而较近餐馆GeoHash编码与我们不一致。...这个问题往往产生在边界处。 解决思路很简单,我们查询时,除了使用定位点GeoHash编码进行匹配外,还使用周围8个区域GeoHash编码,这样可以避免这个问题。 b. ...我们已经知道现有的GeoHash算法使用是Peano空间填充曲线,这种曲线会产生突变,造成了编码虽然相似但距离可能相差很大问题,因此在查询附近餐馆时候,首先筛选GeoHash编码相似的POI点,然后进行实际距离计算

82740

Google S2 四叉树求 LCA 最近公共祖先

寻找父亲节点和孩子节点 首先需要回顾一下希尔伯特曲线生成方式,具体代码见笔者上篇文章分析,在这个分析,有4个方向比较重要,接下来分析需要,所以把这4个方向图搬过来。 ?...希尔伯特曲线生成形式和这4个方向是密切相关如果忘记了这部分,还请回看之前笔者文章分析。...查找父亲节点 在 Google S2 ,由于默认生成出来 Cell 就是 Level 30 ,也就是 Level 最低,位于树最下层叶子节点。...LCA 查找最近公共祖先 关于 CellID 计算,还有很关键一部分就是查找最近公共祖先问题问题背景:给定一棵四叉树任意两个 Level CellID ,如何查询两者最近公共祖先。...---- 空间搜索系列文章: 如何理解 n 维空间和 n 维时空 高效多维空间点索引算法 — GeohashGoogle S2 Google S2 四叉树求 LCA 最近公共祖先 GitHub

89030

四叉树上如何希尔伯特曲线邻居 ?

希尔伯特曲线起点0在左上角方格,终点63在右上角方格。...关于 CellID 生成与数据结构,见笔者这篇《Google S2 CellID 是如何生成 ?》...全邻居 最后回来文章开头问那个问题中。如何在四叉树上如何希尔伯特曲线邻居 ?经过前文一些铺垫,再来看这个问题,也许读者心里已经明白该怎么做了。...---- 空间搜索系列文章: 如何理解 n 维空间和 n 维时空 高效多维空间点索引算法 — GeohashGoogle S2 Google S2 CellID 是如何生成 ?...Google S2 四叉树求 LCA 最近公共祖先 神奇德布鲁因序列 四叉树上如何希尔伯特曲线邻居 ?

1K10

Google S2如何解决空间覆盖最优解问题?

因此,接口只能用于计算近似方法,而不是具有各种各样由所有子类型实现虚拟方法。 6. Shape 形状 Shape 算是一切图形或者形状“基类”了。它可以最灵活方式表示几何多边形。...类似地,代表5个点形状将具有由一个边缘组成5个链。 Shape具有允许使用全局编号(边缘ID)或在特定链访问边方法。...特别是,如果minLevel> 0或者levelMod> 1,那么即使这不是必需,它也可能返回比期望 Cell 更多。 在上面的代码实现中标注了4处需要注意地方。...---- 空间搜索系列文章: 如何理解 n 维空间和 n 维时空 高效多维空间点索引算法 — GeohashGoogle S2 Google S2 CellID 是如何生成 ?...Google S2 四叉树求 LCA 最近公共祖先 神奇德布鲁因序列 四叉树上如何希尔伯特曲线邻居 ? Google S2如何解决空间覆盖最优解问题?

3.2K31

几个问题思考:时差问题、地图算法和 Windows 更新

如果人短时间内倒时差可以是双向,那情况就不同了。...这个背后数据结构是怎样呢?第一反应是想,如果可以经纬度分开处理,是不是就可以搞定?...本质上,类似这种二维到一维降维方式,都属于空间填充曲线,比如说最有名这种希尔伯特曲线Google s2geometry 用到。...我认为,这几个选项相对来说还是半夜里自动更新更好,只要被反复频繁唤醒问题能够解决,其次是关机时更新。...让用户决策也是一种打扰用户方式,因而不是一个最佳解决方案,然而,在不经过用户无法做出比较合理重要决定时候,是一个可以考虑实行方案。另外,对于不重要更新,完全可以等待,攒一批一起操作。

63320

通过数据组织优化加速基于Apache Iceberg大规模数据分析

但这种排序方法也只能对一个列效果是好如果参与排序列很多则会大大降低效果。所以我们需要找到一种方法来解决多列数据组织优化,来提升dataskipping效果。...它可以将多维空间问题降维到低维或者一维空间问题。常见有: Z阶曲线(Z-order curve)、皮亚诺曲线(Peano curve)、希尔伯特曲线(Hilbert curve)等。...image.png Z-Order曲线一个典型应用就是Geohash地理位置编码,它是一种分级数据结构,把空间划分成网格。...二维空间搜索范围通过Z-Order算法转换之后,可以变换为一维空间搜索问题。他有一个重要特性:一个点附近hash字符串总有公共前缀,并且公共前缀越长,两个点距离越近。...这给了我们启发,能否使用Z-Order算法来解决上面发现数据分布问题?事实上是可以,并且工业界也是这么做

2.4K141

redis | 九、redis之Geospatial

当在社交网站和其他大多数需要查询半径应用中使用时,这些偏差都不算问题。但是,在最坏情况下偏差可能是0.5%,所以一些地理位置很关键应用还是需要谨慎考虑。 2. 它是如何工作?...返回 计算出距离会以双精度浮点数形式被返回。如果给定位置元素不存在, 那么命令返回空。..., 但是 GEORADIUSBYMEMBER 中心点是由给定位置元素决定, 而不是 GEORADIUS 那样使用输入经度和纬度来决定中心点 指定成员位置被用作查询中心。...通常使用表示位置元素使用不同技术,使用Geohash位置52点整数编码。由于编码和解码过程中所使用初始最小和最大坐标不同,编码编码也不同于标准。...查询例子:http://geohash.org/sqdtr74hyu0. 与类似的前缀字符串是附近,但相反是不正确,这是可能,用不同前缀字符串附近。

62620

Google S2 四叉树求 LCA 最近公共祖先

寻找父亲节点和孩子节点 首先需要回顾一下希尔伯特曲线生成方式,具体代码见笔者上篇文章分析,在这个分析,有4个方向比较重要,接下来分析需要,所以把这4个方向图搬过来。...希尔伯特曲线生成形式和这4个方向是密切相关如果忘记了这部分,还请回看之前笔者文章分析。...到此读者应该对查找 CellID 孩子节点流程了然于心了。在 Google S2 ,查找孩子节点具体实现代码如下。...查找父亲节点 在 Google S2 ,由于默认生成出来 Cell 就是 Level 30 ,也就是 Level 最低,位于树最下层叶子节点。...LCA 查找最近公共祖先 关于 CellID 计算,还有很关键一部分就是查找最近公共祖先问题问题背景:给定一棵四叉树任意两个 Level CellID ,如何查询两者最近公共祖先。

11810

PHP进阶学习之Geo地图定位算法详解

Geohash提供了任意精度这样属性,以及逐渐从代码末尾删除字符以减小其大小(并逐渐失去精度)可能性。由于逐步精度下降结果,附近地方往往(但不总是)呈现类似的前缀。...共享前缀越长,两个地方越接近。 原理 能将一个地球上点表示成一串字母,并且相近地点字母共同前缀越多。这能让位置搜索在开发变得很容易。它原理就是依据上述说geoHash。...在PHP实现与应用 在了解了geo位置算法原理后,PHP开发过程我们便可以使用这一定位功能,目前解决位置定位和搜索功能方案有很多种,基于PHP,从本人自身实践推荐一下几种: 利用现成地图...API实现geo定位、搜索范围、计算距离等功能,如国内百度、高德等,很多免费API可以使用;如需更大更精确范围,可以使用googlegeo api,缺点就是每日请求次数有限制,如果是企业级别的应用...如果业务需求复杂度不高,在这里并不推荐直接使用PHP写,毕竟效率会比较低,而且这也不是业务关注重点,所以没必要重新造轮子。

1.3K20

【戴嘉乐 IPFS】基于IPFS和GeoHash构建具有地理位置价值服务DDApp(理论篇)

通过GeoHash算法可以大幅度提高在庞大位置数据检索效率,同时为应用提供便捷缓存机制。...,由于这些用户GeoHash字符串都是WX4ER,所以可以把WX4ER当作key,把该区域餐馆信息当作value来进行缓存,而如果使用GeoHash的话,由于区域内用户传来经纬度是各不相同,...我们已经知道现有的GeoHash算法使用是Peano空间填充曲线,这种曲线会产生突变,造成了编码虽然相似但距离可能相差很大问题,因此在基于个人位置查询附近Poi信息时,首先筛选GeoHash编码相似的...在研究IPFS存储性能过程,由于测试网络节点问题,有很严重数据传输瓶颈,且不稳定,短期内,很难将需要频繁更新以及百万级别数据检索逻辑事务放在IPFS这一层来做。...recursive=false&quiet=false&hash=sha2-256" PS:这边Demo采用是本地单节点数据上传,为了保障服务稳定性,建议使用ipfs-cluster节点集群解决方案

68310

Geohash算法原理及实现

文章目录 经纬度常识 基本原理 Geohash算法 问题 代码实现 geohash在mysql使用 最近需要实现一个功能,查找车辆附近加油站,如果车和加油站距离在200米以内,则查找成功...在数据库可以实现在一列上应用索引(某些情况下无法在两列上同时应用索引) GeoHash表示不是一个点,而是一个矩形区域 GeoHash编码前缀可以表示更大区域。...因此我们就可以通过比较GeoHash匹配位数来判断两个点之间大概距离。 问题 geohash算法有两个问题。首先是边缘问题。 ? 如图,如果车在红点位置,区域内还有一个黄点。...相邻区域内绿点明显离红点更近。但因为黄点编码和红点一样,最终找到将是黄点。这就有问题了。 要解决这个问题,很简单,只要再查找周边8个区域内点,看哪个离自己更近即可。 另外就是曲线突变问题。...不过仍然有一个问题需要解决,就是如何计算周边8个区域key呢 假设我们计算key是6位,那么二进制位数就是 6*5 = 30位,所以经纬度分别是15位。我们以纬度为例,纬度会均分15次。

1.6K20

GeoHash 经纬度坐标编码与解码算法

GeoHash编码存在问题 GeoHash 虽然能解决从二维到一维转变,但也存在一些问题。...但是如果现在不仅仅是三个位置,如果是几十万甚至是更多位置,我们应该如何处理呢?如果还是求任意两个位置欧式距离显然那是灾难性。...而GeoHash对这些位置进行编码,通过前缀匹配,匹配度越高位置就越相近,但是仔细想想如果两个位置被分到两个不同矩形区域中,它们匹配度很低,但是两个位置距离很近,比如下面的和红点距离近绿点显然和红点是在一个矩形区域中...出现这种问题原因是因为GeoHash采用了Peano空间填充曲线,填充过程 ?...解决思路很简单,我们查询时,除了使用定位点GeoHash编码进行匹配外,还使用周围8个区域GeoHash编码,这样可以避免这个问题

2.7K20
领券