Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Trabajar con datos geoespaciales

En esta guía, aprenderá a trabajar con datos geoespaciales: formatos de datos, índices y consultas. Los datos geoespaciales representan una ubicación geográfica en la superficie de la Tierra o datos en un plano euclidiano.

Algunos ejemplos de datos geoespaciales incluyen:

  • Ubicaciones de cines

  • Fronteras de los países

  • Rutas de paseos en bicicleta

  • Áreas para ejercitar perros en Nueva York

  • Puntos en un grafo

Todos los datos geoespaciales en MongoDB se almacenan en uno de los siguientes formatos:

  • GeoJSON, un formato que representa datos geoespaciales en una esfera similar a la tierra.

  • Legacy Pair De Coordenadas, un formato que representa datos geoespaciales en un plano euclidiano.

Utiliza GeoJSON para almacenar datos que representen información geoespacial en una esfera similar a la Tierra. GeoJSON se compone de una o más posiciones y un tipo.

Una posición representa un lugar único en la Tierra y existe en el código como un arreglo que contiene los siguientes valores:

  • Longitud en la primera posición (requerido)

  • Latitud en la segunda posición (obligatoria).

  • Elevación en la tercera posición (opcional)

La siguiente es la posición de la sede de MongoDB en la ciudad de Nueva York, NY.

[]float64{-73.986805, 40.7620853}

Importante

Longitud luego latitud

GeoJSON ordena las coordenadas primero en longitud y en segundo lugar en latitud. Esto puede ser sorprendente ya que las convenciones del sistema de coordenadas geográficas generalmente colocan la latitud primero y luego la longitud. Asegúrate de comprobar qué formato utilizan otras herramientas con las que trabajas. Herramientas populares como OpenStreetMap y Google Maps muestran las coordenadas primero con el formato de latitud y luego longitud.

El tipo de tu objeto GeoJSON determina la forma geométrica que representa. Las formas geométricas se componen de posiciones.

Aquí tienes algunos tipos comunes de GeoJSON y cómo puedes especificarlos con posiciones:

  • Point: una sola posición. El siguiente Point representa la ubicación de la sede de MongoDB:

    bson.D{
    {"name", "MongoDB HQ"},
    {"location", bson.D{
    {"type", "Point"},
    {"coordinates", []float64{-73.986805, 40.7620853}},
    }},
    }
  • LineString: un arreglo de dos o más posiciones que forma una serie de segmentos de línea. Un LineString puede representar un camino, ruta, frontera u otro dato geoespacial lineal. El siguiente LineString representa un segmento de La Gran Muralla China:

    bson.D{
    {"name", "Great Wall of China"},
    {"location", bson.D{
    {"type", "LineString"},
    {"coordinates", [][]float64{
    {116.572, 40.430},
    {116.570, 40.434},
    {116.567, 40.436},
    {116.566, 40.441},
    }}},
    },
    }
  • Polygonun arreglo de posiciones en el que la primera y la última posición son iguales y encierran un espacio. Lo siguiente Polygon representa la tierra dentro de la Ciudad del Vaticano:

    bson.D{
    {"name", "Vatican City"},
    {"location", bson.D{
    {"type", "Polygon"},
    {"coordinates", [][][]float64{{
    {12.446086, 41.901977},
    {12.457952, 41.901559},
    {12.455375, 41.907351},
    {12.449863, 41.905186},
    {12.446086, 41.901977},
    }}},
    }},
    }

Para conocer más sobre los tipos de GeoJSON que puedes utilizar en MongoDB, consulta la entrada del manual de GeoJSON.

Para obtener información definitiva sobre GeoJSON, consulte la especificación oficial de IETF.

Utilice pares de coordenadas heredadas para almacenar datos que representan información geoespacial en un plano euclidiano bidimensional.

El campo debe contener un arreglo de dos valores, en el que el primero representa el valor del eje x y el segundo representa el valor del eje y.

bson.D{{"center", []int16{0, 0}}}

Para obtener más información sobre legacy coordinate pairs, consulta la página del manual del servidor MongoDB sobre legacy coordinate pairs.

Para habilitar las consultas en datos geoespaciales, deberás crear un índice que corresponda al formato de los datos. Los siguientes tipos de índice permiten consultas geoespaciales:

  • 2dsphere para datos GeoJSON

  • 2d para pares de coordenadas heredados

Para query datos almacenados en el formato GeoJSON, agregue el campo que contiene tanto la type como la coordinates a un índice 2dsphere. El siguiente ejemplo crea un índice 2dsphere en el campo location:

indexModel := mongo.IndexModel{
Keys: bson.D{{"location", "2dsphere"}},
}
name, err := coll.Indexes().CreateOne(context.TODO(), indexModel)
if err != nil {
panic(err)
}

Para query datos almacenados como legacy coordinate pairs, debe agregar el campo que contiene los legacy coordinate pairs a un índice 2d. El siguiente ejemplo crea un índice 2d en el campo coordinates:

indexModel := mongo.IndexModel{
Keys: bson.D{{"location.coordinates", "2d"}},
}
name, err := coll.Indexes().CreateOne(context.TODO(), indexModel)
if err != nil {
panic(err)
}

Para realizar un query geoespacial, crea un filtro de query con un nombre de campo y un operador del query geoespacial. Puedes especificar opciones adicionales para ciertos operadores del query geoespaciales para limitar los documentos devueltos.

Si aún no lo ha hecho, deberá crear un índice geoespacial para habilitar las consultas geoespaciales.

Tip

Operadores compatibles

Los índices esféricos (2dsphere) y planos (2d) admiten algunos, pero no todos, los mismos operadores del query. Para ver una lista completa de operadores y su compatibilidad con el índice, consulta la entrada del manual de consultas geoespaciales.

Para consultar sus datos geoespaciales, utilice uno de los siguientes operadores de consulta:

  • $near

  • $geoWithin

  • $nearSphere

  • $geoIntersects requiere un índice 2dsphere

Cuando se usa el operador $near, puede especificar los siguientes operadores de distancia:

  • $minDistance

  • $maxDistance

Al utilizar el operador $geoWithin, se pueden especificar los siguientes operadores de forma:

  • $box

  • $polygon

  • $center

  • $centerSphere

Para más información sobre los operadores del query geoespacial, vea la entrada del manual para queries geoespaciales.

Los siguientes ejemplos utilizan el conjunto de datos de muestra de MongoDB Atlas. Puedes cargar conjuntos de datos de muestra en tu base de datos usando el nivel gratuito de MongoDB Atlas siguiendo los pasos en Cómo comenzar con Atlas o puedes importar el conjunto de datos de muestra en una instancia local de MongoDB.

Los ejemplos utilizan la colección theaters en la base de datos sample_mflix del conjunto de datos de muestra. La colección theaters contiene un índice 2dsphere en el campo location.geo.

El siguiente ejemplo query documentos con un campo location.geo dentro de los 1000 metros de la sede de MongoDB en la ciudad de Nueva York, NY. Devuelve documentos de los más cercanos a los más lejanos.

mongoDBHQ := bson.D{{"type", "Point"}, {"coordinates", []float64{-73.986805, 40.7620853}}}
filter := bson.D{
{"location.geo", bson.D{
{"$near", bson.D{
{"$geometry", mongoDBHQ},
{"$maxDistance", 1000},
}},
}},
}
var places []bson.D
output, err := coll.Find(context.TODO(), filter)
if err = output.All(context.TODO(), &places); err != nil {
panic(err)
}
for _, place := range places {
res, _ := bson.MarshalExtJSON(place, false, false)
fmt.Println(string(res))
}
{"_id":{...},"theaterId":1908,"location":{"address":{...},"geo":{"type":"Point","coordinates":[-73.983487,40.76078]}}}
{"_id":{...},"theaterId":1448,"location":{"address":{...},"geo":{"type":"Point","coordinates":[-73.982094,40.769882]}}}

El siguiente ejemplo query documentos con un campo location.geo a no menos de 2000 metros y no más lejos de 3000 metros de la sede de MongoDB en la ciudad de Nueva York, Nueva York. Devuelve documentos de los más cercanos a los más lejanos.

mongoDBHQ := bson.D{{"type", "Point"}, {"coordinates", []float64{-73.986805, 40.7620853}}}
filter := bson.D{
{"location.geo",
bson.D{
{"$nearSphere", bson.D{
{"$geometry", mongoDBHQ},
{"$minDistance", 2000},
{"$maxDistance", 3000},
}},
}},
}
var places []bson.D
output, err := coll.Find(context.TODO(), filter)
if err = output.All(context.TODO(), &places); err != nil {
panic(err)
}
for _, place := range places {
res, _ := bson.MarshalExtJSON(place, false, false)
fmt.Println(string(res))
}
{"_id":{...},"theaterId":482,"location":{...},"geo":{"type":"Point","coordinates":[-73.99295,40.74194]}}}
  • Para obtener más información sobre cómo trabajar con datos geoespaciales, consulta la entrada del manual de datos geoespaciales.

  • Para obtener más información sobre los tipos de GeoJSON admitidos, consulta la entrada en el manual de GeoJSON.

  • Para obtener más información sobre los operadores del query geoespacial, consulta la entrada del manual sobre queries geoespaciales.

  • Para obtener más información sobre cómo trabajar con índices con el controlador de Go, consulte el index guide.

Volver

JSON extendido

En esta página