postGIS笔记(上)

好久没写博客,来扯淡一下。

2月~4月参与了一个游戏app的backend开发,基本上就是写API给app调用。
除了组里规定的严打不动的得用rails以外,这次项目自由度很大。

先简单介绍一下游戏功能:
把全日本10w左右的公园当portal,用户打开app可以看到附近当portal,到了portal范围内就可以玩游戏抓snoopy。
这次server要做的事情就是不停接受app的polling request,看用户附近是否有公园portal。

组里做过LBS的人不多,leader很早之前做过一次,推荐我用Geohash,并警告我说可能数据库压力会很大。
于是开发前准备阶段便搜了些相关资料。
结果发现Geohash相关gem都几乎没有在更新维护,便开始怀疑Geohash是否可行。
偶尔在infoQ和RubyChina发现了一些中文文章,谈到LBS的解决方案,其中包括:

GeoHash

算法。可以在用gem在mysql上方便实现。但是似乎select很慢,一次query要请求数据库8-9次[来源]

ElasticSearch

开源搜索引擎。了解不多,主要是没看懂(´・ω・`)。教程

MongoDB & Redis

MongoDB Geospatial和Redis Geohash。但由于本次项目肯定会用到关系型数据和预算问题,所以没有多考虑。
了解下来MongoDB的Geospatial在速度上还是不错的,适合做实时LBS,这之后会提到。

Relational database

MySQL 的 Spatial Data 和 PostSQL 的 PostGIS。
MySQL 的解决方案最初听起来不错,但是深入了解后,发现MySQL对Spatial Data支持的比较晚,不够成熟,速度上对比PostGIS没有什么优势。
PostGIS方案比较成熟,速度也不错,又是关系型数据,不需要额外用NoSQL数据库。
而且有 gem activereacord-postgis-adapter 可以很好的支持ActiveRecord,关键人家还一直在更新维护。

RubyChina上找到的一篇很好的文章,里面有强有力的数据支持,让我得以说服leader用PostgreSQL。
把事先装好的mySQL替换成postgreSQL花了很长时间,rails换gem没有多大难度,
难得是在ec2上安装postgreSQL还是postGIS的时候,遇到了yum版本依赖问题花了很久才搞定,解决后便行云流水了。

在此特地说一下,如果能用RDS就不要折腾在ec2上装postgreSQL了,RDS自带extension,只要on一下就行了,很方便。

PostGIS笔记(中)