GeoHash分享

2023-10-23 14:36
文章标签 分享 geohash

本文主要是介绍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公里内有品牌体验门店存在,开屏广告展示该品牌的广告素材

相关信息

  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博客

这篇关于GeoHash分享的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/268477

相关文章

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

MySQL8.2.0安装教程分享

《MySQL8.2.0安装教程分享》这篇文章详细介绍了如何在Windows系统上安装MySQL数据库软件,包括下载、安装、配置和设置环境变量的步骤... 目录mysql的安装图文1.python访问网址2javascript.点击3.进入Downloads向下滑动4.选择Community Server5.

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

10个Python自动化办公的脚本分享

《10个Python自动化办公的脚本分享》在日常办公中,我们常常会被繁琐、重复的任务占据大量时间,本文为大家分享了10个实用的Python自动化办公案例及源码,希望对大家有所帮助... 目录1. 批量处理 Excel 文件2. 自动发送邮件3. 批量重命名文件4. 数据清洗5. 生成 PPT6. 自动化测试

10个Python Excel自动化脚本分享

《10个PythonExcel自动化脚本分享》在数据处理和分析的过程中,Excel文件是我们日常工作中常见的格式,本文将分享10个实用的Excel自动化脚本,希望可以帮助大家更轻松地掌握这些技能... 目录1. Excel单元格批量填充2. 设置行高与列宽3. 根据条件删除行4. 创建新的Excel工作表5

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

C#读取本地网络配置信息全攻略分享

《C#读取本地网络配置信息全攻略分享》在当今数字化时代,网络已深度融入我们生活与工作的方方面面,对于软件开发而言,掌握本地计算机的网络配置信息显得尤为关键,而在C#编程的世界里,我们又该如何巧妙地读取... 目录一、引言二、C# 读取本地网络配置信息的基础准备2.1 引入关键命名空间2.2 理解核心类与方法

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作