지리공간적 검색
이 페이지의 내용
개요
이 가이드에서는 MongoDB Java 드라이버로 지리 공간적 데이터 를 검색하는 방법과 MongoDB에서 지원하는 다양한 지리 공간적 데이터 형식에 대해 알아볼 수 있습니다.
지리 공간적 데이터는 지구 표면의 지리적 위치를 나타내는 데이터입니다. 지리 공간적 데이터의 예는 다음과 같습니다.
영화관 위치
국가 경계
자전거 라이딩 경로
뉴욕의 반려견 운동 공간
지구상의 좌표
지리 공간적 데이터를 MongoDB에 저장하고 쿼리하려면 GeoJSON 을 사용합니다. GeoJSON은 IETF(인터넷 엔지니어링 태스크포스)에서 개발한 데이터 형식입니다.
GeoJSON 내 MongoDB 본사의 위치는 다음과 같습니다.
"MongoDB Headquarters" : { "type": "point", "coordinates": [-73.986805, 40.7620853] }
GeoJSON 에 대한 자세한 내용은 공식 IETF 사양을 참조하세요.
GeoJSON 위치
위치는 지구상의 단일 장소를 나타내며 코드에 두세 개의 숫자 값을 포함하는 배열로 존재합니다.
첫 번째 위치의 경도(필수)
두 번째 위치의 위도(필수)
세 번째 위치의 고도(선택 사항)
중요
경도, 위도 순서
GeoJSON은 좌표를 경도가 먼저, 위도가 두 번째로 정렬합니다. 지리적 좌표계 규칙은 일반적으로 위도를 먼저 나열하고 경도를 나중에 나열하기 때문에 의외일 수 있습니다. 작업 중인 다른 도구가 어떤 형식을 사용하는지 확인하세요. OpenStreetMap 및 Google Maps와 같이 널리 사용되는 도구는 좌표를 위도, 경도 순으로 나열합니다.
GeoJSON 유형
GeoJSON 객체의 유형에 따라 기하학적 모양이 결정됩니다. 기하학적 도형은 위치로 구성됩니다.
다음은 몇 가지 일반적인 GeoJSON 유형과 이를 위치로 지정하는 방법입니다:
Point
: 단일 위치. 이는 조각 의 위치 를 나타낼 수 있습니다.LineString
: 두 개 이상의 위치로 구성된 배열 로, 일련의 라인 세그먼트를 형성합니다. 이는 만리장성의 경로를나타낼 수 있습니다.Polygon
: 첫 번째 위치와 마지막 위치가 동일하여 일부 공간을 둘러싸는 위치 배열 입니다. 이는 바티칸 시국 내의 땅을나타낼 수 있습니다.
MongoDB에서 사용할 수 있는 모양에 대해 자세히 알아보려면 GeoJSON 수동 항목을 참조하세요.
GeoJSON 데이터가 포함된 문서 삽입
GeoJSON 데이터를 저장하는 문서 를 삽입하려면 GeoJSON 값이 포함된 문서 를 만들고 문서 를 insertOne()
메서드에 전달합니다.
다음 예시 에서는 GeoJSON 데이터를 포함하는 location.geo
필드 가 포함된 문서 를 삽입합니다.
// Add your MongoCollection setup code here Point point = new Point(new Position(-74.0065, 40.7085)); Document theater = new Document("theaterId", 1203) .append("location", new Document("geo", point)); InsertOneResult result = collection.insertOne(theater);
문서 삽입에 학습 보려면 삽입 작업 가이드 를 참조하세요.
Index
GeoJSON 형식으로 저장된 데이터를 쿼리하려면 GeoJSON 데이터가 포함된 필드를 2dsphere
인덱스에 추가합니다. 다음 스니펫은 Indexes
빌더를 사용하여 location.geo
필드에 2dsphere
인덱스를 생성합니다.
// <MongoCollection setup code here> collection.createIndex(Indexes.geo2dsphere("location.geo"));
Indexes
빌더에 대한 자세한 내용은 인덱스 빌더 가이드를 참조하세요.
2D 평면의 좌표
2차원 유클리드 평면에 x
및 y
좌표를 사용하여 지리 공간적 데이터를 저장할 수 있습니다. 2차원 평면의 좌표를 "레거시 좌표 쌍"이라고 합니다.
legacy coordinate pairs의 구조는 다음과 같습니다.
"<field name>" : [ x, y ]
필드는 첫 번째 값이 x
축 값을 나타내고 두 번째 값이 y
축 값을 나타내는 두 값의 배열을 포함해야 합니다.
레거시 좌표가 포함된 문서 삽입
레거시 좌표 쌍을 저장하는 문서 를 삽입하려면 필드 에 좌표 쌍 값을 할당하는 문서 를 만듭니다. 그런 다음 문서 를 insertOne()
메서드에 전달합니다.
다음 예시 에서는 레거시 좌표 쌍이 포함된 coordinates
필드 가 포함된 문서 를 삽입합니다.
// Add your MongoCollection setup code here Document theater = new Document("theaterId", 1204) .append("coordinates", Arrays.asList(-73.9862, 40.7311)); InsertOneResult result = collection.insertOne(theater);
문서 삽입에 학습 보려면 삽입 작업 가이드 를 참조하세요.
Index
레거시 좌표 쌍으로 저장된 데이터를 쿼리하려면 레거시 좌표 쌍이 포함된 필드를 2d
인덱스에 추가해야 합니다. 다음 스니펫은 Indexes
빌더를 사용하여 coordinates
필드에 2d
인덱스를 생성합니다.
// <MongoCollection setup code here> collection.createIndex(Indexes.geo2d("coordinates"));
Indexes
빌더에 대한 자세한 내용은 인덱스 빌더 가이드를 참조하세요.
MongoDB Server legacy coordinate pairs레거시 좌표쌍에 대한 자세한 내용은 에 legacy coordinate pairs 대한 매뉴얼 페이지를 참조하세요.
팁
지원되는 연산자
구형(2dsphere
) 및 평면(2d
) 인덱스는 전부는 아니지만 일부 동일한 쿼리 연산자를 지원합니다. 전체 연산자 목록과 인덱스 호환성은 지리 공간적 쿼리 수동 항목을 참조하세요.
지리공간 쿼리
지리 공간적 쿼리는 쿼리 연산자와 쿼리 매개변수인 GeoJSON 도형으로 구성됩니다.
쿼리 연산자
지리 공간적 데이터를 쿼리하려면 다음 쿼리 연산자 중 하나를 사용합니다:
$near
$geoWithin
$nearSphere
$geoIntersects
2dsphere 인덱스 필요
Filters
빌더 클래스의 near()
, geoWithin()
, nearSphere()
및 geoIntersects()
유틸리티 메서드를 사용하여 MongoDB Java 드라이버에서 이러한 쿼리 연산자를 지정할 수 있습니다.
지리 공간적 쿼리 연산자에 대한 자세한 내용은 지리 공간적 쿼리 수동 항목 문서를 참조하세요.
Filters
에 대한 자세한 내용은 필터 빌더 가이드를 참조하세요.
쿼리 매개변수
지리 공간적 쿼리에서 사용할 형태를 지정하려면 MongoDB Java 드라이버의 Position
, Point
, LineString
및 Polygon
클래스를 사용합니다.
MongoDB Java 드라이버에서 사용할 수 있는 GeoJSON 모양의 전체 목록은 GeoJSON 패키지 를 참조하세요. API 문서.
예시
다음 예시에서는 MongoDB Atlas 샘플 데이터 세트를 사용합니다. 빠른 시작 가이드에서 프리 티어 Atlas 클러스터를 설정하는 방법과 샘플 데이터 세트를 로드하는 방법을 알아볼 수 있습니다.
이 예에서는 샘플 데이터 집합의 sample_mflix
데이터베이스에 있는 theaters
컬렉션을 사용합니다. 2} 컬렉션에 필드에 theaters
2dsphere
인덱스가 포함되어 location.geo
있습니다.
예제에는 다음과 같은 가져오기가 필요합니다.
import java.util.Arrays; import org.bson.conversions.Bson; import com.mongodb.client.model.geojson.Point; import com.mongodb.client.model.geojson.Polygon; import com.mongodb.client.model.geojson.Position; import static com.mongodb.client.model.Filters.near; import static com.mongodb.client.model.Filters.geoWithin; import static com.mongodb.client.model.Projections.fields; import static com.mongodb.client.model.Projections.include; import static com.mongodb.client.model.Projections.excludeId;
여기에서 Github에서 예제의 소스 코드를찾을 수 있습니다.
근접성 기준 쿼리
점에서 가장 가까운 것부터 가장 먼 것 순으로 문서를 검색하고 반환하려면 Filters
빌더 클래스의 near()
정적 유틸리티 메서드를 사용합니다. near()
메서드는 $near
쿼리 연산자를 사용하여 쿼리를 구성합니다.
다음 예시 10,000
는 5,000
센트럴 공원의 그레이트 론 에서 ~ 미터 거리에있는 극장을 쿼리합니다.
// Add your MongoClient setup code here MongoDatabase database = mongoClient.getDatabase("sample_mflix"); MongoCollection<Document> collection = database.getCollection("theaters"); Point centralPark = new Point(new Position(-73.9667, 40.78)); // Creates a query that matches all locations between 5,000 and 10,000 meters from the specified Point Bson query = near("location.geo", centralPark, 10000.0, 5000.0); // Creates a projection to include only the "location.address.city" field in the results Bson projection = fields(include("location.address.city"), excludeId()); // Prints the projected field of the results from the geospatial query as JSON collection.find(query) .projection(projection) .forEach(doc -> System.out.println(doc.toJson()));
앞의 코드의 출력은 다음과 유사합니다.
{"location": {"address": {"city": "Bronx"}}} {"location": {"address": {"city": "New York"}}} {"location": {"address": {"city": "New York"}}} {"location": {"address": {"city": "Long Island City"}}} {"location": {"address": {"city": "New York"}}} {"location": {"address": {"city": "Secaucus"}}} {"location": {"address": {"city": "Jersey City"}}} {"location": {"address": {"city": "Elmhurst"}}} {"location": {"address": {"city": "Flushing"}}} {"location": {"address": {"city": "Flushing"}}} {"location": {"address": {"city": "Flushing"}}} {"location": {"address": {"city": "Elmhurst"}}}
$near
연산자 에 대한 자세한 내용은 $near에 대한 참고 문서를 참조하세요.
Filters
에 대한 자세한 내용은 필터 빌더 가이드를 참조하세요.
범위 내 쿼리
지정된 모양 내에서 지리 공간적 데이터를 검색하려면 Filters
빌더 클래스의 geoWithin()
정적 유틸리티 메서드를 사용합니다. geoWithin()
메서드는 $geoWithin
쿼리 연산자를 사용하여 쿼리를 구성합니다.
다음 예에서는 롱 아일랜드의 한 구역에 있는 영화관을 검색합니다.
// Add your MongoCollection setup code here // Creates a set of points that defines the bounds of a geospatial shape Polygon longIslandTriangle = new Polygon(Arrays.asList(new Position(-72, 40), new Position(-74, 41), new Position(-72, 39), new Position(-72, 40))); // Creates a projection to include only the "location.address.city" field in the results Bson projection = fields(include("location.address.city"), excludeId()); // Creates a query that matches documents containing "location.geo" values within the specified bounds Bson geoWithinComparison = geoWithin("location.geo", longIslandTriangle); // Prints the projected field of the results from the geolocation query as JSON collection.find(geoWithinComparison) .projection(projection) .forEach(doc -> System.out.println(doc.toJson()));
앞의 코드의 출력은 다음과 유사합니다.
{"location": {"address": {"city": "Baldwin"}}} {"location": {"address": {"city": "Levittown"}}} {"location": {"address": {"city": "Westbury"}}} {"location": {"address": {"city": "Mount Vernon"}}} {"location": {"address": {"city": "Massapequa"}}}
다음 그림은 longIslandTriangle
변수로 정의된 다각형과 쿼리에서 반환된 영화관 위치를 나타내는 점을 보여줍니다.
$geoWithin
연산자에 대한 자세한 내용은 $geoWithin에 대한 참고 문서를 참조하세요 .
쿼리 에 사용할 수 있는 연산자에 대한 자세한 내용은 지리 공간적 쿼리 연산자에 대한 MongoDB Server 매뉴얼 페이지를참조하세요.