0

私たちは、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 分!)。これをより合理的な応答時間にするにはどうすればよいですか? 郵便番号のポリゴンにインデックスを付けました。クエリを実行しているのはこれだけなので、可能な限り最適化されると思います。索引付けが間違っていますか?

前もって感謝します!

4

1 に答える 1