다음을 통해 공유


지리 공간적 쿼리 지원

이제 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

지리 공간적 쿼리에 대한 지점으로부터의 최대 거리를 지정합니다. 연산자와 $nearSphere 함께 $near 사용됩니다. 예를 들어 지정된 지점에서 2km 이내의 모든 위치를 찾습니다.

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

$minDistance

지리 공간적 쿼리에 대한 지점으로부터의 최소 거리를 지정합니다. 연산자와 $nearSphere 함께 $near 사용됩니다.

  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
    
  • , $near$nearSphere 스테이지에는 $geoNear엄격한 인덱스 요구 사항이 없으므로 인덱스가 누락된 경우 이러한 쿼리가 실패하지 않습니다.