JSONドキュメントにラインとポリゴンを保存する方法は?


24

増加するNoSQLの動きを見て、MongoDBのようなデータベースがGISの柔軟なデータストレージに新しい視点を提供することを考慮してください。2Dインデックスと空間関数を利用するために、JSONドキュメントにラインとポリゴンを保存する最良の方法は何ですか?


6
MongoDBは現在、ポイント以外のインデックス作成をサポートしていません。その空間関数は境界内での検索に限定されています。
scw

回答:


16

GeoJSONSPECです。

線と多角形の例を次に示します。

{ "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"}
         }
       }
     ]
   }

9

注意すべきことの1つは、空間データ型のMongoDBのサポートは、深刻な空間ルックアップにとってはひどく悪いことであり、これは前回チェックしたときにNoSQLが全面的に当てはまることです。私はGeoCouchがあまり好きではありませんが、まだ方法があります。

GeoJSONは素晴らしい形式ですが、Mongoの制限された(ポイントのみ)空間インデックスを活用するには、各ポリゴンのポイントのレコードとレコードIDの追加値を保持する空間インデックス付きコレクションが必要です。別のコレクションに存在する空間レコードは、バウンディングボックスクエリを使用して一方からレコードIDを取得し、他方から選択して、結合を効果的にエミュレートします。

ハッキングして境界ボックスの角をレコードのポイントとして使用することもできますが、境界ボックスの検索は失敗する可能性があり、全体的にかなり非効率的なデザインパターンを強制し、あらゆる種類の責任を開発者に不適切に押し付けます。

リファレンス実装として、今年のEsri Developer Summitで発表されたこのコードを参照することをお勧めします。

さまざまなNoSQLデータベースの空間サポートにまったく満足していません。ダムポイントクラウドルックアップに十分なだけであり、これを使用するほとんどのアプリは、どこかのブラウザーのGoogleマップにプッシュピンをドロップするだけであると考えられます。PostGISは、近い将来、空間情報を管理するための最良のオープンソースの主力製品であり続けます。


9

これは単に真実ではありません、

「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でよく文書化されています


申し訳ありませんが、私は混乱していますが、MongoDBはラインおよびポリゴンフィーチャコレクションに空間インデックスを作成できますか?
デレクスイングリー

2
現時点では、ラインおよびポリゴンフィーチャに空間インデックスを作成できません。ただし、クエリの一部としてポリゴンジオメトリを提供する場合、ポイントを含むテーブルでポイントインポリゴン検索を実行できます。mongodb.org/display/DOCS/...
lagerratrobe

1
それでは、「GeoJSONは素晴らしいフォーマットですが、Mongoの限定された(POINT-ONLY)空間インデックスを利用する」というステートメントは、Mongoが空間的にのみインデックスを作成できるため、実際に当てはまります。
デレクスイングリー

その文の一部が正確で、「制限された(ポイントのみ)空間インデックス」であることを認めます。71語中5語、つまり7%です。93%が間違っています。私は声明の後ろに立っています。
lagerratrobe

1
答えを編集して明確にできますか?そのままで、紛らわしく誤解を招きます。ステートメントの他の部分に関して、それは基本的に非ポイントデータの空間インデックスを実装するための単なる提案ではありませんか?これは理想的でも最適でもないかもしれませんが、単なる提案です。その声明の大部分が間違っていると思う理由を詳しく説明することも役立ちます。
デレクスイングリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.