Поделиться через


Поддержка геопространственных запросов

Теперь геопространственные данные можно хранить и запрашивать с помощью Azure DocumentDB. Это усовершенствование предоставляет мощные средства для управления пространственными данными и анализа пространственных данных, что обеспечивает широкий спектр приложений, таких как отслеживание расположения в реальном времени, оптимизация маршрутов и пространственный анализ.

Ниже приведен краткий обзор геопространственных команд и операторов, поддерживаемых ниже.

Геопространственные операторы запросов

$geoIntersects

Выбирает документы, в которых указанная геометрия пересекается с геометрией документов. Полезно для поиска документов, которые совместно используют любую часть пространства с заданной геометрией.

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

$geoWithin

Выбирает документы с геопространственных данных, которые полностью существуют в указанной фигуре. Этот оператор используется для поиска документов в определенной области.

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

$box

Определяет прямоугольную область с помощью двух пар координат (нижние и левые и верхние правые угла). Используется с оператором $geoWithin для поиска документов в этом прямоугольнике. Например, поиск всех расположений в прямоугольной области на карте.

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

$center

Определяет круговую область с помощью центра и радиуса в радианах. Используется с оператором $geoWithin для поиска документов в этом круге.

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

$centerSphere

$centerАналогично, но определяет сферическую область с помощью центра и радиуса в радианах. Полезно для вычислений сферической геометрии.

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

$geometry

Задает объект GeoJSON для определения геометрии. Используется с геопространственных операторами для выполнения запросов на основе сложных фигур.

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

$maxDistance

Указывает максимальное расстояние от точки для геопространственного запроса. Используется с $near операторами и $nearSphere операторами. Например, поиск всех расположений в пределах 2 км от заданной точки.

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

$minDistance

Указывает минимальное расстояние от точки для геопространственного запроса. Используется с $near операторами и $nearSphere операторами.

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

$polygon

Определяет многоугольник с помощью массива пар координат. Используется с оператором $geoWithin для поиска документов в этом многоугольнике.

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

$near

Находит документы, расположенные рядом с указанной точкой. Возвращает документы, отсортированные по расстоянию от точки. Например, поиск ближайших ресторанов к расположению пользователя.

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

$nearSphere

$nearАналогично, но выполняет вычисления на сферической поверхности. Полезно для более точных вычислений расстояния на поверхности Земли.

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

Этап геопространственного агрегирования

$geoNear

Выполняет геопространственный запрос для возврата документов, отсортированных по расстоянию от указанной точки. Может включать дополнительные критерии запроса и возвращать сведения о расстоянии.

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

Рекомендации и неподдерживаемые возможности

  • В настоящее время запрос с одним кольцом многоугольника GeoJSON, область которого превышает одно полушарие, не поддерживается. В таких случаях Azure DocumentDB возвращает следующее сообщение об ошибке:

    Error: Custom CRS for big polygon is not supported yet.
    
  • Составной индекс, использующий обычный индекс и геопространственный индекс, не допускается. Рассмотрим пример.

    db.collection.createIndex({a: "2d", b: 1});
    Error: Compound 2d indexes are not supported yet
    
  • Многоугольники с отверстиями в настоящее время не поддерживаются для использования с $geoWithin запросов. Хотя вставка многоугольника с отверстиями не ограничена, в конечном итоге происходит сбой со следующим сообщением об ошибке:

    Error: $geoWithin currently doesn't support polygons with holes
    
  • Поле ключа всегда требуется на этапе агрегирования $geoNear. Если ключевое поле отсутствует, возникает следующая ошибка:

    Error: $geoNear requires a 'key' option as a String
    
  • У $geoNearэтапов , $nearи $nearSphere этапы не имеют строгих требований к индексу, поэтому эти запросы не завершаются ошибкой, если индекс отсутствует.