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…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...