老板突然想上网找一个离方圆一公里的商业代理 。明天上线!接到这个要求的时候差点吐血,时间太紧了 。赶紧查查相关技术选型 。经过很多麻烦,终于在晚上10点满足了这个需求,现在总结一下实现的大致思路 。
2.mysql不适合
在满足需求的时候,首先要考虑现有的东西能不能满足,代价是什么 。
我首先想到的是mysql 。毕竟,大部分数据应该坚持到mysql.然而,使用mysql需要geohash.的自我计算 。需要使用大量的数学和几何计算,并需要学习地理相关知识 。门槛高,短时间内不可能完成要求 。从长远来看,这不是mysql擅长的领域,因此不予考虑 。
geohash可以参考其他文献
2.redis中的地球同步轨道
redis是比较熟悉的k-v数据库,它经常被用作高性能缓存数据库,并将在大多数项目中使用 。自3.2版本以来,它提供了geo能力,用于实现附近位置、距离计算等依赖于地理位置信息的功能 。geo"s的相关命令如下:
redis命令描述geohash返回一个或多个位置元素的geohash,这意味着geopos从key返回所有给定位置元素的位置(经度和纬度) 。geodist返回两个给定位置之间的距离 。地球位于给定的纬度和经度的中心 。找出一定半径内的元素geoadd将指定的地理空间位置(纬度、经度、名称)添加到指定的关键georadiusbymember找出指定范围内的元素,中心点由给定的位置元素确定
redis会假设地球是一个完美的球体,所以可能会有一些位置计算偏差,据说是=0.5% 。对于地理位置要求严格的需求,要进行一些场景测试,测试是否能满足需求 。
2.1写地理信息
那么如何实现目标单位半径内的所有元素呢?我们可以将所有位置的经纬度转换成52位的geohash,通过上表中的geoadd写入redis 。
命令格式:
geoadd关键经度纬度成员[经度纬度成员…]
相应的例子:
redisgeoaddcities: locs117.12 39.08天津114.29 38.02石家庄
(整数)2
意思是在key.个城市的sortedset集合中添加经度为117.12、纬度为39.08的天津和经度为114.29、纬度为38.02的石家庄,您可以添加一个或多个位置 。然后我们可以使用其他命令来计算地理位置 。
有效经度范围从-180度到180度 。有效纬度范围从-85.05112878度到85.0512778度 。当坐标位置超过上述指定范围时,该命令将返回一个错误 。
2.2统计单位半径内的面积
借助georadius,我们可以找到给定经纬度的某个半径内的所有元素 。
命令格式:
地理坐标长纬度半径m| km| ft| mi[withourd][withdist][withash][count][asc| desc]
这个命令比geoadd更复杂:
radius半径长度,必需 。以下m、km、ft和mi是长度单位选项,四选一 。
withcoord返回位置元素的经度和维度,这是可选的 。
withdist返回位置元素和中心点以及位置元素之间的距离 。距离的单位与查询单位相同,这不是必需的 。
withhash以52位精度返回位置的geohash值,这是可选的 。反正我很少用这个 。也许其他一些偏向底层的lbs应用服务需要这个 。
count返回合格位置元素的数量,这不是必需的 。比如返回前10名,这样可以避免过多的一致结果带来的性能问题 。
asc|desc排序方式,非必选 。默认情况下返回未排序,但是大多数我们需要进行排序 。参照中心位置,从近到远使用asc,从远到近使用desc 。
例如,我们在城市:locs中查找以(115.03,38.44)为中心,方圆200公里的城市,结果包含城市名称、对应的坐标和距离中心点的距离(公里),并按照从近到远排列 。命令如下:
redisgeoradiuscity: locas115.03 38.44 200km,带coordwitistasc
1) 1)石家庄
2) "79.7653"
- 宁波附近哪里好玩
- 怎么查全国高校名单
- 济南章丘附近有什么好玩的地方吗
- 电视锅子怎么超级搜索
- 屏幕镜像搜索不到电视
- 电视机怎么搜索台
- 和巅峰之作意思相近的成语
- 百度竞价恶意点击软件
- GTA5帮会怎么创建
- 哪些属于目录搜索引擎