回答:
線と多角形の例を次に示します。
{ "type": "FeatureCollection",
"features": [
{ "type": "Feature",
"geometry": {"type": "Point", "coordinates": [102.0, 0.5]},
"properties": {"prop0": "value0"}
},
{ "type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [
[102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]
]
},
"properties": {
"prop0": "value0",
"prop1": 0.0
}
},
{ "type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0],
[100.0, 1.0], [100.0, 0.0] ]
]
},
"properties": {
"prop0": "value0",
"prop1": {"this": "that"}
}
}
]
}
注意すべきことの1つは、空間データ型のMongoDBのサポートは、深刻な空間ルックアップにとってはひどく悪いことであり、これは前回チェックしたときにNoSQLが全面的に当てはまることです。私はGeoCouchがあまり好きではありませんが、まだ方法があります。
GeoJSONは素晴らしい形式ですが、Mongoの制限された(ポイントのみ)空間インデックスを活用するには、各ポリゴンのポイントのレコードとレコードIDの追加値を保持する空間インデックス付きコレクションが必要です。別のコレクションに存在する空間レコードは、バウンディングボックスクエリを使用して一方からレコードIDを取得し、他方から選択して、結合を効果的にエミュレートします。
ハッキングして境界ボックスの角をレコードのポイントとして使用することもできますが、境界ボックスの検索は失敗する可能性があり、全体的にかなり非効率的なデザインパターンを強制し、あらゆる種類の責任を開発者に不適切に押し付けます。
リファレンス実装として、今年のEsri Developer Summitで発表されたこのコードを参照することをお勧めします。
さまざまなNoSQLデータベースの空間サポートにまったく満足していません。ダムポイントクラウドルックアップに十分なだけであり、これを使用するほとんどのアプリは、どこかのブラウザーのGoogleマップにプッシュピンをドロップするだけであると考えられます。PostGISは、近い将来、空間情報を管理するための最良のオープンソースの主力製品であり続けます。
これは単に真実ではありません、
「Mongoで空間インデックスを利用するには、各ポリゴンのポイントのレコードのみを保持する空間インデックス付きコレクションが必要であり、別のコレクションに存在する空間レコードのレコードIDの追加値が必要です。一方の[コレクション]からレコードIDを取得し、他方の[コレクション]から[レコードデータ]を選択するバウンディングボックスクエリにより、効果的に結合をエミュレートします。」
次のようなレコードを含む単一のMongoコレクションにUSGSポイントデータが保存されています。
> db.names.find({FEATURE_NAME: 'Mount Saint Helens', STATE_ALPHA: 'WA'})
{ "_id" : ObjectId("4e262106d7a99b7db41a4919"),
"_ID" : 1525360,
"FEATURE_NAME" : "Mount Saint Helens",
"FEATURE_CLASS" : "Summit",
"STATE_ALPHA" : "WA",
"STATE_FIPS" : 53,
"COUNTY_NAME" : "Skamania",
"COUNTY_FIPS" : "059",
"COORDS" : [ -122.1944, 46.1912 ],
"ELEV_IN_FT" : "8356" }
このデータに対してバウンディングボックスクエリを実行し、レコード全体を(別のコレクションを必要とせずに)正常に返すことができます。
クエリ:
> box = [[-126.562500,45.089036], [-123.750000,47.040182]]
[ [ -126.5625, 45.089036 ], [ -123.75, 47.040182 ] ]
> db.names.find({"COORDS" : {"$within" : {"$box" : box}}, FEATURE_CLASS: "Summit"}, {FEATURE_NAME: true, COUNTY_NAME: true, STATE_ALPHA: true, ELEV_IN_FEET: true}).limit(5);
応答:
{ "_id" : ObjectId("4e2620f8d7a99b7db4146cec"), "FEATURE_NAME" : "Harlocker Hill", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Coos" }
{ "_id" : ObjectId("4e2620f8d7a99b7db414a349"), "FEATURE_NAME" : "Neskowin Crest", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Tillamook" }
{ "_id" : ObjectId("4e2620f8d7a99b7db414a105"), "FEATURE_NAME" : "Miles Mountain", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Tillamook" }
{ "_id" : ObjectId("4e2620f8d7a99b7db414934a"), "FEATURE_NAME" : "Mount Gauldy", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Tillamook" }
{ "_id" : ObjectId("4e2620f8d7a99b7db4149d06"), "FEATURE_NAME" : "Little Hebo", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Yamhill" }
Mongoは、ポリゴン検索のポイントと同様に、最近傍検索を実行する機能も提供します。これはmongodb.orgでよく文書化されています