GeoHash分享
写在前边
复制的一个内部分享,所以可能更偏向PPT性质,本文提出的问题,在末尾参考材料中都会有所提及,包括更深层次的实现原理和各大API对于GeoHash的优化。感兴趣的读者可以拓展看一下。
START
GeoHash是一种地址编码,可以将二维的经纬度编码成遵循“最左匹配原则”的字符串,在LBS(Location Based Services)服务中具有非常广泛的用途。
一、坐标系
经纬度🌏
- 经度:
-
- 0°经线:本初子午线
- 东经:0~180°
- 西经:0~180°
- 纬度:
-
- 北纬:0~90°
- 南纬:0~90°
- 纬度相同的情况下
-
- 经度每隔0.00001度,距离相差约1米;
- 每隔0.0001度,距离相差约10米;
- 每隔0.001度,距离相差约100米;
- 每隔0.01度,距离相差约1000米;
- 每隔0.1度,距离相差约10000米。
- 经度相同的情况下
-
- 纬度每隔0.00001度,距离相差约1.1米;
- 每隔0.0001度,距离相差约11米;
- 每隔0.001度,距离相差约111米;
- 每隔0.01度,距离相差约1113米;
- 每隔0.1度,距离相差约11132米。
地理坐标系
定义
是一种利用三度空间的球面来定义地球上的空间的球面坐标系统,能够标示地球上的任何一个位置。
单位
经纬度,如:东方明珠电视塔的经纬度是121.499718,31.239698
分类
- 大地水准面
-
- 用平静的海面描述地球
- 地心坐标系
-
- 以地球质心为旋转椭球面的中心的坐标系
- 参心坐标系:挪移质心,使局部的表面与某一地区的地形更加吻合。
- 投影坐标系:地理坐标系按照一定的数学法则将地球椭球面的经纬网投影到平面上,称为投影坐标系。
常见的地理坐标系
名称 | 简介 | 应用范围 |
WGS-84坐标系 | World Geodetic System-1984,既1984年的全球坐标系统。是目前应用最为广泛的坐标系统,只要跟GPS定位相关,使用的都是WGS84坐标系. | GPS、谷歌、OSM、前端脚本库(leaflet、mapbox、openlayer) |
CGCS2000坐标系 | 2000国家大地坐标系,是我国当前最新的国家大地坐标系。非高精度的大多数情况下,我们可以认为WGS84坐标系=CGCS2000坐标系。 | |
GCJ02 火星坐标系 | 为了数据安全和保密,通过地形图非线性保密处理算法(俗称火星加密)加密过的WGS84坐标系,与WGS84坐标系之间的偏差大概在50-700m左右。 | 国内大部分地图底图(高德、腾讯)和矢量数据(图商的LBS服务和Android手机的定位数据) |
BD09坐标系 | 百度地图使用的地心坐标系,在GCJ02的基础上,做了二次加密。 | 百度地图 |
小工具⚙️
地图坐标系转换 - 在线工具
高德地图API
二、设计题👀
某APP和某品牌签订了广告合同,要求如下:
双11期间,用户打开APP时,如果当前定位所在地附近3公里内有品牌体验门店存在,开屏广告展示该品牌的广告素材。
相关信息:
- 全国100家品牌体验店的经纬度信息(火星坐标系);
- 开屏广告素材;
请给出你的设计思路:
... ...
进阶:假如门店数量达到1000、1W、10W。现有的设计会有什么问题,怎么解决?
尝试设计一个适用于此类场景,数据检索的索引?
三、GeoHash
是什么?空间索引Base32
GeoHash是一种地址编码,可以将二维的经纬度编码转换成一维字符串,每一个字符串代表了一块矩形区域,表示某一个点的大概位置。该区域内所有的点共享相同的GeoHash。
算法
1.切分区间
以纬度为例,按照初始区间范围纬度[-90,90],分为左右区间,计算目标纬度分别落在左区间还是右区间,左0右1;
循环上述步骤
序号 | 纬度范围 | 编码:0 | 编码:1 | 31.239698的区间编码 |
1 | (-90, 90) | (-90, 0.0) | (0.0, 90) | 1 |
2 | (0.0, 90) | (0.0, 45.0) | (45.0, 90) | 0 |
3 | (0.0, 45.0) | (0.0, 22.5) | (22.5, 45.0) | 1 |
4 | (22.5, 45.0) | (22.5, 33.75) | (33.75, 45.0) | 0 |
5 | (22.5, 33.75) | (22.5, 28.125) | (28.125, 33.75) | 1 |
6 | (28.125, 33.75) | (28.125, 30.9375) | (30.9375, 33.75) | 1 |
7 | (30.9375, 33.75) | (30.9375,32.34375) | (32.34375,33.75) | 0 |
8 | (30.9375,32.34375) | (30.9375,31.640625) | (31.640625,32.34375) | 0 |
9 | (30.9375,31.640625) | (30.9375,31.2890625) | (31.2890625,31.640625) | 0 |
10 | (30.9375,31.2890625) | (30.9375,31.11328125) | (31.11328125,31.2890625) | 1 |
... | ... | ... | ... | ... |
由上表得出东方明珠纬度(31.239698)产生的编码为:
101011000110111
同理可得经度产生的编码为:
110101100110011
2.合并经纬度编码
按照经度占偶数位,纬度占奇数位的原则,合并经纬度的二进制编码;
111001100111100000111100011111
3.Base32编码
按照每5位一组,分成6组,每组计算其对应的十进制数值,按照Base32进行编码;
Base32编码表的其中一种如下,是用0-9、b-z(去掉a, i, l, o)这32个字母进行编码
编码过程:
11100 11001 11100 00011 11000 11111
28(w) 25(t) 28(w) 3(3) 24(s) 31(z)
由此可得,东方明珠的GeoHash值为:wtw3sz(12ktu1)
优点
- 使用字符串表示经纬度,展示效果会更好一些;
- 在数据库中给坐标点提供了另一种存储方式。在数据存储时可以简化为只为一列做索引;
- Geohash是一种前缀编码,前缀相同的坐标点,位置相近。通过前缀提供了高性能的邻近位置POI查询,而邻近位置POI查询是LBS服务的核心能力。
- Geohash表示的是一个矩形区域。使用者既能表明自己大致位置,又不至于暴露精确坐标,有助于隐私保护;
-
- 相应的,字符串越长,表示的范围就越精确;
小工具⚙️
Geohash Converter
经纬度距离计算 - 开发工具箱
Geohash Explorer
四、存在的问题
精度问题
GeoHash长度与精度之间的对应关系如下:
如何实现附近LBS检索
五、相关API
Redis GEO | 菜鸟教程
Geohash 单元查询 | Elasticsearch: 权威指南 | Elastic
Geospatial Queries — MongoDB Manual
如何选择?
六、应用场景
附近的“人”
将用户位置与商家、酒店等地理位置信息匹配,提供推荐服务;
地理围栏
对某个区域进行监控,当有物体进入或离开该区域时进行警报;
地理位置索引
将地理位置信息编码为字符串,可以在数据库中快速检索某个范围内的地理位置信息;
地图导航、位置服务;
地理位置可视化
地图展示、热力图等;
数据分析、数据挖掘等
借贷业务中,通过地理位置信息透视用户群特征及分析借贷风险;
七、总结
- 了解GeoHash的原理
- 熟悉相关API
- 了解GeoHash的应用场景
Haversine公式
📚 参考资料
- GIS专业知识~地理坐标系(GCS)
- 国内常用地图坐标系
- 【推荐】GIS专业知识~火星坐标系
- 为什么需要空间索引?
- 空间索引之GeoHash
- Elasticsearch 在地理信息空间索引的探索和演进
- geohash-java
- 讲讲KD-Tree
- Lucene系列(16)工具类之kdb Bkd树原理概述 - 腾讯云开发者社区-腾讯云
- K-D树、K-D-B树、B-K-D树_bkd树_Holmofy的博客-CSDN博客
相关文章:

GeoHash分享
写在前边 复制的一个内部分享,所以可能更偏向PPT性质,本文提出的问题,在末尾参考材料中都会有所提及,包括更深层次的实现原理和各大API对于GeoHash的优化。感兴趣的读者可以拓展看一下。 START GeoHash是一种地址编码ÿ…...

【超详细】CentOS 7安装MySQL 5.7【安装及密码配置、字符集配置、远程连接配置】
准备工作:CentOS 7系统,并确保可以联通网络 1、获取MySQL 5.7 Community Repository软件包 注意:这里使用的是root用户身份。 wget https://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm2、安装软件包 rpm -ivh mysql5…...

Elasticsearch 8.X 分词插件版本更新不及时解决方案
1、关于 Elasticsearch 8.X IK 分词插件相关问题 球友在 ElasticSearch 版本选型问题中提及:如果要使用ik插件,是不是就使用目前最新的IK对应elasticsearch的版本“8.8.2”? https://github.com/medcl/elasticsearch-analysis-ik/releases/ta…...

Delete `␍`eslintprettier/prettier
将CRLF改为LF 然后就消失了 除此之外,也可以修改git全局配置 git config --global core.autocrlf false...

4种实用的制作URL 文件的方法
很多小伙伴有自己的博客、淘宝或者共享文件网站,想要分享、推广自己的网址做成url文件,让别人点击这个url文件直接访问自己的网站。URL文件其实就一个超级链接,制作的方法很多,这里列举4种。 收藏网站直接拖拽 1.第一种…...

css总结
记录做项目经常会写到的css 1、左边导航栏固定,右边div占满剩余宽度 <template><div class"entrance"><div class"left"></div><div class"right"><div class"content"></div>…...

[C语言]排序的大乱炖——喵喵的成长记
宝子,你不点个赞吗?不评个论吗?不收个藏吗? 最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!! 喵喵喵,你对我真的很重要…...

Docker 网络与Cgroup资源限制
目录 一、Docker 网络实现原理: 二、Docker 的网络模式: 三、网络模式详解: 1. host模式: 2. container模式: 3. none模式: 4.bridge模式: 5.自定义网络: 四、Cgroup资源控制: …...
D - United We Stand
思路: (1)题目要求将集合A划分为B,C两组,使得C中任意数都不是B中的除数 (2)直观感受,只要让C中数比B中大,则满足条件,不妨只取最大的放入C中; …...

【1.总纲】
目录 知识框架No.0 总纲安排No.1课程安排一、目标二、内容三、 学到 No.2 深度学习介绍一、AI地图二、图片分类三、物体检测和分割四、样式迁移五、人脸合成六、文字生成图片七、文字生成-GPT八、无人驾驶九、广告点击 No.3 安装No.3 安装 知识框架 No.0 总纲安排 B站网址&…...

I/O模型之非阻塞IO
简介 五种IO模型 阻塞IO 非阻塞IO 信号驱动IO IO多路转接 异步IO 代码书写 非阻塞IO 再次理解IO 什么是IO?什么是高效的IO? 为了理解后面的一个问题,我们首先要再重新理解一下什么是IO 在之前的网络介绍中ÿ…...

2023版 STM32实战11 SPI总线读写W25Q
SPI全称 英文全称:Serial peripheral Interface 串行外设接口 SPI特点 -1- 串行(逐bit传输) -2- 同步(共用时钟线) -3- 全双工(收发可同时进行) -4- 通信只能由主机发起(一主,多从机) 开发使用习惯和理解 -1- CS片选一般配置为软件控制 -2- 片选低电平有效,从…...

Spring Security认证源码解析(示意图)
建议先看完Spring Security总体架构介绍和Spring Security认证架构介绍,然后从FilterChainProxy的doFilterInternal函数开始,配合文章进行debug以理解Spring Security认证源码的执行流程。 在之前的Spring Security认证架构介绍中,我们已经知…...

2023.10.22 关于 定时器(Timer) 详解
目录 引言 标准库定时器使用 自己实现定时器的代码 模拟实现的两大方面 核心思路 重点理解 自己实现的定时器代码最终代码版本 引言 定时器用于在 预定的时间间隔之后 执行特定的任务或操作 实例理解: 在服务器开发中,客户端向服务器发送请求&#…...

【STM32】GPIO控制LED(寄存器版)
在开始之前记得先准备好环境: STM32F103核心板下载教程.pdf 林何/STM32F103C8 - 码云 - 开源中国 (gitee.com) 一、STM32的GPIO模块数据手册详解 每个GPIO端口对应16个引脚,例GPIOA(PA0~PA15)内核cpu就可以通过APB2总线对寄存器…...
Spring Boot OAuth 2.0整合—高级配置
一、概述 HttpSecurity.oauth2Login() 为定制OAuth 2.0登录提供了大量的配置选项。主要的配置选项被分组到它们的协议端点对应处。 例如,oauth2Login().authorizationEndpoint() 允许配置授权端点,而 oauth2Login().tokenEndpoint() 允许配置令牌端点。…...
软考-虚拟专用网原理与应用
本文为作者学习文章,按作者习惯写成,如有错误或需要追加内容请留言(不喜勿喷) 本文为追加文章,后期慢慢追加 by 2023年10月 虚拟专用网概念 虚拟专用网(Virtual Private Network)是一种通过…...
clock_property 时钟的常用属性
get_property [get_clocks] property_option 1. period get_property [get_clocks] period 查询所有clock 的周期,如果存在loops会生成CTE_loops.rpt 2.clock_network_pins 查询clock所有的pins 3.generated_clocks_extended 查询clock分频产生的generate…...

平板有必要买触控笔吗?推荐的ipad手写笔
iPad之所以能吸引这么多人,主要是因为它的功能出色。用来画画、做笔记,也是一种不错的体验。但如果只是用来看电视和打游戏的话,那就真的有点大材小用了。如果你不需要昂贵的苹果电容笔,也不需要用来专业的绘图,那你可…...

Qt扫描-QMoive 理论总结
QMoive 理论总结 一、概述二、使用1. 使用2. 信号发出时机 三、控制的相关槽函数四、信号 一、概述 QMovie类是一个使用QImageReader播放 动画 的方便类。这个类用于显示没有声音的简单动画,一般即是 gif 动画。如果要显示视频和媒体内容,请使用Qt Mult…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...

【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...