前言

在《使用MySQL进行地理空间数据存储与管理》一文中我们通过使用MySQL的地理空间功能实现了一个简单的“查找附近的人”的功能,其实不考虑经度的话Geohash可能是更好的选择。

Geohash介绍

Geohash是一种将经纬度坐标编码为字符串的地理空间编码方法。它不仅能够提供一种快速查找附近点的方法,而且还能用于模糊定位,从而保护用户的隐私。在交友App中,Geohash可以作为一种有效的手段来实现“附近的人”功能。

Geohash的工作原理

Geohash通过将地球表面划分为不同的网格来工作。每个网格都有一个唯一的字符串表示,这个字符串越长,表示的区域就越精确。Geohash编码可以精确到一个点,也可以覆盖一个矩形区域。

GeoHash-基于快速检验GPS数据的应用

GeoHash 技术原理及应用实战

在MySQL中使用Geohash

MySQL自身并不直接支持Geohash,需要在应用层面把坐标转为Geohash

存储用户位置的Geohash

在用户表中,除了存储经纬度外,还可以存储Geohash。

ALTER TABLE users ADD COLUMN geohash VARCHAR(20);

实现“附近的人”查询

使用Geohash查询附近的人,可以通过查找具有相邻Geohash编码的用户来实现。

Geohash的特点就是相邻的Geohash编码在字符串形式上是彼此接近的,相邻的字符串相同的越多表示两点之间最接近,经度也越高。可以通过查找与特定Geohash具有公共前缀的用户来实现。

SELECT * FROM users
WHERE geohash LIKE 'wtwfwjxp00z7%'
ORDER BY geohash;

由于Geohash的特点,可以通过增加或减少前缀的字符串来增加或减小经度。

总结

Geohash提供了一种简单而有效的方法来表示位置信息,如果不太考虑经度问题,Geohash相比MySQL的空间函数更加简单快速。