Geohash编码

news2024/9/23 20:10:20

1. 简介

地理位置(经纬度坐标对)编码为字母数字串,将空间分为网格形状每个网格使用一个编码,是Z阶曲线的众多应用之一。

2. 编码原理

(1) 首先根据区域划分的精度大小选择Geohash的字符串的长度,合理将地图网格化;
(2) 将经纬度进行二分法编码,得到符合精度要求的二进制结果;
(3) 按照奇数位置放经度,偶数位置放纬度的规则,生成新的字符串,根据从左到右的顺序,每5位二进制数字转换为十进制数字,最后按照Geohash字母映射表,将十进制数字转换为Geohash字符串完成编码。

2.1 选择合适的字符串长度将地图网格化

Geohash的字符串长度可以表示区域的精度,字符串长度越长表示的区域范围越小,精度更高,误差更小,Geohash能够提供任意精度的分段级别。一般分级从1-12级。
字符串长度对应的区域矩形的大小
一旦选定 cell (矩形区域的精度)的宽和高,那么 Geohash 字符串的长度就确定下来了。这样就可以把地图分成了一个个的矩形区域。选定Geohash字符串的长度后,根据下表可知,经纬度所对应的二进制的位数也是确定的。

2.2 经纬度二分编码

假设选取字符串长度为6的矩形来网格化某张地图,已知的经纬度是[31.1932993, 121.43960190000007],利用二分法,纬度[-90,90],经度[-180,180]逐渐二分,根据1分配右区间,0分配左区间的原则,以此类推,直到精度符合要求为止,将经纬度编码为二进制,具体的操作步骤如下:
先处理纬度。地球的纬度区间是[-90,90]。把这个区间分为2部分,即[-90,0),[0,90]。31.1932993位于(0,90]区间,即右区间,标记为1。然后继续把(0,90]区间二分,分为[0,45),[45,90],31.1932993位于[0,45)区间,即左区间,标记为0。一直划分下去。

再处理经度,一样的处理方式。地球经度区间是[-180,180]

2.3 交叉混合进行base32编码

纬度产生的二进制是101011000101110,经度产生的二进制是110101100101101,按照“奇数位放经度,偶数位放纬度”的规则,(经度纬度经度纬度…)重新交叉组合经度和纬度的二进制串,生成新的二进制串:111001100111100000110011110110,最后一步就是把这个最终的字符串转换成字符,对应需要查找 base-32 的表。每5位二进制映射为1个十进制数字,11100 11001 11100 00011 00111 10110转换成十进制是 28 25 28 3 7 22,查下表,编码得到最终结果,wtw37q。
(用0-9、b-z(去掉a, i, l, o)这32个字母和数字进行base32编码。)
在这里插入图片描述

3. 优缺点

3.1 优点

(1)利用Z阶曲线进行编码。而Z阶曲线可以将二维或者多维空间里的所有点都转换成一维曲线。并且 Z 阶曲线还具有局部保序性。
(2)利用前缀匹配,提高查询搜素效率。两个geohash编码之间的公共前缀越长,在空间越接近。反之不一定成立,在空间上接近,公共前缀可能短。
(3)编码得到的结果是一个矩形网格区域范围,有助于隐私保护。

3.2 缺点

由于Z阶曲线的特性,如果选择不好合适的网格大小,在边缘场景进行邻近点匹配搜索时容易出错,

解决办法:把这个网格周围8个网格的geohash编码都计算出来,将周围八个矩形块范围内的点同时检索出来,再根据实际的相对距离进行过滤。

4. 几何表示

Z阶曲线:下图中标注出来的蓝色的点点。每两个点虽然是相邻的,但是距离相隔很远。看右下角的图,两个数值邻近红色的点两者距离几乎达到了整个正方形的边长。两个数值邻近绿色的点也达到了正方形的一半的长度。

Z阶曲线与经纬度的对应
在这里插入图片描述

5. 参考资料

维基百科:
https://en.wikipedia.org/w/index.php?title=Geohash&oldid=121182075

geohash和s2,空间填充曲线:
https://halfrost.com/go_spatial_search/#toc-1

Geohash编码:https://zhuanlan.zhihu.com/p/386445188#:~:text=GeoHash%E4%BD%9C,%E4%B8%AA%E7%BC%96%E7%A0%81%E8%BF%9B%E8%A1%8C%E8%A1%A8%E7%A4%BA%E3%80%82

GeoHash原理以及代码实现:
https://blog.csdn.net/qq_43777978/article/details/116426235

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1542894.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[DDD] ValueObject的一种设计落地及应用

目录 前言一、ValueObject二、设计2.1 接口2.2 单一值ValueObject2.3 单一字符串ValueObject 三、实现3.1 示例3.1.1 PhoneNumber3.1.2 SocialCreditCode 四、使用4.1 异常处理4.2 Json 反/序列化4.2.1 请求体4.2.2 HTTP接口4.2.3 用例 4.3 JPA/MyBatis4.3.1 Converter或TypeHa…

HarmonyOS实战开发-如何使用首选项能力实现一个简单示例。

介绍 本篇Codelab是基于HarmonyOS的首选项能力实现的一个简单示例。实现如下功能: 创建首选项数据文件。将用户输入的水果名称和数量,写入到首选项数据库。读取首选项数据库中的数据。删除首选项数据文件。 最终效果图如下: 相关概念 首选…

第二证券|基本面向好预期强化 全球资本加紧布局A股

开年以来,在我国经济上升向好的态势持续稳固增强的大布景下,结合各方努力,A股商场企稳上升痕迹明显。受一系列稳定商场预期政策出台的加持,全球本钱正在加速布局A股商场。 业界人士指出,当时我国本钱商场依然具有明显…

QT(6.5) cmake构建C++编程,调用python (已更新:2024.3.23晚)

一、注意事项 explicit c中,一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数),承担了两个角色,构造器、类型转换操作符, c提供关键字explicit,阻止转换构造函数进行的隐式转换的发生&#…

jvm底层

逐步细化 静态链接:静态方法(符号引用)替换为内存指针或者句柄直接引用) 动态链接:程序期间将符号引用替换为直接引用 对象头: 指针压缩: -XX:UseCompressedOops 开启指针压缩 减少内存消耗;大指针在主内存 缓存间移…

人脸聚类原理和算法解释

人脸聚类是指将大量人脸图像根据它们的相似性分组到不同的群集中的过程。人脸聚类通常利用人脸的特征向量表示来度量人脸之间的相似性,并将相似的人脸图像聚集在一起。 以下是人脸聚类的一般原理: 人脸特征提取:对每张人脸图像提取特征向量。…

上海市开展专项行动,提升车联网行业网络和数据安全防护水平

近日,上海市通信管理局发布了《关于开展“铸盾车联”2024年车联网网络和数据安全专项行动的通知》。通知中提到,此次专项行动是为了提升本市车联网行业网络和数据安全防护水平,筑牢车联网网络和数据安全防线,护航智能网联汽车产业…

Spring之事务原理篇

(/≧▽≦)/~┴┴ 嗨~我叫小奥 ✨✨✨ 👀👀👀 个人博客:小奥的博客 👍👍👍:个人CSDN ⭐️⭐️⭐️:Github传送门 🍹 本人24应届生一枚,技术和水平有…

opencv各个模块介绍(1)

Core 模块:核心模块,提供了基本的数据结构和功能。 常用的核心函数: cv::Mat:表示多维数组的数据结构,是OpenCV中最常用的类之一,用于存储图像数据和进行矩阵运算。 cv::Scalar:用于表示多通道…

Redis - 高并发场景下的Redis最佳实践_翻过6座大山

文章目录 概述6座大山之_缓存雪崩 (缓存全部失效)缓存雪崩的两种常见场景如何应对缓存雪崩? 6座大山之_缓存穿透(查询不存在的 key)缓存穿透的原因解决方案1. 数据校验2. 缓存空值3. 频控4. 使用布隆过滤器 6座大山之_…

水果检测15种YOLOV8

水果检测15种YOLOV8,只需要OPENCV,采用YOLOV8训练得到PT模型,然后转换成ONNX,OPENCV调用,支持C/PYTHON/ANDROID开发

41 arr.at is not a function

前言 一台机器 获取前端服务1, 一个列表能够展示出来 然后 一台机器 同样获取前端服务1, 这个列表展示不出来 然后 console里面没有任何报错[实际上是有报错, 但是没看到, 需要在vue的js代码里面去调试] 然后 这里面最终出现问题的地方是 Array.at 的使用, 我这边 js引擎版…

Spring Security安全管理

目录 一.添加依赖 效果 二.设置配置文件 认证 1.密码生成器 BCryptPasswordEncoder 配置文件中 2.inMemoryAuthentication内存认证方法 授权 效果 登录 效果 三.UserDetailsService认证授权方式 新建数据库 实体类 Role User 接口 实现类 配置文件 效果 四…

(AtCoder Beginner Contest 325) ---- D - Printing Machine -- 题解

目录 D - Printing Machine: 题目大意: 思路解析: 代码实现: D - Printing Machine: 题目大意: 思路解析: 打印一次后,需要充电一微秒后才能再次打印就可以看作每微妙只能打印一…

Vue3更新Package.json版本号

由于我之前已经更新过了,下面的方法提示我已经是最新的了,记录一下,过段时间在测试一下 npm install -g vue/clivue upgrade

Gitee删除自己本地仓库

1、打开自己的本地仓库 2、点击管理 3、选择删除仓库 4、将□的内容复制到⭕里

文件上传一-WEB攻防-PHP应用文件上传函数缺陷条件竞争二次渲染黑白名单JS绕过9

演示案例: PHP-原生态-文件上传-前后端验证PHP-原生态-文件上传-类型文件头验证PHP-原生态-文件上传-后缀黑白名单验证PHP-原生态-文件上传-解析配置&二次渲染PHP-原生态-文件上传-逻辑缺陷&函数缺陷 #学习前必读: 1、课前一定要明白&#xff1a…

nginx: [emerg] stream directive is duplicate in /etc/nginx/nginx.conf:56

背景: 在维护paas平台的时候发现一个web前端容器服务运行报错,提示如下: 问题分析: 根据日志的内容,发现是nginx.conf配置文件的stream模块配置存在问题导致的。需要查看一下nginx.conf配置文件的内容: 注…

LeetCode Python - 73. 矩阵置零

目录 题目描述解法方法一:数组标记方法二:原地标记 运行结果方法一方法二 题目描述 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:…

FFmpeg拉取RTSP流并定时生成10秒短视频

生成效果: 视频时长为10秒 生成格式为FLV 输出日志: 完整实现代码如下: 需要在Mac和终端先安装FFmpeg brew install ffmpeg CMake文件配置: cmake_minimum_required(VERSION 3.27) project(ffmpeg_open_stream) set(CMAKE_CXX_STANDARD 17)#头文件包目录 include_director…