当前位置:网站首页 > 技术博客 > 正文

gep算法程序



文章目录

最近需要实现一个功能,查找车辆附近的加油站,如果车和加油站距离在200米以内,则查找成功。

加油站数量肯定不小,能否缩小查找范围,否则以遍历形式,效率肯定高不了。

Geohash算法就是将经纬度编码,将二维变一维,给地址位置分区的一种算法。

经纬度常识

基本原理

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

我们知道,经度范围是东经180到西经180,纬度范围是南纬90到北纬90,我们设定西经为负,南纬为负,所以地球上的经度范围就是[-180, 180],纬度范围就是[-90,90]。如果以本初子午线、赤道为界,地球可以分成4个部分。

如果纬度范围[-90°, 0°)用二进制0代表,(0°, 90°]用二进制1代表,经度范围[-180°, 0°)用二进制0代表,(0°, 180°]用二进制1代表,那么地球可以分成如下4个部分

如果在小块范围内递归对半划分呢?

可以看到,划分的区域更多了,也更精确了。geohash算法就是基于这种思想,划分的次数更多,区域更多,区域面积更小了。通过将经纬度编码,给地理位置分区

Geohash算法

Geohash算法一共有三步。

首先将经纬度变成二进制。

比如这样一个点(39., 116.) 纬度的范围是(-90,90),其中间值为0。对于纬度39.,在区间(0,90)中,因此得到一个1;(0,90)区间的中间值为45度,纬度39.小于45,因此得到一个0,依次计算下去,即可得到纬度的二进制表示,如下表:

最后得到纬度的二进制表示为:

同理可以得到经度116.的二进制表示为:

第2步,就是将经纬度合并。

经度占偶数位,纬度占奇数位,注意,0也是偶数位。

第3步,按照Base32进行编码

Base32编码表(其中一种):

Base32编码表的其中一种如下,是用0-9、b-z(去掉a, i, l, o)这32个字母进行编码。具体操作是先将上一步得到的合并后二进制转换为10进制数据,然后对应生成Base32码。需要注意的是,将5个二进制位转换成一个base32码。上例最终得到的值为

Geohash比直接用经纬度的高效很多,而且使用者可以发布地址编码,既能表明自己位于北海公园附近,又不至于暴露自己的精确坐标,有助于隐私保护。

GeoHash的精度

编码越长,表示的范围越小,位置也越精确。因此我们就可以通过比较GeoHash匹配的位数来判断两个点之间的大概距离。

问题

geohash算法有两个问题。首先是边缘问题。

如图,如果车在红点位置,区域内还有一个黄点。相邻区域内的绿点明显离红点更近。但因为黄点的编码和红点一样,最终找到的将是黄点。这就有问题了。

要解决这个问题,很简单,只要再查找周边8个区域内的点,看哪个离自己更近即可。

另外就是曲线突变问题。

本文第2张图片比较好地解释了这个问题。其中0111和1000两个编码非常相近,但它们的实际距离确很远。所以编码相近的两个单位,并不一定真实距离很近,这需要实际计算两个点的距离才行。

代码实现

geohash原理清楚后,代码实现就比较简单了。不过仍然有一个问题需要解决,就是如何计算周边的8个区域key值呢

假设我们计算的key值是6位,那么二进制位数就是 6*5 = 30位,所以经纬度分别是15位。我们以纬度为例,纬度会均分15次。这样我们很容易能够算出15次后,划分的最小单位是多少

得到了最小单位,那么周边区域的经纬度也可以计算得到了。比如说左边区域的经度肯定是自身经度减去最小经度单位。纬度也可以通过加减,得到上下的纬度值,最终周围8个单位也可以计算得到。

可以到 进行geohash编码,以确定自己代码是否写错

整体代码如下所示:

geohash在mysql中的使用

mysql中有四个内置函数跟geohash相关。

具体使用方法可参考:https://dev.mysql.com/doc/refman/8.0/en/spatial-geohash-functions.html#function_st-geohash

简单使用

结果

其中可以传入WKT类型的字符串生成geometry对象。

参考:https://www.jianshu.com/p/2fd0cf12e5ba https://www.cnblogs.com/feiquan/p/11380461.html https://blog.csdn.net/ununie/article/details/100521397 https://blog.csdn.net/youhongaa/article/details/78816700

  • 上一篇: android studio amd模拟器
  • 下一篇: html语言表单
  • 版权声明


    相关文章:

  • android studio amd模拟器2024-12-25 12:30:00
  • 网页内容爬虫2024-12-25 12:30:00
  • 计算psnr算法2024-12-25 12:30:00
  • gedit 搜索2024-12-25 12:30:00
  • 如何管理电脑开机自动启动的软件2024-12-25 12:30:00
  • html语言表单2024-12-25 12:30:00
  • dapper querymultiple2024-12-25 12:30:00
  • 在线python编辑器搭建2024-12-25 12:30:00
  • 回归模型预测未来数据2024-12-25 12:30:00
  • 多目标优化百度百科2024-12-25 12:30:00