我们正在开发一个小工具,允许人们在谷歌地图上绘制多边形,它会返回与绘制的覆盖重叠的邮政编码。我认为这将是深入研究 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 分钟!)。我怎样才能把它降低到一个更合理的响应时间?我已经索引了邮政编码多边形,因为这就是我要查询的全部内容,所以我认为这将尽可能优化。我索引不正确吗?
提前致谢!