답변:
다음은 선과 다각형의 예입니다.
{ "type": "FeatureCollection",
"features": [
{ "type": "Feature",
"geometry": {"type": "Point", "coordinates": [102.0, 0.5]},
"properties": {"prop0": "value0"}
},
{ "type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [
[102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]
]
},
"properties": {
"prop0": "value0",
"prop1": 0.0
}
},
{ "type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0],
[100.0, 1.0], [100.0, 0.0] ]
]
},
"properties": {
"prop0": "value0",
"prop1": {"this": "that"}
}
}
]
}
주목해야 할 것은 공간 데이터 유형에 대한 MongoDB의 지원은 심각한 공간 조회에 끔찍하게 나쁘다는 것입니다. GeoCouch를 약간 덜 싫어하지만 여전히 갈 길이 있습니다.
GeoJSON은 환상적인 형식이지만 Mongo의 제한된 (POINT-ONLY) 공간 인덱스를 이용하려면 각 다각형 점에 대한 레코드 만 보유하고 공간 레코드 인덱스가 필요합니다. 다른 컬렉션에있는 공간 레코드를 선택한 다음 경계 상자 쿼리를 사용하여 하나의 레코드 ID를 가져오고 다른 하나를 선택하여 효과적으로 조인을 에뮬레이션합니다.
해킹을 수행하고 경계 상자의 모서리를 레코드의 포인트로 수행 할 수 있지만 경계 상자 검색이 실패하고 전혀 비효율적 인 디자인 패턴이 발생하여 개발자에게 모든 종류의 책임을 부적절하게 푸시합니다.
참조 구현으로 올해 Esri 개발자 서밋에서 발표 된 이 코드 를 참조 할 수 있습니다 .
다양한 NoSQL 데이터베이스에 대한 공간 지원에 전혀 만족하지 않았습니다. 그것들은 멍청한 포인트 클라우드 조회에 충분합니다.이를 사용하는 대부분의 앱은 브라우저의 Google지도에 압정을 떨어 뜨릴 것입니다. PostGIS는 앞으로도 공간 정보를 관리 할 수있는 최고의 오픈 소스 인력이 될 것입니다.
이것은 사실이 아닙니다.
"Mongo에서 공간 인덱스를 이용하려면 각 다각형 점에 대한 레코드 만 보관하고 다른 컬렉션에있는 공간 레코드의 레코드 ID에 대한 추가 값이있는 공간 인덱스 컬렉션이 필요합니다. 하나의 [컬렉션]에서 레코드 ID를 가져오고 다른 [컬렉션]에서 [레코드 데이터]를 선택하여 효과적으로 조인을 에뮬레이트하는 경계 상자 쿼리 "
다음과 같은 레코드를 가진 단일 Mongo 컬렉션에 USGS 포인트 데이터가 저장되어 있습니다.
> db.names.find({FEATURE_NAME: 'Mount Saint Helens', STATE_ALPHA: 'WA'})
{ "_id" : ObjectId("4e262106d7a99b7db41a4919"),
"_ID" : 1525360,
"FEATURE_NAME" : "Mount Saint Helens",
"FEATURE_CLASS" : "Summit",
"STATE_ALPHA" : "WA",
"STATE_FIPS" : 53,
"COUNTY_NAME" : "Skamania",
"COUNTY_FIPS" : "059",
"COORDS" : [ -122.1944, 46.1912 ],
"ELEV_IN_FT" : "8356" }
이 데이터에 대해 다른 레코드가 필요없는 전체 레코드를 반환하는 경계 상자 쿼리를 수행 할 수 있습니다.
질문:
> box = [[-126.562500,45.089036], [-123.750000,47.040182]]
[ [ -126.5625, 45.089036 ], [ -123.75, 47.040182 ] ]
> db.names.find({"COORDS" : {"$within" : {"$box" : box}}, FEATURE_CLASS: "Summit"}, {FEATURE_NAME: true, COUNTY_NAME: true, STATE_ALPHA: true, ELEV_IN_FEET: true}).limit(5);
응답:
{ "_id" : ObjectId("4e2620f8d7a99b7db4146cec"), "FEATURE_NAME" : "Harlocker Hill", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Coos" }
{ "_id" : ObjectId("4e2620f8d7a99b7db414a349"), "FEATURE_NAME" : "Neskowin Crest", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Tillamook" }
{ "_id" : ObjectId("4e2620f8d7a99b7db414a105"), "FEATURE_NAME" : "Miles Mountain", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Tillamook" }
{ "_id" : ObjectId("4e2620f8d7a99b7db414934a"), "FEATURE_NAME" : "Mount Gauldy", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Tillamook" }
{ "_id" : ObjectId("4e2620f8d7a99b7db4149d06"), "FEATURE_NAME" : "Little Hebo", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Yamhill" }
Mongo는 또한 가장 가까운 이웃 검색을 수행 할 수 있으며 다각형 검색을 할 수 있습니다. 이것은 mongodb.org에 잘 정리되어 있습니다.