LBS经纬度搜索和距离排序 各种方案
来源:互联网 发布:淘宝怎样申请退换货 编辑:程序博客网 时间:2024/05/16 19:37
看到最近有好多人陆续收藏、关注这个问题,特来更新一下
建议使用ElasticSearch(https://elastic.co)进行LBS业务功能开发
PostGIS也是不错的
Redis新版有提供Geocoding,可以尝试一下
一直在琢磨LBS,期待可以发现更好的方案。现在纠结了。
简单列举一下已经了解到的方案:
1.sphinx geo索引
2.mongodb geo索引
3.mysql sql查询
4.mysql+geohash
5.redis+geohash
然后列举一下需求:
1.实时性要高,有频繁的更新和读取
2.可按距离排序支持分页
3.支持多条件筛选(一个经纬度数据还包含其他属性,比如社交系统的性别、年龄)
方案简单介绍:
1.sphinx geo索引
支持按照距离排序,并支持分页。但是尝试mva+geo失败,还在找原因。
无法满足高实时性需求。(可能是不了解实时增量索引配置有误)
资源占用小,速度快
2.mongodb geo索引
支持按照距离排序,并支持分页。支持多条件筛选。
可满足实时性需求。
资源占用大,数据量达到百万级请流量在10w左右查询速度明显下降。
3.mysql+geohash/ mysql sql查询
不支持按照距离排序(代价太大)。支持分页。支持多条件筛选。
可满足实时性需求。
资源占用中等,查询速度不及mongodb。
且geohash按照区块将球面转化平面并切割。暂时没有找到跨区块查询方法(不太了解)。
4.redis+geohash
geohash缺点不再赘述
不支持距离排序。支持分页查询。不支持多条件筛选。
可满足实时性需求。
资源占用最小。查询速度很快。
网友回复:
我建议使用PostGIS(Postgresql数据库的一个变种,增加了GIS扩展):
- Postgresql本身是最先进的开源RDBMS(没有之一),是最稳定成熟的RDBMS之一(流行度和社区成熟度比不上MySQL)
- PostGIS是最成熟,功能最丰富的免费GIS数据库(没有之一),只有收费的Oracle和SQL Server(他们都有GIS版)才能与之媲美,MySQL的GIS功能通常不能拿来和它比
- PostGIS本质上还是数据库,使用SQL操作,可以满足你更新频繁、和其它筛选条件联合使用的要求
- 结合postgresql FTS扩展(Full Text Search),不仅可以根据性别、年龄、LBS信息搜索,更可以和模糊关键词搜索联合起来
- Postgresql也可以做集群、复制、高可用
如果你的量实在太大,PostGIS满足不了你的性能要求,可以考虑用PostGIS做源数据存储,用Sphinx、Solr/Lucene专门提供搜索,Sphinx和Solr/Lucene都有根据距离搜索的功能,也支持实时增量索引(RealTime Index)
下面这篇文章及评论介绍了很多GIS方案(其中一部分你已经测试了),供你参考:
http://openlife.cc/blogs/2012/august/comparing-open-source-gis-implementations
- LBS经纬度搜索和距离排序 各种方案
- 再提LBS经纬度搜索和距离排序,求更优方案
- 订餐系统之按距离[根据经纬度]排序、搜索
- LBS:附近搜索(geohash算法:经纬度编码搜索)
- 按经纬度搜索附近的人,并按距离排序的简单实现。
- 经纬度互换和计算距离
- LBS的球面距离计算及Geohash方案探讨(LBS之一)
- 根据经纬度显示的距离排序
- [COPY]LBS的瓶颈和方案
- LBS 经纬度定位
- JavaWeb日记——SQL和hibernate实现经纬度求距离并排序
- 已知经纬度算距离和方位
- iOS定位操作和经纬度距离计算
- php根据经纬度计算距离和方向
- 已知一点经纬度和距离,求距离返回内点
- 解决solr搜索多词匹配度和排序方案
- MYSQL 两个经纬度之间的距离由近及远排序
- 根据用户经纬度,sql计算距离并排序
- 进程间通信 (OSX/iOS)
- Android初学习 - AsyncTask的用法总结
- objc_setAssociatedObject、objc_getAssociatedObject、objc_removeAssociatedObjects
- MpAndroidChart强大的图表功能
- Redis的三种启动方式
- LBS经纬度搜索和距离排序 各种方案
- widget组件
- iOS开发内购全套图文教程
- ActiveX中的ctl文件几个释义
- [未完待续]explain sql解析器
- c++第6次实验
- PTA 求前缀表达式的值 (25分)
- springmvc+quartz,实现定时任务
- Effective cpp 读书笔记7