2012-06-21 7 views
9

Ich habe das folgende Problem mit MongoDB. Ich habe ein paar Geo-Daten aus meinem Heimatland und ich muss sie in mongodb speichern, um einen einfachen Web Feature Service einzurichten. Dieser Service wird hauptsächlich Bounding-Box-Abfragen mit dem Operator $within durchführen. Die Daten sind im GeoJSON-Format. Deshalb importierte ich zunächst die Dörfer und Städte, die als Punkte ([1,2]) in diesem Format dargestellt werden. Kein Problem. Nächster Schritt Flüsse und Straßen, die LineStrings sind und nach GeoJSON so dargestellt werden [[1,2],[3,4]]. Aber beim Import der Bezirke (die eigentlich Polygon sind und entsprechend der GeoJSON-Spezifikation 3 Dim-Arrrays) habe ich beim Erstellen des Indexes den Fehler geo values have to be numbers bekommen.Speichern Sie GeoJSON Polygone in MongoDB

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

Alle Daten sind gültige GeoJSON, und sind in einfachen 2D-Koordinaten in EPSG: 4326 Projektion.

Hat jemand eine Idee?

Antwort

1

Die Geospatial-Funktionen von MongoDB unterstützen derzeit nur das Speichern von Punkten, nicht von Formen oder Linien. Sie können jedoch Punkte mit Kreisen, Rechtecken oder Polygonen abfragen.

2

Ich musste das gleiche selbst tun, um eine GeoFence-Funktion einzurichten. Was ich tat, war "Polygon" Daten als eine Reihe von Koordinaten und ein Zentrum zu speichern. Zum Beispiel:

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

     ... 

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

In meiner Anwendung (in Python) Ich bin mit den shapely library. Was ich zuerst mache, ist eine Liste von Objekten zu finden, die ein Zentrum haben, das meinem Punkt am nächsten ist. Dann benutze ich auf der Client-Seite (Python) formschön jedes große Koordinaten-Array in ein Polygon und teste dann die Regionen, um herauszufinden, welche meinen Punkt enthalten.

So können Sie können Polygon-Daten in MongoDB als nur Daten speichern, und verwenden Sie einen anderen vorberechneten 2D-Index wie ein Zentrum.

13

Mit MongoDB 2.4 "2dsphere" Index für GeoJSON Punkte verwenden, und Linestrings Polygonen.

Zum Beispiel können Sie diesen Index erstellen:

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

und speichern diese Linestring:

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

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

+0

2,6 unterstützt Multipoint und Multi, Multipolygon und GeometryCollection http://docs.mongodb.org/manual/release-notes/2.6/ –

+0

Diese Beratung hat für mich funktioniert und spart zusätzliche Anwendungslogik! –

2

diesem einen Versuch aus der Mongo Shell geben:

// 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

Ich habe gerade begonnen, mit Polygonen in MongoDB zu arbeiten, aber ich finde die Form der Polygon-Struktur seltsam ... Wenn eine Form eine Reihe von Punkten ist, warum ist das Array dieser Punkte in einem anderen Array? Sollte nicht 'poly.geo.coordinates = [[-80.0, 30.0], [-40.0, 30.0], ...] 'genug sein? – Loupax

+1

@Loupax Koordinaten eines Polygons sind ein Array von LinearRing-Koordinatenfeldern. Das erste Element im Array repräsentiert den äußeren Ring. Alle nachfolgenden Elemente stellen innere Ringe (oder Löcher) dar. (Http://geojson.org/geojson-spec.html#id4) – Farhadi