水煮Redisson(二三)- GEO之地球一维化

前言

上一章介绍了Redisson地图索引接口的使用方式,这里介绍一下Geo内核-GeoHash的原理。

简单来说,GeoHash将三维的地球模型抽象成一维数据,每个节点代表了一个矩形区域,方便计算附近节点集合和相应的距离。

地球一维化

第一步:将地球二维化,并划分为32个大区域

第二步:细化矩形区域,每个节点代表一个小区域,并不断递归,矩形越小位置越精确

GeoHash用一个字符串表示经度和纬度两个坐标

拿一个地址举例说明【经纬度:33.762,38.465】,将经度和纬度两个数值,在下表中不断二分取值,最终会得到一串二进制编码。

经度

纬度

得到经纬度的二进制编码之后,将奇数为纬度,偶数为经度 进行整合,五位一组,返回0-31的十进制数据。

11001 -> 十进制为25,对应Base32为T

01110 -> 十进制为14,对应Base32为F
最终得到的GeoHash码为:tf

Base32编码参照,使用ezs42方案,丢弃ailo四个字母

GeoHash的精度问题

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

GeoHash编码的前缀可以表示更大的区域。例如wx4g0ec1,它的前缀wx4g0e表示包含编码wx4g0ec1在内的更大范围,这个特性可以用于附近地点搜索。编码越长,表示的范围越小,位置也越精确。因此我们就可以通过比较GeoHash匹配的位数来判断两个点之间的大概距离。

GeoHash每个精度对应的矩形大小

前面例子得到的GeoHash码为tf,长度为2,那么其代表的矩形区域范围为1250KM * 625KM

GeoHash的长度对应的地理位置误差范围

前面例子得到的GeoHash码为tf,长度为2,其误差大概为630KM。

应用上的一些问题

GeoHash在使用过程中,会碰到一些实际问题,下面列举两个最常见的。

边缘问题

要计算黄点附近最近的目标,如果按区域来算的话,蓝点在同一个区域,数学上更接近,但是在图中可以直观的看出,绿点在物理上与其距离更小。

曲线突变

曲线突变问题比较直观,拿上面的一个图来展示

0111区块和1000在数学上更接近,只相差1,但是在物理上其实与0010距离更小。

解决方案

上面两个问题,可以用同一种方案来解决,就是计算自身位置附近8个区域内,所有候选目标与自己的实际距离,最后再决定展示效果。至于如何获取这8个区域的GeoHash值,可以直接修改自身GeoHash的最后一位或者两位,因为都是相邻区域,GeoHash是有规律可循的。

相关推荐
咩咩啃树皮6 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
鱟鲥鳚7 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
大模型码小白8 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司9 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地10 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun31415910 小时前
TCP超时重传机制是为了解决什么问题?
java
二宝哥11 小时前
CentOS 7.9 系统下 Redis 5.0.4 单机安装与源码编译安装指南
redis·centos
莫逸风12 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
z1234567898613 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
yaoxin52112313 小时前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python