지리공간적 검색
이 페이지의 내용
개요
이 가이드에서는 Rust 드라이버를 사용하여 지리 공간적 데이터 를 검색하는 방법을 배울 수 있습니다. 지리 공간적 데이터는 지구 표면 또는 유클리드 평면의 지리적 위치를 나타냅니다.
지리 공간적 데이터의 예시는 다음과 같습니다:
영화관 위치
국가 경계
자전거 라이딩 경로
뉴욕의 반려견 운동 공간
그래프의 포인트
이 가이드에는 다음 섹션이 포함되어 있습니다.
지리 공간적 데이터 저장
MongoDB의 모든 지리 공간적 데이터는 다음 형식 중 하나로 저장됩니다:
지구와 같은 구체에 지리 공간적 데이터를 나타내는 형식인 GeoJSON
레거시 좌표 쌍, 유클리드 평면에서 지리 공간적 데이터를 나타내는 형식
GeoJSON
지구와 같은 구체에 지리 공간적 정보를 나타내는 데이터를 저장하려면 GeoJSON을 사용합니다. GeoJSON은 하나 이상의 위치와 유형으로 구성됩니다.
위치
위치는 지구상의 단일 장소를 나타내며 코드에 다음 값을 포함하는 배열로 존재합니다.
첫 번째 위치의 경도
두 번째 위치의 위도
다음 코드는 뉴욕에 있는 MongoDB 본사의 위치 를 나타냅니다.
let coords = vec! [-73.986805, 40.7620853];
중요
경도, 위도 순서
GeoJSON은 좌표를 경도 가 먼저, 위도 가 두 번째로 정렬합니다. 이는 일반적으로 위도를 먼저 나열하고 경도를 나중에 나열하는 지리적 좌표계 규칙과 충돌합니다. GeoJSON 표준에 맞게 좌표 형식을 다시 지정해야 합니다.
유형
GeoJSON 객체의 유형에 따라 객체가 나타내는 기하학적 모양이 결정됩니다. 기하학적 도형은 위치로 구성됩니다.
다음 목록에서는 일반적인 GeoJSON 유형과 이를 위치로 지정하는 방법을 설명합니다.
Point
: 단일 위치입니다. 예를 들어, 다음Point
는 MongoDB 본사의 위치를 나타냅니다.let point = doc! {"name": "MongoDB HQ", "location": doc! { "type": "Point", "coordinates": vec! [-73.986805, 40.7620853], } }; LineString
: 일련의 라인 세그먼트를 형성하는 두 개 이상의 위치 배열 입니다. 은LineString
경로, 루트, 경계 또는 기타 선형 지리 공간적 데이터를 나타낼 수 있습니다. 예를 예시, 다음LineString
은 중국 만리장성의 세그먼트를 나타냅니다.let line = doc! {"name": "Great Wall of China", "location": doc! { "type": "LineString", "coordinates": vec! [ vec! [116.572, 40.430], vec! [116.570, 40.434], vec! [116.567, 40.436], vec! [116.566, 40.441] ], } }; Polygon
: 첫 번째 위치와 마지막 위치가 동일하고 일부 공간을 둘러싸는 위치 배열입니다. 예를 들어 다음Polygon
는 바티칸 시국 내의 땅을 나타냅니다.let polygon = doc! {"name": "Vatican City", "location": doc! { "type": "Polygon", "coordinates": vec![ vec! [ vec! [12.458, 41.906], vec! [12.458, 41.901], vec! [12.450, 41.901], vec! [12.450, 41.906], vec! [12.458, 41.906], ] ], } };
MongoDB 에서 사용할 수 있는 GeoJSON 유형에 학습 보려면 서버 매뉴얼의 GeoJSON 페이지를 참조하세요.
레거시 좌표 쌍
legacy coordinate pairs을 사용하여 2차원 유클리드 평면에 지리 공간적 데이터를 표현합니다.
다음 코드는 워싱턴 DC의 위치를 나타내는 레거시 좌표 쌍을 지정합니다.
let capital = vec! [-77.0369, 38.9072];
legacy coordinate pairs 에 대해 자세히 알아보려면 MongoDB Server 매뉴얼에서 legacy coordinate pairs 을 참조하세요.
지리 공간적 인덱스
지리 공간적 데이터를 쿼리하기 전에 데이터 형식에 해당하는 인덱스를 생성해야 합니다. 다음 인덱스 유형은 지리 공간적 쿼리를 활성화합니다:
2dsphere
GeoJSON 데이터2d
- 레거시 좌표 쌍의 경우
2dsphere
및 2d
인덱스에 대한 다음 섹션에는 Atlas 샘플 데이터의 sample_mflix
데이터베이스에 있는 theaters
컬렉션을 사용하는 코드 예시가 포함되어 있습니다.
2dsphere
GeoJSON 형식으로 저장된 데이터를 쿼리하려면 type
및 coordinates
필드가 모두 포함된 필드를 2dsphere
인덱스에 추가합니다. 다음 예제에서는 location.geo
필드에 2dsphere
인덱스를 생성합니다.
let index = IndexModel::builder() .keys(doc! { "location.geo": "2dsphere" }) .build(); let idx = my_coll.create_index(index).await?; println!("Created index:\n{}", idx.index_name);
Created index: location.geo_"2dsphere"
2d
레거시 좌표 쌍으로 저장된 데이터를 쿼리하려면 레거시 좌표 쌍이 포함된 필드를 2d
인덱스에 추가합니다. 다음 예에서는 location.geo.coordinates
필드에 2d
인덱스를 생성합니다.
let index = IndexModel::builder() .keys(doc! { "location.geo.coordinates": "2d" }) .build(); let idx = my_coll.create_index(index).await?; println!("Created index:\n{}", idx.index_name);
Created index: location.geo.coordinates_"2d"
지리공간 쿼리
지리 공간적 데이터가 포함된 필드에 2dsphere
또는 2d
인덱스를 생성한 후 해당 필드에 액세스하는 지리 공간적 쿼리를 수행할 수 있습니다.
지리 공간적 데이터를 쿼리하려면 필드 이름과 지리 공간적 쿼리 연산자를 사용하여 쿼리 필터를 만듭니다. 특정 지리 공간적 쿼리 연산자에 대한 옵션을 지정하여 반환되는 문서를 제한할 수 있습니다.
지리 공간적 쿼리에 대한 다음 섹션에는 Atlas 샘플 데이터의 sample_mflix
데이터베이스에 있는 theaters
컬렉션을 사용하는 코드 예제가 포함되어 있습니다. collection theaters
의 필드 location.geo
에 2dsphere
인덱스가 있다고 가정합니다.
쿼리 연산자
지리 공간적 데이터를 쿼리하려면 다음 쿼리 연산자 중 하나를 사용합니다:
$near
$geoWithin
$nearSphere
$geoIntersects
(2dsphere 인덱스 필요)
$near
연산자를 사용할 때 다음과 같은 거리 연산자를 지정할 수 있습니다.
$minDistance
$maxDistance
$geoWithin
연산자를 사용할 때 다음과 같은 도형 연산자를 지정할 수 있습니다:
$box
$polygon
$center
$centerSphere
팁
지리 공간적 쿼리 연산자에 대해 자세히 알아보려면 MongoDB Server 매뉴얼의 지리 공간적 쿼리 연산자를 참조하세요.
근접성 쿼리 예시
다음 예시에서는 location.geo
필드에 뉴욕주 뉴욕에 있는 MongoDB 본사에서 1000미터 이내의 위치가 저장되어 있는 문서를 쿼리합니다. 이 코드는 MongoDB 본사로부터의 거리에 따라 오름차순으로 문서를 반환합니다.
let mongodb = vec! [-73.986805, 40.7620853]; let query = doc! {"location.geo": doc! { "$near": { "$geometry": { "type": "Point", "coordinates": mongodb, }, "$maxDistance": 1000, } } }; let mut cursor = my_coll.find(query).await?; while let Some(doc) = cursor.try_next().await? { println!("{}", doc); }
{ "_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] } } }
범위 내 쿼리 예시
다음 예시에서는 location.geo
필드에 서울 지역 내의 위치가 저장되어 있는 문서를 쿼리합니다. 이 예제에서는 지리적 검색 영역의 경계를 나타내는 4개의 좌표를 저장하는 chicago
이라는 벡터를 만듭니다.
let chicago = doc! { "type": "Polygon", "coordinates": vec![ vec![ vec![-87.851, 41.976], vec![-87.851, 41.653], vec![-87.651, 41.653], vec![-87.651, 41.976], vec![-87.851, 41.976], ] ] }; let query = doc! {"location.geo": doc! { "$geoWithin": { "$geometry": chicago }} }; let mut cursor = my_coll.find(query).await?; while let Some(doc) = cursor.try_next().await? { println!("{}", doc); }
{ "_id":{...},"theaterId":322,"location":{"address":{...},"geo":{ "type":"Point","coordinates":[-87.849403, 41.90707] } } } { "_id":{...},"theaterId":2960,"location":{"address":{...},"geo":{ "type":"Point","coordinates":[-87.811262, 41.847938] } } } { "_id":{...},"theaterId":323,"location":{"address":{...},"geo":{ "type":"Point","coordinates":[-87.653557, 41.912025] } } } { "_id":{...},"theaterId":320,"location":{"address":{...},"geo":{ "type":"Point","coordinates":[-87.805817, 41.847572] } } } { "_id":{...},"theaterId":814,"location":{"address":{...},"geo":{ "type":"Point","coordinates":[-87.670631, 41.919514] } } }
추가 정보
찾기 작업에 대해 자세히 알아보려면 데이터 검색 가이드를 참조하세요.
지리 공간적 데이터 작업에 대해 자세히 알아보려면 다음 서버 매뉴얼 페이지를 참조하세요.
API 문서
이 가이드에서 사용되는 메서드 또는 유형에 대해 자세히 알아보려면 다음 API 문서를 참조하세요.