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 de ejercicio para perros en la ciudad de Nueva York

  • Puntos en un gráfico

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.

  • Par de coordenadas heredado, 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 solo lugar en la Tierra y existe en el código como una matriz que contiene los siguientes valores:

  • Longitud en la primera posición (obligatorio)

  • Latitud en la segunda posición (obligatorio)

  • 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 como longitud primero y latitud después. Esto puede resultar sorprendente, ya que las convenciones de los sistemas de coordenadas geográficas generalmente indican la latitud primero y la longitud después. Asegúrate de verificar el formato que usan otras herramientas con las que trabajas. Herramientas populares como OpenStreetMap y Google Maps indican las coordenadas como latitud primero y longitud después.

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

A continuación se muestran algunos tipos GeoJSON comunes 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: una matriz de dos o más posiciones que forma una serie de segmentos de línea. Un LineString puede representar una ruta, una frontera o cualquier 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},
    }}},
    },
    }
  • Polygon: una matriz de posiciones donde la primera y la última son iguales y encierran espacio. El siguiente Polygon representa el terreno 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 IETF.

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

Su campo debe contener una matriz de dos valores en la 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 pares de coordenadas heredados, consulte la página del manual del servidor MongoDB sobre pares de coordenadas heredados.

Para habilitar las consultas sobre datos geoespaciales, debe crear un índice que se corresponda con el formato de los datos. Los siguientes tipos de índice permiten realizar consultas geoespaciales:

  • 2dsphere para datos GeoJSON

  • 2d para pares de coordenadas heredados

Para consultar datos almacenados en formato GeoJSON, agregue el campo que contiene tanto type como 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 consultar datos almacenados como pares de coordenadas heredados, debe agregar el campo que contiene los pares de coordenadas heredados 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 una consulta geoespacial, cree un filtro de consulta con un nombre de campo y un operador de consulta geoespacial. Puede especificar opciones adicionales para ciertos operadores de consulta geoespacial 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 () y planos2dsphere2d () admiten algunos, pero no todos, los mismos operadores de consulta. Para obtener una lista completa de operadores y su compatibilidad con índices, consulte la entrada del manual sobre consultas geoespaciales.

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

  • $near

  • $geoWithin

  • $nearSphere

  • $geoIntersects requiere un índice 2dsphere

Al utilizar el operador $near, puede especificar los siguientes operadores de distancia:

  • $minDistance

  • $maxDistance

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

  • $box

  • $polygon

  • $center

  • $centerSphere

Para obtener más información sobre los operadores de consultas geoespaciales, consulte la entrada manual para consultas geoespaciales.

Los siguientes ejemplos utilizan el conjunto de datos de ejemplo de MongoDB Atlas. Puede cargar conjuntos de datos de ejemplo en su base de datos en la versión gratuita de MongoDB Atlas siguiendo la Guía de introducción a Atlas o importar el conjunto de datos de ejemplo a una instancia local de MongoDB.

Los ejemplos utilizan la colección theaters de 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 busca documentos con un campo location.geo a menos de 1000 metros de la sede de MongoDB en Nueva York. Devuelve los documentos desde el más cercano hasta el más lejano.

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 busca documentos con un campo location.geo a una distancia no inferior a 2000 metros ni superior a 3000 metros de la sede de MongoDB en Nueva York. Devuelve los documentos desde el más cercano al más lejano.

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, consulte la entrada manual de datos geoespaciales.

  • Para obtener más información sobre los tipos GeoJSON admitidos, consulte la entrada del manual GeoJSON.

  • Para obtener más información sobre los operadores de consultas geoespaciales, consulte la entrada manual para consultas geoespaciales.

  • Para obtener más información sobre cómo trabajar con índices con el controlador Go, consulte la guía de índice.

Volver

JSON extendido

En esta página