Come archiviare linee e poligoni nei documenti JSON?


24

Osservando il crescente movimento di NoSQL e considerando che database come MongoDB offrono una nuova prospettiva nella memorizzazione flessibile dei dati per GIS. Qual è il modo migliore per memorizzare linee e poligoni nei documenti JSON per sfruttare gli indici 2D e le funzioni spaziali?


6
MongoDB al momento non supporta l'indicizzazione su qualcosa di diverso dai punti e le sue funzioni spaziali sono limitate alla ricerca entro limiti.
scw,

Risposte:


16

GeoJSON ecco le specifiche .

Ecco un esempio di una linea e un poligono:

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

Una cosa da notare è che il supporto di MongoDB per i tipi di dati spaziali è terribilmente negativo per qualsiasi ricerca spaziale seria, e questo vale su tutta la linea con NoSQL l'ultima volta che ho controllato. Non mi piace GeoCouch un po 'meno, ma ha anche ancora molta strada da fare.

GeoJSON è un formato fantastico ma per sfruttare gli indici spaziali limitati (SOLO PUNTO) in Mongo avresti bisogno di una raccolta indicizzata spazialmente che contenga nient'altro che un record per ciascuno dei punti del poligono con un valore aggiuntivo per l'ID record del tuo record spaziale residente in un'altra raccolta, quindi utilizzare una query delimitatrice per ottenere gli ID record da uno e selezionare dall'altro, emulando efficacemente un join.

Potresti andare in confusione e fare solo gli angoli del riquadro di selezione come punti per i tuoi record, ma poi le ricerche del riquadro di selezione potrebbero non riuscire e nel complesso forza alcuni schemi di progettazione piuttosto inefficienti e spinge in modo inappropriato tutti i tipi di responsabilità verso lo sviluppatore.

Come implementazione di riferimento, potresti voler fare riferimento a questo codice che è stato presentato al vertice degli sviluppatori Esri quest'anno.

Non sono stato affatto contento del supporto spaziale sui vari database NoSQL. Si spingono solo abbastanza lontano per la ricerca di nuvole di punti stupidi, il che ha senso considerando che la maggior parte delle app che usano questo sta facendo cadere i simboli su una mappa di Google su un browser da qualche parte. PostGIS sarà ancora il miglior cavallo di battaglia open source per la gestione delle informazioni spaziali per il prossimo futuro.


9

Questo semplicemente non è vero,

"per sfruttare gli indici spaziali in Mongo, avresti bisogno di una raccolta indicizzata spazialmente che contenga nient'altro che un record per ciascuno dei punti del poligono, con un valore aggiuntivo per l'ID record del tuo record spaziale che vive in un'altra raccolta, quindi usa un query del riquadro di selezione per ottenere gli ID record da una [raccolta] e selezionare [record dati] dall'altra [raccolta], emulando efficacemente un join ".

Ho i dati dei punti USGS memorizzati in una singola raccolta Mongo con record che assomigliano a questo:

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

Sono in grado di eseguire query box di delimitazione su questi dati che restituiscono l'intero record (senza la necessità di un'altra raccolta) bene.

Query:

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

Risposta:

{ "_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 offre anche la possibilità di effettuare ricerche sui vicini più vicini, nonché di effettuare ricerche poligonali. Questo è ben documentato su mongodb.org


Ci scusiamo ma sono confuso, MongoDB può o non può creare un indice spaziale in linea e raccolte poligonali?
Derek Swingley,

2
Al momento non è possibile creare un indice spaziale sulla linea e funzioni poligonali. Tuttavia, può eseguire una ricerca point-in-poligono su una tabella con punti all'interno, se si fornisce la geometria poligonale come parte della query. mongodb.org/display/DOCS/…
lagerratrobe,

1
OK, quindi l'affermazione: "GeoJSON è un formato fantastico, ma per sfruttare gli indici spaziali limitati (SOLO PUNTO) in Mongo" è in realtà vero perché Mongo può solo indicizzare spazialmente i punti.
Derek Swingley,

Ti concedo che una parte di quella frase è accurata, "indici spaziali limitati (SOLO PUNTO)". Quindi 5 parole su 71, o 7%. Ciò lascia il 93% di esso errato. Sono dietro la mia dichiarazione.
Lagerratrobe,

1
Puoi modificare la tua risposta per chiarire? Così com'è, è confuso e fuorviante. Per quanto riguarda l'altra parte dell'affermazione, non è fondamentalmente solo un suggerimento per l'implementazione di un indice spaziale per dati non puntuali? Potrebbe non essere l'ideale o ottimale, ma è solo un suggerimento. Elaborare il motivo per cui pensi che la maggior parte di quella affermazione sia sbagliata sarebbe di aiuto.
Derek Swingley,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.