私たちは、Google マップ上に多角形を描画できる小さなツールを開発しています。このツールは、描画されたオーバーレイと重なる郵便番号を返します。大規模なデータ セットを処理する際のパフォーマンスが優れていると聞いていたので、今こそ NoSQL データベースに飛び込む絶好の機会だと思いました。
そこで、2010 年の米国国勢調査のデータ セットから ZCTA (Zip Code Tabulation Area) 形状データをすべて取得し、次のように 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 分!)。これをより合理的な応答時間にするにはどうすればよいですか? 郵便番号のポリゴンにインデックスを付けました。クエリを実行しているのはこれだけなので、可能な限り最適化されると思います。索引付けが間違っていますか?
前もって感謝します!