geohash是一种通用的地理算法,mysql、mongodb等也有对应的支持,有空可以研究一下。
类似附近的人的需求
简单的数据库方式计算方法:
x0,y0是当前经纬度
select id from positions where x0-r < x < x0+r and y0-r < y < y0+r
这句sql圈出原点附近矩形范围内的值
再根据勾股定理计算出距离,再进行排序(如果考虑地球曲率等因素需要更复杂的算法,一般不是长途也不用考虑)
使用redis的geo指令
它是一个特殊的zset
geoadd company 116.48105 39.996794 juejin
geoadd company 116.562108 39.787602 jd 116.334255 40.027400 xiaomi
插入三维数组,经度、纬度、名称
geodist company juejin meituan km
获取两个元素之间的距离,名称1、名称2、单位(m, km, ft, mi)
geopos 获取元素经纬度
geohash 获取元素经纬度hash值
查询指定元素附近的其它元素
georadiusbymember key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [Count count] [ASC|DESC] [STORE key]
例:georadiusbymember company meituan 20 km withdist count 3 asc
获取距离美团最近的3个公司,并输出距离
根据坐标获取附近的元素
georadius
参数和georadiusbymember类似,就是把member换成了经纬度
georadius company 116.514202 39.905409 20 km withdist count 3 asc
网友评论