GeoHash分享

news2024/12/24 11:09:13

写在前边

复制的一个内部分享,所以可能更偏向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公里内有品牌体验门店存在,开屏广告展示该品牌的广告素材

相关信息

  1. 全国100家品牌体验店的经纬度信息(火星坐标系);
  2. 开屏广告素材;

请给出你的设计思路

... ...

进阶:假如门店数量达到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)

优点

  1. 使用字符串表示经纬度,展示效果会更好一些;
  2. 在数据库中给坐标点提供了另一种存储方式。在数据存储时可以简化为只为一列做索引;
  3. Geohash是一种前缀编码,前缀相同的坐标点,位置相近。通过前缀提供了高性能的邻近位置POI查询,而邻近位置POI查询是LBS服务的核心能力。
  4. Geohash表示的是一个矩形区域。使用者既能表明自己大致位置,又不至于暴露精确坐标,有助于隐私保护;
    1. 相应的,字符串越长,表示的范围就越精确;

小工具⚙️

Geohash Converter

经纬度距离计算 - 开发工具箱

Geohash Explorer


四、存在的问题

精度问题

GeoHash长度与精度之间的对应关系如下:

如何实现附近LBS检索


五、相关API

Redis GEO | 菜鸟教程

Geohash 单元查询 | Elasticsearch: 权威指南 | Elastic

Geospatial Queries — MongoDB Manual

如何选择?

六、应用场景

附近的“人”

将用户位置与商家、酒店等地理位置信息匹配,提供推荐服务;

地理围栏

对某个区域进行监控,当有物体进入或离开该区域时进行警报;

地理位置索引

将地理位置信息编码为字符串,可以在数据库中快速检索某个范围内的地理位置信息;

地图导航、位置服务;

地理位置可视化

地图展示、热力图等;

数据分析、数据挖掘等

借贷业务中,通过地理位置信息透视用户群特征及分析借贷风险;

七、总结

  1. 了解GeoHash的原理
  2. 熟悉相关API
  3. 了解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博客

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

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

相关文章

又被罚了~新生支付

近日,中国人民银行海南省分行公布行政处罚公示信息内容,具有清算机构新生支付有限公司因存违规行为领罚款单。 行政处罚决定书批准文号“琼银罚决字〔2023〕22号”表明,新生支付有限公司(通称“新生支付”)存有三项违…

深入 Maven:构建杰出的软件项目的完美工具

掌握 Meven:构建更强大、更智能的应用程序的秘诀 Maven1.1 初识Maven1.1.1 什么是Maven1.1.2 Maven的作用 02. Maven概述2.1 Maven介绍2.2 Maven模型2.3 Maven仓库2.4 Maven安装2.4.1 下载2.4.2 安装步骤 03. IDEA集成Maven3.1 配置Maven环境3.1.1 当前工程设置3.1.…

PX4-Autopilot下载与编译

文章目录 1 Git clone 代码2 下载子模块3 编译4 可能遇到的问题参考 1 Git clone 代码 Github Repository 链接:PX4-Autopilot 查看现有版本: 在终端用命令下载,-b表示branch git clone -b v1.14.0 https://github.com/PX4/PX4-Autopilot.…

最新Workerman 在线客服系统源码/附搭建教程-ThinkPHP网站在线客服系统源码

源码简介: Workerman开发的Ai智能客服在线客服系统网站源码,里面有附带安装教程文档搭建教程。它是最新Workerman 在线客服系统源码。 源码链接: 网盘源码 密码:hma8 源码特点: 作为网站在线客服系统源码,它有下…

【Java】【PAT】Basic Level 1018 锤子剪刀布

题目 1018 锤子剪刀布 作者 CHEN, Yue 单位 浙江大学 大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜…

Python 中的函数包装器:模型运行时和调试

一、说明 在Python中,函数包装器被称为装饰器,它们在数据科学中具有各种有用的应用。本指南介绍如何使用它们来管理模型运行时和调试。 二、函数的封装 函数包装器是用于修改函数行为的有用工具。在Python中,它们被称为装饰器。装饰器允许我们…

设计模式:建造者模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

上一篇《策略模式》 下一篇《适配器模式》 简介: 建造者模式,它是一种对象构建模式,它提供了一种构建对象的最佳方式。这种模式适用于当对象的构建过程需要涉及到多个部分&#xff…

观察者模式 vs 发布-订阅模式:两种设计模式的对决!

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! ​ 目录 ⭐ 专栏简介 📘 文章引言 一…

设备标识牌不锈钢二维码制作

一、设备标识牌二维码好处: 1、设备信息管理:传统标识牌容纳的信息有限,将二维码用于设备标识牌,可实现设备信息丰富展示、设备文档资料可存储二维码云端、微信扫码检查查阅,无需携带纸质,同时凡尔码云端后…

JSX 动态类名控制

学习目标&#xff1a; 根据需求判断是否显示某个类名的样式 实现&#xff1a; 使用三元表达式或逻辑&&运算 import ./app.css; function App() {const color1 trueconst color2 truereturn (<div className"App">1. 三元&#xff1a;<div classN…

android项目实践说明

权限与存储 本地读取文件&#xff08;IO流&#xff09; 网络传输&#xff08;Socket通信&#xff09; 串口通信&#xff08;串行传输接口通信&#xff09; 而串口通信是应用在智能家居和单片机通信的场景&#xff0c;人脸识别门禁&#xff0c;利用串口控制门开关&#xff0…

SHELL基础编程

文章目录 SHELL基础查看有哪些解释器使用usermod修改用户解释器BASH基本特性 shell脚本的设计与运行编写问世脚本脚本格式规范执行shell脚本方法一方法二实验 变量自定义变量环境变量位置变量预定义变量 变量的扩展运用多种引号的区别双引号的应用单引号的应用反撇号或$()的应用…

leetcode 29

dividend 和 divisor都是int 类型&#xff0c;返回值也是int类型&#xff0c; 在C中&#xff0c;int类型表示整数类型&#xff0c;其范围取决于具体的实现。通常情况下&#xff0c;int类型的范围为-2147483648到2147483647&#xff0c;即-231到231-1。这是因为int类型通常为32…

Fwupd 1.9.6 Linux 固件升级工具已于近日发布

导读Fwupd 1.9.6 Linux 固件升级工具已于近日发布&#xff0c;支持更多硬件设备、新功能和十几处错误修复。 Fwupd 1.9.6 是在 fwupd 1.9.5 发布一个月后推出的&#xff0c;它引入了对更多硬件设备的支持&#xff0c;包括 AMD dGPUs Navi3x 及更高版本、Star Labs StarBook Mk …

假脸检测:Exploring Decision-based Black-box Attacks on Face Forgery Detection

论文作者&#xff1a;Zhaoyu Chen,Bo Li,Kaixun Jiang,Shuang Wu,Shouhong Ding,Wenqiang Zhang 作者单位&#xff1a;Fudan University;Yiwu Research Institute of Fudan University 论文链接&#xff1a;http://arxiv.org/abs/2310.12017v1 内容简介&#xff1a; 1&…

GeoServer改造Springboot源码二(数据源管理设计)

一、界面设计 图 1数据源管理列表 图 2选择数据源类型 1、PostGis 图 3新增PostGis数据源 2、Shapefile

Delay问题分析

【在刚刚过去的SAFe Scrum Master课程上有学员提出了Delay问题&#xff0c;进行了重点分析&#xff0c;颇有意义&#xff0c;因此整理得到本文】 大致背景情况&#xff1a;To B软件开发&#xff0c;已经启用了敏捷开发&#xff0c;迭代周期2周。 问题&#xff1a;经常出现Del…

因修改 MySQL 复制账号密码导致主从复制中断

作者 | JiekeXu 来源 |公众号 JiekeXu DBA之路&#xff08;ID: JiekeXu_IT&#xff09; 如需转载请联系授权 | (个人微信 ID&#xff1a;JiekeXu_DBA) 大家好&#xff0c;我是 JiekeXu,很高兴又和大家见面了,今天和大家一起来看看因修改 MySQL 复制账号密码导致主从复制异常&am…

Go语音中并发介绍

Go 是一种并发语言&#xff0c;而不是并行语言。在讨论 Go 中如何处理并发之前&#xff0c;我们必须首先了解什么是并发以及它与并行有何不同。 什么是并发&#xff1f; 并发性是指同时处理很多事情的能力。最好用一个例子来解释。 让我们考虑一个人慢跑。假设他早上慢跑时&…

电子画册如何制作,教你几分钟简单上手制作?

电子画册不同于纸质画册&#xff0c;它可以不受时间、空间及地域的限制&#xff0c;以更直观、新颖的形式展示在读者面前&#xff0c;还能快速传播效益。所以&#xff0c;当下&#xff0c;越来越多人想要用电子画册来传递内容信息。 如何制作电子画册&#xff1f;其实只要使用…