geo实现方案

一、数据库内在支持GIS(地理信息系统)
MySQL: 目前只有MyISAM引擎是支持GIS的,Innodb在5.7版本中才支持空间索引。MyISAM这个引擎
不支持事务、外键,并且是表锁。适合读为主,不适合写操做。并且若是单独建一张表的话,那每次都要与
现有的表联合查询返回tag的地点,效率多少会有些影响,并且也不肯定Django是否支持Innodb与myISAM
引擎联合查询。(目前用的Innodb引擎)
其它数据库:MongoDB和postgresql都是支持GIS的,前者没有仔细研究,后者在GIS方面很强大,
但目前还不考虑切换数据库。mysql

二、第三方app或框架
GeoDjango:它是一个支持GIS存储和查询的Django衍生项目。不过这个框架过重了,内容太多,简单
熟悉了一下,它的功能仍是很强大的。但在数据库层,它也是须要数据库支持GIS的。
数据库全文检索:用的比较多的是lucene和sphinx工具,熟悉这两个工具的时间成本过高了,并且从性能
上来讲和本身用mysql查询差很少。sql


三、本身开发
考虑有两种方案,
(1) 数据库保存地点的经纬度,查找附近的地点时,用球面两点间距离公式计算并排序。
为了提升效率,还能够将其保存成存储过程。
(2)将经纬度转为一维数据geohash,这样能够在geohash上用加索引,并且用like语句
可实现查询。不过要至少调用6条like语句,并且不能实现任意距离的搜索,只能搜索几个距离
范围内的地点。数据库

目前,公司负责开发的产品需求并不须要精确搜索,从时间成本、性能两方面考察这些方案,最好的两个方案是
比较合适的。最终选定geohash方案app

相关文章
相关标签/搜索