我已经使用PostGIS几年了,直到最近才开始研究如何使用MongoDB处理某些用例。我正在处理具有稀疏字段的点数据,例如OSM数据,每条记录具有不同数量的标签,并且由于MongoDB没有架构,因此非常适合于此。我将这些数据的样本加载到每个数据库的实例中,这就是我发现的结果。
在我看来,Mongo对于简单的点数据存储和检索就可以了。边界框地理空间查询似乎运行良好,并且我发现总体性能非常好。尽管我发现mongoimport工具不允许我在TSV或CSV文件中定义复合2D坐标字段,但它的设置和操作也非常容易。由于编写生成JSON的脚本非常容易,因此这并不是什么大问题。目前,它的主要缺点是地理空间领域几乎没有其他内容可以从中读取数据。在https://github.com/springmeyer/mapnik-mongo上似乎有一个实验性的Mapnik数据源插件,但这就是我能找到的全部。
另一方面,PostGIS的建立时间要长一点(至少对我而言),但是如上所述,它提供了开箱即用的更多功能。除了提供更加复杂的空间分析功能外,它还获得了众多其他应用程序和库的本地支持。Mapserver,Mapnik,QGis,GDAL等,对我来说,PostGIS更加是一个真正的GIS系统,而不是简单的存储和检索系统。
就性能而言,我发现我可以从两个系统中快速检索数据。但是,似乎PostGIS从索引的存在中受益更多。MongoDB一次将整个数据集返回给我(200万条记录)的速度稍快,而一次返回使用索引的查询的速度稍慢。我不确定它用于缓存的机制,但是我可以看到,如果我在MongoDB中重复查询,则第二次返回的结果会更快。我在PostGIS中看到了类似的内容,但程度不同。我也确实注意到,运行MongoDB时,我的机器上的内存使用似乎比PostGIS高得多。
因此,我的结论是,我不会放弃PostGIS作为默认的地理空间存储和分析系统,但是对于某些类型的项目(即显示图像图块和/或点数据的Web地图),我可以考虑使用MongoDB作为我的数据存储。
罗杰