2017-01-17 9 views
8

나는 fooCollection 콜렉션을 가지고있는 MongoDB 데이터베이스를 가지고있다. 이 컬렉션에는 바운딩 폴리곤의 방식으로 지형 공간 데이터가 포함 된 문서가 있습니다. 내 응용 프로그램에서 C# MongoDB 드라이버를 사용하고 있습니다. 나는 그것이 대부분의 사람들과 잘 작동하지만 특정 공간 질의가있는 문서를 찾지 못하고있는 것으로 나타났습니다. 내가 위반 한 문서를 제외하고는 해당 문서를 비우고 쿼리를 직접 실행하여 문서를 찾으려고했습니다.

내 문서는 다음과 같습니다

{ 
"_id" : UUID("12345678-62d9-4024-86dc-123456789012"), 
"polygon" : { 
    "type" : "Polygon", 
    "coordinates" : [ [ 
      [ 18.414846, -33.9699577 ], 
      [ 18.414846, -26.0991189 ], 
      [ 31.0330578, -26.0991189 ], 
      [ 31.0330578, -33.9699577 ], 
      [ 18.414846, -33.9699577 ] 
    ] ] 
}, 
"foo": "bar" 
} 

나는 또한 컬렉션이 인덱스를 가지고 :

다음 쿼리가 제대로이 문서 반환
[ 
    1, 
    { 
     "polygon" : "2dsphere" 
    }, 
    "polygon_2dsphere", 
    "data.fooCollection", 
    3 
] 

그러나

db.getCollection('fooCollection').find({ 
    "polygon": { 
     $geoIntersects: { 
      $geometry: { 
       type: "LineString", 
       coordinates: [[24.7698287, -28.7353533],[28.0423, -26.19793]] 
}}}}) 

을, 이 검색어는 그렇지 않습니다.

db.getCollection('fooCollection').find({ 
    "polygon": { 
     $geoIntersects: { 
      $geometry: { 
       type: "LineString", 
       coordinates: [[27.7706902, -26.1091189],[28.0423, -26.19793]] 
}}}}) 

이러한 세 가지 기하학을 플로팅하면 실제로 작동하지 않는 이유는 알 수 없습니다.

  • 두 줄은 작업 라인이 더 이상
  • 작동 라인은 90 °와 180 ° 사이의 다른 ° 0 ° 내지 90의 베어링을 갖고 다각형
  • 내에 완전히 놓여.

누구든지이 동작을 설명 할 수 있습니까?

EDIT : 또한 LineStrings를 사용하는 대신 개별적으로 포인트를 테스트했습니다. 적중 한 사람은 [24.7698287, -28.7353533]뿐입니다. 당신은 geojson here을 볼 수 있습니다 또는 http://geojson.io/에 다음 줄을 붙여 세 가지 형상을 직접 그릴 수있는 쿼리는 가장자리가 다각형 교차 경우에도 히트해야하고 어떤 점

내에서 거짓말을하지 않습니다 - 나는 유도 선이 필요합니까 :

{"type":"GeometryCollection","geometries":[{"type":"Polygon","coordinates":[[[18.414846,-33.9699577],[18.414846,-26.0991189],[31.0330578,-26.0991189],[31.0330578,-33.9699577],[18.414846,-33.9699577]]]},{"type":"LineString","coordinates":[[27.7706902,-26.1091189],[28.0423,-26.19793]]},{"type":"LineString","coordinates":[[24.7698287,-28.7353533],[28.0423,-26.19793]]}]} 
+0

안녕하세요, Ivan, 폴리곤을 지정하여'$ geoIntersects '와 일치하는 성공을 거두었습니다. Mongo 문서는 또한 LineStrings를 사용하여 예제를 사용하지 않습니다. 올바르게 관찰하면 쿼리가 작동하므로 이상하지 않은 쿼리입니다. 다른 지리적 연산자를 사용해도 동일한 결과를 얻을 수 있는지 확인해 보셨습니까? 마지막으로 경계 상자 안에 완전히 들어있는 경로 나 경계 상자와 부분적으로 만나는 경로를 찾았습니까? –

답변

4

사람이 동작을 설명 할 수 있습니까?

이것은 지구가 평평하지 않고 구형 (곡선)으로되어 있기 때문입니다. 지구 표면은 왜곡없이 비행기에서 표현 될 수 없습니다. 따라서 모든지도 투영법은 지구를 왜곡합니다. 참고 사항 Map Projections

MongoDB 2dsphere index은 지구 모양의 구형에 대한 지오메트리를 계산하는 쿼리를 지원합니다.

좌표를 http://geojson.io에 매핑하면 지구의 구형 특성을 고려하지 않습니다. 더 짧은 선형 문자열은 "사각형"다각형 내에있는 것으로 나타납니다.당신이 구형 왜곡이 있다는 사실을 고려 https://geodndmap.mongodb.com에 GeoJSON의 지오를 매핑하는 경우

geojson.io

, 아래 볼 수 있습니다 :

geodndmap.mongodb.com

짧은 유도 선은 외부 실제로 "사각형"다각형 이것은 MongoDB 2dsphere 인덱스/쿼리가 수행되는 것입니다.

왜곡 효과의 영향은 더 길거나 더 큰 영역 투영과 함께 커집니다.

예 :

{"type":"GeometryCollection","geometries":[ 
{"type":"Polygon","coordinates":[[[18.414846,-33.9699577],[18.414846,-26.0991189],[31.0330578,-26.0991189],[31.0330578,-33.9699577],[18.414846,-33.9699577]]]}, 
{"type":"LineString","coordinates":[[24.7698287,-28.7353533],[88.0423,-26.19793]]}]} 

geojson.io

geodndmap.mongodb.com

는 PS가 : 파일로 또는에서 텍스트로 중, geodndmap.mongodb.com, 드래그를 사용하여지도에 GeoJSON을 삭제하려면 편집 프로그램.

관련 문제