2012-06-21 3 views
9

J'ai le problème suivant avec MongoDB. J'ai reçu des données géographiques de mon pays d'origine et je dois les stocker dans mongodb pour mettre en place un simple service d'entités Web. Ce service effectuera principalement des requêtes de boîte englobante à l'aide de l'opérateur $within. Les données sont au format GeoJSON. Par conséquent j'ai importé d'abord les villages et les villes qui sont représentés comme des points ([1,2]) dans ce format. Aucun problème. Prochaine étape rivières et rues qui sont LineStrings et selon GeoJSON représenté de cette façon [[1,2],[3,4]]. Mais lors de l'importation des districts (qui sont en fait des polygones et selon la spécification GeoJSON 3 dim arrrays) j'ai eu l'erreur geo values have to be numbers lors de la création de l'index.Stocker les polygones GeoJSON dans MongoDB

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

Toutes les données sont GeoJSON valides et sont en coordonnées 2d uniformes dans la projection EPSG: 4326.

Quelqu'un a-t-il une idée?

Répondre

1

Les fonctions géospatiales de MongoDB prennent actuellement en charge uniquement les points de stockage, pas les formes ou les lignes. Vous êtes toutefois en mesure d'interroger les points à l'aide de cercles, de rectangles ou de polygones.

2

J'ai dû faire la même chose moi-même pour mettre en place une fonctionnalité GeoFence. Ce que j'ai fait était stocker des données de "polygone" comme une série de coordonnées, et un centre. Par exemple:

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

     ... 

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

Dans ma demande (en python) J'utilise le shapely library. Ce que je fais d'abord est de trouver une liste d'objets qui ont un centre le plus proche de mon point. Ensuite, du côté client (python), j'utilise de façon ordonnée la conversion de chaque grand tableau de coordonnées en un polygone, puis je teste les régions pour trouver celles qui contiennent mon point.

Donc, vous pouvez stocker les données de polygone dans MongoDB comme des données, et utiliser un autre index 2d précalculé comme un centre.

13

Avec MongoDB 2.4 utiliser le "2dsphere" index pour les points GeoJSON, LineStrings et Polygones.

Par exemple, vous pouvez créer cet index:

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

Et stocker ce LineString:

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

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

+0

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

+0

Ce Le conseil a fonctionné pour moi et économise la logique d'application supplémentaire! –

2

pour cette solution de la coquille 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

Je viens de commencer à travailler avec Polygons dans MongoDB mais je trouve bizarre la forme de la structure du polygone ... Si une forme est un ensemble de points, pourquoi le tableau de ces points est dans un autre tableau? Est-ce que 'poly.geo.coordinates = [[-80.0, 30.0], [-40.0, 30.0], ...] 'ne devrait pas suffire? – Loupax

+1

@Loupax Les coordonnées d'un polygone sont un tableau de tableaux de coordonnées LinearRing. Le premier élément du tableau représente l'anneau extérieur. Tous les éléments suivants représentent des anneaux intérieurs (ou des trous). (Http://geojson.org/geojson-spec.html#id4) – Farhadi

Questions connexes