지리공간 쿼리
개요
이 가이드 에서는 지리 공간적 데이터, 데이터 형식, 인덱스 및 쿼리로 작업하는 방법을 학습 수 있습니다.
지리 공간적 데이터는 지구 표면의 지리적 위치 를 나타냅니다.
지리 공간적 데이터의 예시는 다음과 같습니다:
영화관 위치
국가 경계
자전거 라이딩 경로
뉴욕의 반려견 운동 공간
그래프의 포인트
지리 공간적 데이터 형식
MongoDB의 모든 지리 공간적 데이터는 다음 형식 중 하나로 저장됩니다:
GeoJSON, a format that represents geospatial data on an earth-like sphere
Legacy coordinate pairs, a format that represents geospatial data on a Euclidean plane
GeoJSON
지구와 같은 구체에 지리 공간적 정보를 나타내는 데이터를 저장하려면 GeoJSON을 사용합니다. GeoJSON은 하나 이상의 위치와 유형으로 구성됩니다.
위치
위치는 단일 위치 를 나타내며 코드에서 다음 값을 포함하는 배열 로 존재합니다.
첫 번째 위치의 경도(필수)
두 번째 위치의 위도(필수)
세 번째 위치의 고도(선택 사항)
다음은 뉴욕에 있는 MongoDB 본사의 위치 입니다.
[-73.986805, 40.7620853]
중요
경도, 위도 순서
GeoJSON 은 경도를 먼저, 위도를 두 번째로 좌표를 정렬합니다. OpenStreetMap 및 Google Maps와 같은 널리 사용되는 도구는 위도를 먼저, 경도를 다음으로 좌표를 표시하므로 작업 중인 다른 도구가 어떤 형식을 사용하는지 확인하세요.
유형
GeoJSON 객체 의 유형에 따라 해당 객체가 나타내는 기하학적 모양이 결정됩니다. 기하학적 도형은 위치로 구성됩니다.
다음은 몇 가지 일반적인 GeoJSON 유형과 이를 위치로 지정하는 방법입니다:
Point
: 단일 위치. 다음Point
은 MongoDB 본사의 위치를 나타냅니다.{ "type": "Point", "coordinates": [-73.856077, 40.848447] } LineString
: 일련의 라인 세그먼트를 형성하는 두 개 이상의 위치 배열입니다.LineString
은 경로, 루트, 경계, 기타 선형 지형 공간 데이터를 나타낼 수 있습니다. 다음LineString
는 만리장성의 한 부분을 나타냅니다.{ "type": "LineString", "coordinates": [[116.572, 40.430], [116.570, 40.434], [116.567, 40.436], [116.566, 40.441]] } Polygon
: 첫 번째 위치와 마지막 위치가 동일하고 일부 공간을 둘러싸는 위치 배열 입니다. 다음Polygon
은(는) 바티칸 시국 내의 땅을 대략적으로 나타냅니다.{ "type": "Polygon", "coordinates": [[[12.446086, 41.901977], [12.457952, 41.901559], [12.455375, 41.907351], [12.449863, 41.905186], [12.446086, 41.901977]]] }
MongoDB에서 사용할 수 있는 GeoJSON 유형에 대한 자세한 내용은 GeoJSON 수동 항목을 참조하세요.
GeoJSON 형식에 대한 자세한 내용은 공식 IETF 사양을 참조하세요.
레거시 좌표 쌍
legacy coordinate pairs 을 사용하여 2차원 평면에 지리 공간적 정보를 나타내는 데이터를 저장 합니다.
Legacy coordinate pairs are represented by an array of two values, in which the first value
represents the x
axis value and the second represents the y
axis value.
레거시 좌표 쌍에 대한 자세한 내용은 레거시 좌표 쌍에 대한 MongoDB 서버 매뉴얼 페이지를 참조하세요.
지리 공간적 인덱스
지리 공간적 데이터에 대한 쿼리를 활성화하려면 데이터 형식에 해당하는 인덱스를 생성해야 합니다. 다음 인덱스 유형은 지리 공간적 쿼리를 활성화합니다.
2dsphere
, GeoJSON 데이터에 사용됨2d
, legacy coordinate pairs에 사용
지리 공간적 인덱스를 만드는 방법에 학습 보려면 인덱스 가이드 의 지리 공간적 인덱스 섹션을 참조하세요.
쿼리 연산자
To query geospatial data using the find
operator, use one of the following query operators:
$near
$geoWithin
$nearSphere
$geoIntersects
( 2dsphere 인덱스 필요)
$near
연산자를 사용할 때 다음과 같은 거리 연산자를 지정할 수 있습니다.
$minDistance
$maxDistance
$geoWithin
연산자를 사용할 때 다음과 같은 도형 연산자를 지정할 수 있습니다:
$box
$polygon
$center
$centerSphere
To query geospatial data using the aggregate
operator, you must use the $geoNear
pipeline stage.
지리 공간적 쿼리 연산자에 대한 자세한 내용은 서버 매뉴얼의 지리 공간적 쿼리 연산자 를 참조하세요.
예시
The following examples uses the MongoDB Atlas sample dataset. To obtain this sample dataset, see the Atlas sample datasets. To learn how to create a free MongoDB Atlas cluster and load the sample datasets, see PyMongo 시작하기.
이 예에서는 샘플 데이터 집합의 sample_mflix
데이터베이스에 있는 theaters
컬렉션을 사용합니다. 2} 컬렉션에 필드에 theaters
2dsphere
인덱스가 포함되어 location.geo
있습니다.
근접성 기준 쿼리
다음 예시 에서는 뉴욕주 뉴욕에 있는 MongoDB 본사에서 1000 미터 이내에 있는 location.geo
필드 값이 있는 문서를 쿼리합니다. 가장 가까운 문서부터 가장 먼 문서까지 반환합니다.
# set query with point at MongoDB headquarters and a maxDistance of 1000 meters query = { "location.geo": { "$near": { "$geometry": { # Search around this location "type": "Point", "coordinates": [-73.986805, 40.7620853] }, "$maxDistance": 1000 # Distance in meters (1 km) } } } # fetches the _id and theaterId fields projection = { "theaterId": 1 } nearby_places = location.find(query, projection) for i in nearby_places: print(i)
{ "_id" : ObjectId("59a47287cfa9a3a73e51e8e2"), "theaterId" : 1908 } { "_id" : ObjectId("59a47286cfa9a3a73e51e838"), "theaterId" : 1448 }
다각형별 쿼리
다음 예시 에서는 맨해튼 경계 내에 존재하는 location.geo
필드 값이 있는 문서를 쿼리합니다.
# Polygon representation of Manhattan query = { "location.geo": { "$geoWithin": { "$geometry": { # Search around this location "type": "Polygon", "coordinates": [[[-73.925492, 40.877410], [-73.910372, 40.872366], [-73.935127, 40.834020], [-73.929049, 40.798569], [-73.976485, 40.711432], [-74.015747, 40.701229], [-74.018859, 40.708367], [-74.008007, 40.754307], [-73.925492, 40.877410]]] } } } } # fetches the _id and theaterId fields projection = { "theaterId": 1 } nearby_places = location.find(query, projection) for i in nearby_places: print(i)
{ "_id" : ObjectId("59a47287cfa9a3a73e51e8e2"), "theaterId" : 1908 } { "_id" : ObjectId("59a47287cfa9a3a73e51eccb"), "theaterId" : 835 } { "_id" : ObjectId("59a47286cfa9a3a73e51e838"), "theaterId" : 1448 } { "_id" : ObjectId("59a47286cfa9a3a73e51e744"), "theaterId" : 1028 } { "_id" : ObjectId("59a47287cfa9a3a73e51ebe1"), "theaterId" : 609 } { "_id" : ObjectId("59a47287cfa9a3a73e51e8ed"), "theaterId" : 1906 } { "_id" : ObjectId("59a47287cfa9a3a73e51e87d"), "theaterId" : 1531 } { "_id" : ObjectId("59a47287cfa9a3a73e51eb63"), "theaterId" : 482 }
추가 리소스
지리 공간적 데이터 작업에 대한 자세한 내용은 지리 공간적 데이터 수동 입력 문서를 참조하세요.
지원되는 GeoJSON 유형에 대한 자세한 내용은 GeoJSON 수동 항목을 참조하세요.
지리 공간적 쿼리 연산자에 대한 자세한 내용은 지리 공간적 쿼리 수동 항목 문서를 참조하세요.