Bagaimana cara menyimpan garis dan poligon dalam dokumen JSON?

24

Melihat peningkatan gerakan NoSQL dan mempertimbangkan bahwa database seperti MongoDB menawarkan perspektif baru dalam penyimpanan data yang fleksibel untuk GIS. Apa cara terbaik untuk menyimpan garis dan poligon dalam dokumen JSON untuk memanfaatkan indeks 2d dan fungsi spasial?

Pablo
sumber
6
MongoDB saat ini tidak mendukung pengindeksan pada hal lain selain titik, dan fungsi spasialnya terbatas untuk menemukan dalam batas.
scw

Jawaban:

16

GeoJSON di sini adalah SPEC .

Berikut adalah contoh garis dan poligon:

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

Satu hal yang perlu diperhatikan adalah bahwa dukungan MongoDB untuk tipe data spasial sangat buruk untuk setiap pencarian spasial yang serius, dan ini berlaku secara menyeluruh dengan NoSQL terakhir kali saya periksa. Saya tidak suka GeoCouch sedikit kurang, tetapi juga masih memiliki cara untuk pergi.

GeoJSON adalah format yang fantastis tetapi untuk mengambil keuntungan dari indeks spasial terbatas (POINT-ONLY) di Mongo, Anda memerlukan koleksi yang diindeks secara spasial yang tidak memiliki apa-apa selain catatan untuk masing-masing poin poligon dengan nilai tambahan untuk ID rekaman dari data Anda. catatan spasial yang hidup dalam koleksi lain, kemudian menggunakan kueri kotak pembatas untuk mendapatkan ID rekaman dari satu dan memilih dari yang lain, secara efektif meniru gabungan.

Anda bisa menjadi bangkrut dan hanya melakukan sudut-sudut kotak pembatas sebagai poin untuk catatan Anda, tetapi kemudian pencarian kotak pembatas mungkin gagal dan semuanya memaksa beberapa pola desain yang sangat tidak efisien dan secara tidak tepat mendorong semua jenis tanggung jawab kepada pengembang.

Sebagai implementasi referensi, Anda mungkin ingin merujuk ke kode ini yang dipresentasikan pada Esri Developer Summit tahun ini.

Saya sama sekali tidak senang dengan dukungan spasial pada berbagai database NoSQL. Mereka hanya pergi cukup jauh untuk pencarian cloud titik bodoh, yang masuk akal mengingat sebagian besar aplikasi menggunakan ini hanya menjatuhkan pushpins ke peta Google pada browser di suatu tempat. PostGIS masih akan menjadi pekerja keras sumber terbuka terbaik untuk mengelola informasi spasial di masa mendatang.

Jason Scheirer
sumber
9

Ini tidak benar,

"untuk mengambil keuntungan dari indeks spasial di Mongo, Anda akan memerlukan koleksi yang diindeks secara spasial yang hanya menyimpan catatan untuk setiap poin poligon, dengan nilai tambahan untuk ID rekaman dari catatan spasial Anda yang hidup dalam koleksi lain, kemudian gunakan membatasi kueri kotak untuk mendapatkan ID rekaman dari satu [koleksi] dan pilih [data rekaman] dari [koleksi] lainnya, secara efektif meniru gabungan. "

Saya memiliki data titik USGS yang disimpan dalam satu koleksi Mongo dengan catatan yang terlihat seperti ini:

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

Saya dapat melakukan kueri kotak terikat pada data ini yang mengembalikan seluruh catatan (tanpa perlu koleksi lain) baik-baik saja.

Pertanyaan:

> 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);

Tanggapan:

{ "_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 juga menyediakan kemampuan untuk melakukan pencarian tetangga terdekat, serta mengarahkan pencarian poligon. Ini didokumentasikan dengan baik di mongodb.org

lagerratrobe
sumber
Maaf tapi saya bingung, MongoDB dapat atau tidak dapat membuat indeks spasial pada koleksi fitur garis dan poligon?
Derek Swingley
2
Saat ini tidak dapat membuat indeks spasial fitur garis dan poligon. Namun, ini dapat melakukan pencarian titik-dalam-poligon pada tabel dengan titik-titik di dalamnya, jika Anda memberikan geometri poligon sebagai bagian dari kueri. mongodb.org/display/DOCS/…
lagerratrobe
1
OK, jadi pernyataan: "GeoJSON adalah format yang fantastis tetapi untuk mengambil keuntungan dari indeks spasial terbatas (POINT-ONLY) di Mongo" sebenarnya benar karena Mongo hanya bisa secara spasial mengindeks poin.
Derek Swingley
Saya beri Anda bagian kalimat yang akurat, "terbatas (POINT-ONLY) indeks spasial". Jadi 5 dari 71 kata, atau 7%. Itu berarti 93% tidak benar. Saya berdiri di belakang pernyataan saya.
lagerratrobe
1
Bisakah Anda mengedit jawaban Anda untuk menjelaskan? Seperti, itu membingungkan dan menyesatkan. Mengenai bagian lain dari pernyataan, bukankah itu pada dasarnya hanya saran untuk menerapkan indeks spasial untuk data non-poin? Mungkin tidak ideal atau optimal, tetapi itu hanya saran. Menguraikan mengapa menurut Anda mayoritas pernyataan itu salah akan membantu juga.
Derek Swingley