2012-06-21 18 views
9

Ho il seguente problema con MongoDB. Ho ricevuto alcuni dati geografici dal mio paese e devo memorizzarli in mongodb per configurare un semplice servizio Web Feature. Questo servizio effettuerà per lo più query di delimitazione tramite l'operatore $within. I dati sono in formato GeoJSON. Quindi ho importato inizialmente i Villaggi e le Città che sono rappresentati come punti ([1,2]) in questo formato. Nessun problema. Il prossimo passo fiumi e strade che sono LineStrings e secondo GeoJSON rappresentato in questo modo [[1,2],[3,4]]. Ma quando si importano i distretti (che in realtà sono poligoni e in base alla specifica GeoJSON 3 dim-registri) ho ricevuto l'errore geo values have to be numbers durante la creazione dell'indice.Memorizza poligoni GeoJSON in MongoDB

db.collection.ensureIndex({"geometry.coordinates" : "2d"}); 

Tutti i dati sono validi GeoJSON e sono in semplici coordinate 2D in EPSG: 4326 proiezione.

Qualcuno ha un'idea?

risposta

1

Le funzionalità geospaziali di MongoDB attualmente supportano solo la memorizzazione di punti, non di forme o linee. Tuttavia, è possibile interrogare punti utilizzando cerchi, rettangoli o poligoni.

2

Ho dovuto fare anch'io la stessa cosa per impostare una funzione Geofence. Quello che ho fatto è stato memorizzare i dati "poligono" come una serie di coordinate e un centro. Per esempio:

{ 
    "_id" : ObjectId("4f189d132ae5e92272000000"), 
    "name" : "Alaska", 
    "points" : [ 
     { "coords" : [ 
      -141.0205, 
      70.0187 ] 
     }, 

     ... 

     { "coords" : [ 
      -141.0205, 
      70.0187 ] 
     } 
    ], 
    "center" : { 
     "coords" : [ 
      -153.6370465116279, 
      61.42329302325581 ] 
    } 
} 

Nella mia applicazione (in python) Sto usando il shapely library. Quello che faccio prima è trovare un elenco di oggetti che hanno un centro più vicino al mio punto. Quindi sul lato client (python) uso una conversione shapely di ogni array di coordinate grande in un poligono, quindi testiamo le regioni per trovare quali contengono il mio punto.

Quindi è possibile memorizzare dati poligono in MongoDB come solo dati e utilizzare un altro indice 2d precompilato come un centro.

13

Con MongoDB 2.4 utilizzare l'indice "2dsphere" per GeoJSON punti, LineString e poligoni.

Ad esempio, è possibile creare questo indice:

db.mycoll.ensureIndex({ loc : "2dsphere" }) 

e memorizzare questo LineString:

{ loc : { type : "LineString" , coordinates : [ [ 1 , 2 ] , [ 3 , 4 ] ] } } 

Vedi http://docs.mongodb.org/manual/applications/2dsphere/.

+0

2,6 sosterrà MultiPoint, MultiLineString, MultiPolygon e GeometryCollection http://docs.mongodb.org/manual/release-notes/2.6/ –

+0

Questo la consulenza ha funzionato per me e consente di risparmiare ulteriore logica applicativa! –

2

dare una prova dalla shell mongo:

// Polygon in GeoJson format 
var poly = {}; 
poly.name = 'GeoJson polygon'; 
poly.geo = {}; 
poly.geo.type = 'Polygon'; 
poly.geo.coordinates = [ 
    [ [ -80.0, 30.0 ], [ -40.0, 30.0 ], [ -40.0, 60.0 ], [-80.0, 60.0 ], [ -80.0, 30.0 ] ] 
]; 
db.foo.insert(poly); 
db.foo.ensureIndex({geo: "2dsphere" }); 
+0

Ho appena iniziato a lavorare con Polygon in MongoDB ma trovo strano la forma della struttura poligonale ... Se una forma è un insieme di punti, perché la matrice di quei punti si trova all'interno di un altro array? Non dovresti 'poly.geo.coordinates = [[-80.0, 30.0], [-40.0, 30.0], ...]' essere abbastanza? – Loupax

+1

@Loupax Le coordinate di un poligono sono una matrice di matrici di coordinate LinearRing. Il primo elemento nell'array rappresenta l'anello esterno. Qualsiasi elemento successivo rappresenta anelli interni (o fori). (Http://geojson.org/geojson-spec.html#id4) – Farhadi