一、简介
移动互联网时代LBS应用越来越多,交友软件中附近的小姐姐、外卖软件中附近的美食店铺、高德地图附近的核酸检查点等等,那这种附近各种形形色色的XXX地址位置选择是如何实现的?
地球上的地理位置是使用二维的经纬度表示,经度范围 (-180, 180],纬度范围 (-90, 90],只要我们确定一个点的经纬度就可以名取得他在地球的位置。
例如滴滴打车,最直观的操作就是实时记录更新各个车的位置,
然后当我们要找车时,在数据库中查找距离我们(坐标x0,y0)附近r公里范围内部的车辆
使用如下SQL即可:
select taxi from position where x0-r < x < x0 + r and y0-r < y < y0+r
但是这样会有什么问题呢?
1.查询性能问题,如果并发高,数据量大这种查询是要搞垮数据库的
2.这个查询的是一个矩形访问,而不是以我为中心r公里为半径的圆形访问。
3.精准度的问题,我们知道地球不是平面坐标系,而是一个圆球,这种矩形计算在长距离计算时会有很大误差
Redis在3.2版本以后增加了地理位置的处理
二、原理
核心思想就是将球体转换为平面,区块转换为一点
三、命令
GEOADD 多个经度(longitude)、维度(latitude)、位置名称(member)添加到指定的key中
GEOPOS 从键里面返回所有给定位置元素的位置(经度和纬度)
GEODIST 返回两个给定位置之间的距离
GEORADIUS 以给定的经纬度为中心,返回与中心的位置不超过给定最大位置的所有位置元素
GEORADIUSBYMEMBER 跟GEORADIUS类似
GEOHASH 返回一个或多个位置元素的GEOHASH表示
四、命令实操
如何获取某个地址的经纬度
http://api.map.baidu.com/lbsapi/getpoint
GEOADD添加经纬度坐标
中文乱码如何处理
GEOPOS返回经纬度
GEOHASH返回坐标的geohash表示
geohash算法生成的base32编码值
3纬变2纬变1纬
GEODIST两个位置之间距离
后面参数是距离单位:
m 米
km 千米
ft 英尺
mi 英里
GEOREDIUS
georadius 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
GEORADIUS city 116.418017 39.914402 10 km withdist withcoord count 10 withhash desc
GEORADIUS city 116.418017 39.914402 10 km withdist withcoord withhash count 10 desc
WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。
WITHCOORD: 将位置元素的经度和维度也一并返回。
WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大
COUNT 限定返回的记录数。
当前位置(116.418017 39.914402),阳哥在北京王府井
GEOREDIUSBYMEMBER
五、应用场景
地图附近酒店推送、美食推荐
标签:返回,10,元素,经纬度,数据类型,位置,Redis,给定
From: https://blog.51cto.com/u_13236892/7542809