0

我们正在开发一个小工具,允许人们在谷歌地图上绘制多边形,它会返回与绘制的覆盖重叠的邮政编码。我认为这将是深入研究 NoSQL 数据库的好时机,因为在处理大量数据时我听说过有关性能的好消息。

因此,我从美国人口普查 2010 数据集中获取了所有 ZCTA(邮政编码制表区)形状数据,并将其加载到 MongoDB 中,如下所示。样本文件:

{ "ZipCode" : 12345,
  "Polygon" : { type : "Polygon",
                coordinates: [[[lng1, lat1],[lng2, lat2], ... , [lngN, latN]]]}}

我还在 Polygon 列上设置了一个索引,如下所示:

db.ZipCodes.ensureIndex({"Polygon" : "2dsphere"})

最后,我将 google 多边形中的点转换为另一个 GeoJSON 多边形,并使用 $geoIntersects 查询数据,如下所示:

db.<collection>.find( { "Polygon" :
                     { $geoIntersects :
                       { $geometry :
                         { type : "Polygon" ,
                           coordinates : [[[lng1,lat1], [lng2,lat2], ... , [lngN, latN]]]
                  } } } } )

当覆盖多边形很小时,这很有效,但是当多边形跨越几个州(美国)时,查询需要永远(> 20 分钟!)。我怎样才能把它降低到一个更合理的响应时间?我已经索引了邮政编码多边形,因为这就是我要查询的全部内容,所以我认为这将尽可能优化。我索引不正确吗?

提前致谢!

4

1 回答 1

3

在试图找出在 MongoDB 中实现更好性能的最佳方法之后,我决定尝试我们现有的标准数据库 SQL Server。我想我对 SQL Server 地理空间功能的低期望是没有根据的。该查询在没有索引的情况下在 < 12 秒内运行,并且没有像 MongoDB 那样以指数方式扩展更大的绘制多边形。添加索引后,大多数查询都在 1 秒范围内。

我想我会坚持我所知道的。我真的对 MongoDB 寄予厚望,但地理空间性能严重不足(或关于如何改进它的文档严重不足)。

于 2013-06-24T21:39:55.923 回答