2012-06-21 26 views
9

Tengo el siguiente problema con MongoDB. Obtuve algunos datos geográficos de mi país de origen y tengo que almacenarlos en mongodb para configurar un servicio web sencillo. Este servicio hará principalmente consultas de cuadro delimitador utilizando el operador $within. Los datos están en formato GeoJSON. Por lo tanto importé al principio las Aldeas y Ciudades que están representadas como puntos ([1,2]) en este formato. No hay problema. Siguiente paso ríos y calles que son LineStrings y de acuerdo con GeoJSON representado de esta manera [[1,2],[3,4]]. Pero al importar los distritos (que de hecho son polígonos y según la especificación GeoJSON 3 arrreglos tenues) obtuve el error geo values have to be numbers al crear el índice.Tienda de polígonos GeoJSON en MongoDB

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

Todos los datos son GeoJSON válidos, y están en coordenadas planas 2d en la proyección EPSG: 4326.

¿Alguien tiene una idea?

Respuesta

1

Las características geoespaciales de MongoDB actualmente solo admiten puntos de almacenamiento, no formas o líneas. Sin embargo, puede consultar puntos usando círculos, rectángulos o polígonos.

2

Tuve que hacer lo mismo para configurar una función GeoFence. Lo que hice fue almacenar datos de "polígono" como una serie de coordenadas y un centro. Por ejemplo:

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

     ... 

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

En mi aplicación (en Python) Estoy utilizando el shapely library. Lo primero que hago es encontrar una lista de objetos que tienen un centro más cercano a mi punto. Luego, en el lado del cliente (python) utilizo shapely convertir cada gran conjunto de coordenadas a un polígono, y luego probar las regiones para encontrar cuáles contienen mi punto.

Así que puede almacenar los datos del polígono en MongoDB como datos, y utilizar algún otro índice 2d precalculado como un centro.

13

Con MongoDB 2.4 utilizar el índice "2dsphere" para los puntos de GeoJSON, cadenas de línea y polígonos.

Por ejemplo, puede crear este índice:

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

y almacenar esta cadena de línea:

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

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

+0

2,6 apoyará multipunto, MultiLineString, MultiPolygon y GeometryCollection http://docs.mongodb.org/manual/release-notes/2.6/ –

+0

Este consejos funcionó para mí y ahorra lógica de aplicación adicional! –

2

le daría prueba de la concha 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

Acabo de empezar a trabajar con polígonos en MongoDB, pero la forma de la estructura del polígono me parece extraña ... Si una forma es un conjunto de puntos, ¿por qué la matriz de esos puntos está dentro de otra matriz? ¿No debería bastar con 'poly.geo.coordinates = [[-80.0, 30.0], [-40.0, 30.0], ...]'? – Loupax

+1

@Loupax Las coordenadas de un polígono son una matriz de matrices de coordenadas LinearRing. El primer elemento de la matriz representa el anillo exterior. Cualquier elemento posterior representa anillos interiores (o agujeros). (Http://geojson.org/geojson-spec.html#id4) – Farhadi

Cuestiones relacionadas