JSON 문서에 선과 다각형을 저장하는 방법은 무엇입니까?


24

증가하는 NoSQL 움직임을 살펴보고 MongoDB 와 같은 데이터베이스 는 GIS를위한 유연한 데이터 스토리지에 새로운 관점을 제공합니다. 2D 인덱스 와 공간 함수를 이용하기 위해 JSON 문서에 선과 다각형을 저장하는 가장 좋은 방법은 무엇입니까 ?


6
MongoDB는 현재 포인트 이외의 인덱스 작업을 지원하지 않으며 공간 함수는 범위 내에서 찾기로 제한됩니다.
scw

답변:


16

GeoJSON은 여기 SPEC 입니다.

다음은 선과 다각형의 예입니다.

{ "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"}
         }
       }
     ]
   }

9

주목해야 할 것은 공간 데이터 유형에 대한 MongoDB의 지원은 심각한 공간 조회에 끔찍하게 나쁘다는 것입니다. GeoCouch를 약간 덜 싫어하지만 여전히 갈 길이 있습니다.

GeoJSON은 환상적인 형식이지만 Mongo의 제한된 (POINT-ONLY) 공간 인덱스를 이용하려면 각 다각형 점에 대한 레코드 만 보유하고 공간 레코드 인덱스가 필요합니다. 다른 컬렉션에있는 공간 레코드를 선택한 다음 경계 상자 쿼리를 사용하여 하나의 레코드 ID를 가져오고 다른 하나를 선택하여 효과적으로 조인을 에뮬레이션합니다.

해킹을 수행하고 경계 상자의 모서리를 레코드의 포인트로 수행 할 수 있지만 경계 상자 검색이 실패하고 전혀 비효율적 인 디자인 패턴이 발생하여 개발자에게 모든 종류의 책임을 부적절하게 푸시합니다.

참조 구현으로 올해 Esri 개발자 서밋에서 발표 된 이 코드 를 참조 할 수 있습니다 .

다양한 NoSQL 데이터베이스에 대한 공간 지원에 전혀 만족하지 않았습니다. 그것들은 멍청한 포인트 클라우드 조회에 충분합니다.이를 사용하는 대부분의 앱은 브라우저의 Google지도에 압정을 떨어 뜨릴 것입니다. PostGIS는 앞으로도 공간 정보를 관리 할 수있는 최고의 오픈 소스 인력이 될 것입니다.


9

이것은 사실이 아닙니다.

"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에 잘 정리되어 있습니다.


사과하지만 혼란 스럽습니다 .MongoDB는 라인 및 다각형 피처 컬렉션에 공간 인덱스를 만들 수 있습니까?
Derek Swingley

2
현재 선 및 다각형 피쳐에 공간 인덱스를 작성할 수 없습니다. 그러나 쿼리의 일부로 다각형 지오메트리를 제공하는 경우 테이블에 점이있는 테이블에서 다각형 내 검색을 수행 할 수 있습니다. mongodb.org/display/DOCS/…
lagerratrobe

1
따라서, "GeoJSON은 환상적인 형식이지만 몽고의 제한된 (POINT-ONLY) 공간 인덱스를 활용하는 것은 실제로 몽고가 공간적으로 만 인덱스 할 수 있기 때문에 사실입니다."
데릭 스윙 리

나는 그 문장의 일부가 "제한된 (POINT-ONLY) 공간 인덱스"라고 정확하다고 인정합니다. 71 개 단어 중 5 개 또는 7 % 93 %가 잘못되었습니다. 나는 나의 진술 뒤에 서있다.
lagerratrobe

1
명확하게 답변을 편집 할 수 있습니까? 있는 그대로 혼란스럽고 오해의 소지가 있습니다. 명령문의 다른 부분과 관련하여 기본적으로 비 포인트 데이터에 대한 공간 인덱스를 구현하기위한 제안이 아닙니까? 이상적이지 않거나 최적의 것은 아니지만 단지 제안 일뿐입니다. 그 진술의 대부분이 잘못되었다고 생각하는 이유를 자세히 설명하면 도움이 될 것입니다.
Derek Swingley
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.