首页 > 编程语言 >空间点索引算法-GeoHash

空间点索引算法-GeoHash

时间:2022-09-05 10:47:42浏览次数:89  
标签:rad double 索引 算法 GeoHash lat1r 字符串 deg

介绍

GeoHash是一种空间地址编码方法,能够把二维的空间经纬度数据编码成一个字符串。

一个字符串代表某一矩形区域,矩形区域内所有的点都共享相同的GeoHash字符串。相当于给区域内的点做了一个索引。

算法过程

对一个地理坐标编码时,按照初始区间范围纬度[-90,90]和经度[-180,180],计算目标经度和纬度分别落在左区间还是右区间。落在左区间则取0,右区间则取1。然后,对上一步得到的区间继续按照此方法对半查找,得到下一位二进制编码。当编码长度达到业务的进度需求后,根据“偶数位放经度,奇数位放纬度”的规则,将得到的二进制编码穿插组合,得到一个新的二进制串。最后,根据base32的对照表,将二进制串翻译成字符串,即得到地理坐标对应的目标GeoHash字符串。

注意:北纬为正、南纬为负,东经为正、西经为负。

为什么经纬度交错

保证相近的点,有相同的前缀。

base32算法

包含数字、小写字母。去掉a、i、l、o这4个字母。

字符串中的每一位和位置的关系

奇数位、纬度

640?wx_fmt=png

偶数位、经度

640?wx_fmt=png

特征

算法实际上就是对一个区域不断分形,分形的次数越多,表示的区域越小,精度越高。

公共前缀的长度越长,这两个点距离越近。反之,不成立。

精度计算

一般来说8位可以满足一般需求。

preview

计算两个点之间的举例

double geohashGetDistance(double lon1d, double lat1d, double lon2d, double lat2d) {
    double lat1r, lon1r, lat2r, lon2r, u, v;
    lat1r = deg_rad(lat1d);
    lon1r = deg_rad(lon1d);
    lat2r = deg_rad(lat2d);
    lon2r = deg_rad(lon2d);
    u = sin((lat2r - lat1r) / 2);
    v = sin((lon2r - lon1r) / 2);
    return 2.0 * EARTH_RADIUS_IN_METERS *
           asin(sqrt(u * u + cos(lat1r) * cos(lat2r) * v * v));
}

当区域较小(10km*10km)时,可以使用泰勒展式简化计算,避免计算三角函数。

获取点附近的八个区域

可以根据位置关系,推算出点附近的八个区域。效率很高。

组件支持

Redis

PostgreSQL

网址

http://api.map.baidu.com/lbsapi/getpoint/index.html 获取经纬度

http://geohash.co/ 经纬度和geohash转换

https://en.wikipedia.org/wiki/Geohash

标签:rad,double,索引,算法,GeoHash,lat1r,字符串,deg
From: https://www.cnblogs.com/txtp/p/16657238.html

相关文章

  • 【iOS逆向】某营业厅算法分析
    阅读此文档的过程中遇到任何问题,请关注公众号【移动端Android和iOS开发技术分享】或加QQ群【812546729】1.目标使用fridastalker分析某营业厅的签名算法。2.操作环境......
  • MPI学习笔记(四):矩阵相乘的Cannon卡农算法
    mpi矩阵乘法:C=αAB+βC一、Cannon卡农算法基本介绍1、二维矩阵串行乘法两个n维方阵的乘法A×B=C的串行计算公式为:下图是用图示来表示的这种计算规则:2、二维块划分的......
  • LightGBM 算法概述
    LightGBM算法概述简要解释LightGBMLightGBM(LightGradientBoostingMachine)是一个开源的机器学习算法。它是基于决策树的算法,使用梯度提升来集成树。您可以在GitHu......
  • NOIP复习(二)二分算法
    提供一种二分写法,不太用考虑边界的问题。intl=st,r=ed,ans=ed+1;while(l<=r){intmid=(l+r)>>1;if(check(mid))ans=mid,l=mid+......
  • 数据结构预算法学习笔记 —— 双端队列(Deque)
    双端队列(Deque)1.简介双端队列是一种有次序的数据集。和队列相似,其两端也可以称作为”首“”尾“段,但deque中数据项既可以从队首加入,也可以从队尾加入。同样,数据项也可以......
  • 迪杰斯特拉算法
    1.应用场景-最短路径问题看一个应用场景和问题:1)战争时期,胜利乡有7个村庄(A,B,C,D,E,F,G),现在有六个邮差,从G点出发,需要分别把邮件分别送到A,B,C,D,E,F六......
  • 计算机算法设计与分析第一章总结
    1.1算法与程序算法的性质:输入、输出、确定性、有限性。程序是算法用某种程序设计语言的具体实现,可以不满足算法的有限性。1.2算法复杂性分析算法复杂性是......
  • 数据结构与算法学习笔记 —— 队列(Queue)
     队列Queue1.简介队列是一种有次序的数据集合,其特征是数据项的添加和移除分别发生在该集合的两端:-数据项的添加发生在尾端(rear)-现存数据的移除发生在首......
  • letcode算法--10.三数之和
    给你一个整数数组nums,判断是否存在三元组[nums[i],nums[j],nums[k]]满足i!=j、i!=k且j!=k,同时还满足nums[i]+nums[j]+nums[k]==0。请你返回所有......
  • 十大排序算法之【插入排序】
    插入排序的原理很简单:斗地主理牌的时候怎么操作就怎么操作。最简易版代码实现:#include<bits/stdc++.h>voidinsert_sort(vector<int>&in){for(inti=0;i<in.s......