Compartir a través de


Compatibilidad con consultas geoespaciales

Los datos geoespaciales ahora se pueden almacenar y consultar mediante Azure DocumentDB. Esta mejora proporciona herramientas eficaces para administrar y analizar datos espaciales, lo que permite una amplia gama de aplicaciones, como el seguimiento de ubicaciones en tiempo real, la optimización de rutas y el análisis espacial.

Esta es una introducción rápida de los comandos y operadores geoespaciales que ahora se admiten:

Operadores de consulta geoespacial

$geoIntersects

Selecciona documentos en los que una geometría especificada se interseca con la geometría de los documentos. Resulta útil para buscar documentos que comparten cualquier parte del espacio con una geometría determinada.

   db.collection.find({
       location: {
           $geoIntersects: {
               $geometry: {
                   type: "<GeoJSON object type>",
                   coordinates: [[[...], [...], [...], [...]]]
               }
           }
       }
   })

$geoWithin

Selecciona documentos con datos geoespaciales que existen completamente dentro de una forma especificada. Este operador se usa para buscar documentos dentro de un área definida.

   db.collection.find({
       location: {
           $geoWithin: {
               $geometry: {
                   type: "Polygon",
                   coordinates: [[[...], [...], [...], [...]]]
               }
           }
       }
   })

$box

Define un área rectangular con dos pares de coordenadas (esquinas inferior izquierda y superior derecha). Se usa con el $geoWithin operador para buscar documentos dentro de este rectángulo. Por ejemplo, buscar todas las ubicaciones dentro de una región rectangular en un mapa.

  db.collection.find({
      location: {
          $geoWithin: {
              $box: [[lowerLeftLong, lowerLeftLat], [upperRightLong, upperRightLat]]
          }
      }
  })

$center

Define un área circular mediante un punto central y un radio en radianes. Se usa con el $geoWithin operador para buscar documentos dentro de este círculo.

  db.collection.find({
      location: {
          $geoWithin: {
              $center: [[longitude, latitude], radius]
          }
      }
  })

$centerSphere

De forma similar a $center, pero define un área esférica mediante un punto central y un radio en radianes. Útil para los cálculos de geometría esférica.

  db.collection.find({
      location: {
          $geoWithin: {
              $centerSphere: [[longitude, latitude], radius]
          }
      }
  })

$geometry

Especifica un objeto GeoJSON para definir una geometría. Se usa con operadores geoespaciales para realizar consultas basadas en formas complejas.

  db.collection.find({
      location: {
          $geoIntersects: {
              $geometry: {
                  type: "<GeoJSON object type>",
                  coordinates: [longitude, latitude]
              }
          }
      }
  })

$maxDistance

Especifica la distancia máxima desde un punto para una consulta geoespacial. Se usa con $near operadores y $nearSphere . Por ejemplo, buscar todas las ubicaciones dentro de 2 km de un punto determinado.

  db.collection.find({
      location: {
          $near: {
              $geometry: {
                  type: "Point",
                  coordinates: [longitude, latitude]
              },
              $maxDistance: distance
          }
      }
  })

$minDistance

Especifica la distancia mínima desde un punto para una consulta geoespacial. Se usa con $near operadores y $nearSphere .

  db.collection.find({
      location: {
          $near: {
              $geometry: {
                  type: "Point",
                  coordinates: [longitude, latitude]
              },
              $minDistance: distance
          }
      }
  })

$polygon

Define un polígono mediante una matriz de pares de coordenadas. Se usa con el $geoWithin operador para buscar documentos dentro de este polígono.

  db.collection.find({
      location: {
          $geoWithin: {
              $geometry: {
                  type: "Polygon",
                  coordinates: [[[...], [...], [...], [...]]]
              }
          }
      }
  })

$near

Busca documentos que están cerca de un punto especificado. Devuelve documentos ordenados por distancia desde el punto. Por ejemplo, buscar los restaurantes más cercanos a la ubicación de un usuario.

    db.collection.find({
        location: {
            $near: {
                $geometry: {
                    type: "Point",
                    coordinates: [longitude, latitude]
                },
                $maxDistance: distance
            }
        }
    })

$nearSphere

Similar a $near, pero realiza cálculos en una superficie esférica. Útil para cálculos de distancia más precisos en la superficie de la Tierra.

    db.collection.find({
        location: {
            $nearSphere: {
                $geometry: {
                    type: "Point",
                    coordinates: [longitude, latitude]
                },
                $maxDistance: distance
            }
        }
    })

Fase de agregación geoespacial

$geoNear

Realiza una consulta geoespacial para devolver documentos ordenados por distancia desde un punto especificado. Puede incluir criterios de consulta adicionales e información de distancia de retorno.

  db.collection.aggregate([
      {
          $geoNear: {
              near: {
                  type: "Point",
                  coordinates: [longitude, latitude]
              },
              distanceField: "distance",
              spherical: true
          }
      }
  ])

Consideraciones y funcionalidades no admitidas

  • Actualmente, no se admite la consulta con un polígono GeoJSON de un solo anillo cuyo área supere un solo hemisferio. En tales casos, Azure DocumentDB devuelve el siguiente mensaje de error:

    Error: Custom CRS for big polygon is not supported yet.
    
  • No se permite un índice compuesto mediante un índice normal y un índice geoespacial. Por ejemplo:

    db.collection.createIndex({a: "2d", b: 1});
    Error: Compound 2d indexes are not supported yet
    
  • Actualmente, los polígonos con agujeros no se admiten para su uso con consultas de $geoWithin. Aunque la inserción de un polígono con agujeros no está restringida, finalmente se produce un error con el siguiente mensaje de error:

    Error: $geoWithin currently doesn't support polygons with holes
    
  • El campo de clave siempre es necesario en la fase de agregación de $geoNear. Si falta el campo de clave, se produce el siguiente error:

    Error: $geoNear requires a 'key' option as a String
    
  • Las $geoNearfases , $neary $nearSphere no tienen requisitos de índice estrictos, por lo que estas consultas no generarían errores si falta un índice.