반 자오선에 걸친 지리 데이터가있는 데이터베이스 및 API에 대한 모범 사례


24

자오선 (± 180 ° 경도)에 이르고 GeoJSON으로 클라이언트 웹 응용 프로그램에서 보내고받을 필요가있을 때 지리적 지형 (선, 다각형 및 여러 부분으로 된 등가)을 저장하는 가장 좋은 방법은 무엇입니까?


과거 및 예측 열대 저기압 트랙 및 바람 반경을 다루기 위해 Postgres / PostGIS 데이터베이스를 지원하여 서버 측 웹 API 작업을 시작하고 있습니다. 태평양의 많은 사이클론은 불행히도 반 자오선을 가로 지르는 경향이 있습니다.

여기에 이미지 설명을 입력하십시오

반 자오선 근처에 살고있는 뉴질랜드 인으로서, 지역 데이터에서 대처 전략을 가질만큼이 문제를 자주 겪었지만 실제로 모범 사례로 생각되는 부분을 찾고 싶습니다. 불행히도 태그가 지정된 기존 질문이 없으므로 관련 질문을 찾기가 어렵습니다. 이 문제를 해결하는 데 보인 질문은 모두 응용 프로그램 별 조언을 찾는 것으로 보입니다. 이 질문 은 경계가없는 지구 스패닝 GeoJSON 다각형의 경우에 대한 자오선을 간단히 설명합니다. 이 질문 은 내가 요구하는 것에 매우 가깝습니다.

기록 및 예측 사이클론을 공간 데이터베이스에 저장해야하지만 반 자오선에 문제가있을 것으로 예상합니다. 예를 들어 위도 / 경도로 시작하여 (0,179)끝나는 선 (0,-179)은 방향에 대해 모호합니다. 이러한 경로는 공간 데이터베이스에 어떻게 저장해야합니까 (특히 PostGIS로 작업하고 있지만 솔루션이 충분히 일반적이기를 바랍니다)? 내가 가진 몇 가지 아이디어 :

  1. 기능 형상을 변경하지 말고 모호성을 클라이언트 응용 프로그램으로 이동하십시오.
  2. 자오선가로 지르는 자오선가로 지르는 자오선가로 지르는 형상을 여러 부분 으로 나눕니다 . ( GeoJSON 사양 지원은 CRS를 이름 .)
  3. 이러한 불연속성이없는 다른 사이클론 유역 또는 해양 지역에 대한 비전 역 투영 작업
  4. 사이클론이 지구 전체를 돌아 다니는 것이 결코 관찰되지 않았다는 사실을 악용하여 (90,-90) 360 ° 위상으로 오프셋 된 위도 범위에서 시작하는 사이클론 좌표를 저장합니다 (다른 것들은 -180–180 ° 유지).
  5. 사이클론이 아프리카의 남쪽 끝에서 매우 남쪽에있을 가능성이 거의 없다는 사실을 악용하려면 위의지도와 같이 경도 30 °에서 휴식을 취 하십시오.
  6. 허용 좌표 EPSG 4326의 유효 범위를 넘어 확장하는 자오선을 전달되는 기능에 대한 예> 180 및 <-180 °.
  7. TopoJSON에서와 같이 델타 인코딩 (예 : 시작하여 (0,-179)다음 좌표는 -3위도 서쪽)입니다. PostGIS에 데이터를 저장할 때 이것을 구현할지 여부 또는 방법을 모릅니다. 그러나 이것은 클라이언트 응용 프로그램으로 데이터를 보내기위한 훌륭한 솔루션입니다.
  8. 어떤 형태의 벡터 표기법 또는 극좌표. (어려우며 특이한 것 같습니다.)

이 중 일반적인 아이디어가 아니기 때문에 아이디어 2-5는 마음에 들지 않지만, 특정 애플리케이션에 적합하기 때문에 아이디어가 마음에 듭니다. 태평양 지역의 데이터만을 다루는 응용 프로그램의 경우 많은 의미가있을 수 있으므로 옵션으로 완전히 할인하고 싶지는 않습니다.

아이디어 6과 7은 Tom MacWright의 블로그 에서 가져 왔습니다.이 기사 는 읽을 가치가 있지만 반 자오선 과 관련하여 결정적인 것은 아닙니다.

Idea 4는 GeographicaGS 'GeodesicLinesToGISPython 에서 사용 fiona.transform.transform_geom되며 360도 자오선 오프셋과 함께 사용 됩니다. Fiona는 OGR을 사용하고 -wrapdateline있습니다. 나는 그것이 매우 견고한 선례이며 실제로는 일반적인 것이라고 가정합니다.

스토리지 문제와 관련하여 이러한 기능을 클라이언트 애플리케이션으로 전송하는 방법과 애플리케이션에서 다시 게시 된 데이터를 고려해야하는 방법을 고려해야합니다 (예 : 태평양의 사이클론 예측 트랙을 변경하는 사람 예측기). 교환 형식은 아마도 GeoJSON 일 것이지만 반드시 그럴 필요는 없습니다.

불행히도 GeoJSON 사양은 반 자오선 문제에 대해 명시 적이 지 않습니다. 에서이 위키 백과 :

많은 지리 소프트웨어 라이브러리 또는 데이터 형식은 세계를 직사각형으로 투영합니다. 이 사각형은 매우 자주 180 번째 자오선으로 나뉩니다. 이것은 종종 180 번째 자오선을 통해 간단한 작업 (영역 또는 선을 나타내는 것과 같은)을 수행하는 것을 불가능하게합니다. 몇 가지 예 :

  • GeoJSON 사양은 사양에서 180 번째 자오선 처리에 대해 언급하지 않았으며, 180 번째 자오선을 가로 지르는 선의 표현은 세계를 돌아 다니는 것으로 해석 될 수 있습니다.

  • OpenStreetMap에서 (러시아 경계와 같은) 영역은 180 번째 자오선에서 분할됩니다.

필자는 GeoJSON에 자오선 확장 기능의 특정 표준 표현이 없으며 의도적으로 모호하게 남아 있습니다 (여러 부분의 기하학적 구조로 인해 문제가 해결 될 수 있음). 마찬가지로 OpenStreetMap에는 반 자오선에 지오메트리 분할이 있지만, 그러한 분할 피처가 다중 부분인지 실제로 불연속적인 레코드인지는 알 수 없습니다.

이것은 특히 경계선 또는이 라인에 걸쳐있는 다른 공간 요청을 만드는 관점에서나 입력과 피처 지오메트리에 대한 업데이트를 구문 분석하고 살균하는 관점에서 다소 문제가 있습니다. 이것이 내가 따라야 할 모범 사례를 결정하려는 이유입니다.


1
그것은 정말 좋은 질문입니다. 이전에는 90도에서 시작하는 수제 좌표계를 사용했지만 매우 작은 영역에만 관심이있었습니다. 실제로 제대로 감싸는 것은 없습니다. 나는 그것이 180을 가로 지르는 (중요한) 땅 덩어리가 없기 때문에 거의 모든 사람들이 그것을 매핑해야하기 때문에 모든 문제가 거의 관심을 기울이지 않기 때문이라고 생각합니다.
Michael Stimson

좋은 질문입니다. 실제로 좌표가 360을 초과하여 확장 할 수없는 이유는 없지만 mod를 사용하여 좌표를 복구 할 수있는 이유는 없지만 포인트 4로 운명을 유혹하고 있다고 생각합니다. 델타는 가장 확장 가능한 솔루션처럼 들리며 데이터 압축 측면에서 이점을 얻을 수 있지만 고객의 책임을 고객에게 전가합니다.
John Powell

GeoJSON에 대한 의견 중 일부는 1.0 RC 이후로 오래되었습니다. GeoJSON의 CRS 정의가 더 이상 사용되지 않는 예가 있습니다 ( sgillies.net//2014/08/06/pruning-crs-from-geojson.html ). 나는 이것을 결국 편집 할 것이다.
alphabetasoup

답변:


7

데이터 스토리지 및 분석 관점에서 순수하게 말하면 geographyPostGIS유형은 여러 설계 목표 중에서 반 자오선을 염두에두고 설계되었습니다. 유형에 맞게 특별히 설계된 몇 가지 기능geography 이 있습니다 .

예를 들어, 피지의 타베 우니 ( Taveuni) 피지 ( 그레이트 서클 매퍼로 매핑)를 가로 지르는 라인 스트링을 생각해보십시오 .

SELECT ST_Length('LINESTRING(179.9 -17, -179.8 -16.7)'::geography);

측지선 의 길이 는 약 46km입니다. 마찬가지로 ST_Area는 경도 좌표가 +179와 -179 사이에서 점프하더라도 섬의 다각형에서 올바르게 작동합니다.

EPSG : 4326 geometrygeography유형으로 캐스팅 하면 좌표가 정규화됩니다. 예를 들어 마지막 좌표의 경도는> 180입니다.

SELECT ST_AsGeoJSON('LINESTRING (179.9 -17, 180.2 -16.7)'::geography);

NOTICE:  Coordinate values were coerced into range [-180 -90, 180 90] for GEOGRAPHY
                           st_asgeojson
------------------------------------------------------------------
 {"type":"LineString","coordinates":[[179.9,-17],[-179.8,-16.7]]}

geography첫 번째 예에서 정확히 동일한 유형 으로 다시 변환 되지만 GeoJSON 출력 으로 다시 변환됩니다 . NOTICE (또는 예 SET client_min_messages TO WARNING;) 를 무시하고 모든 종류의 재미있는 모양을 geography유형 으로 변환 할 수 있습니다.


geographyPostGIS 외부의지도에 유형을 표시 하는 것은 다른 이야기이며 더 나은 답변 이이 측면에 영향을 미치기를 바랍니다.


2
한 가지 제한 사항은 지리가 더 이상 180º 이상이어야한다는 것입니다 ( 고급 FAQ 참조 ). 그러나, 당신은 정점에이 규칙을 사용할 수와 같은 어리석은 일을 할 : LINESTRING(179.9 -17, 60 -16.9, -60 -16.8, -179.8 -16.7), 어떤 정렬의 랩 주변.
Mike T

0

분명한 대답은 (1) 즉, 고객이 "올바른 일"을하도록하는 것입니다. 고려해야 할 좋은 사례는이 kml 파일로 근사한 남극 대륙을 나타내는 다각형입니다.

<kml> <Folder> <name>Antarctica</name> <Placemark> <name>Antarctica</name> <Polygon> <tessellate>1</tessellate> <outerBoundaryIs> <LinearRing> <coordinates> -58,-63.1,0 -74,-72.9,0 -102,-71.9,0 -102,-74.9,0 -131,-74.3,0 -163,-77.5,0 163,-77.4,0 172,-71.7,0 140,-65.9,0 113,-65.7,0 88,-66.6,0 59,-66.9,0 25,-69.8,0 -4,-70,0 -14,-71,0 -33,-77.3,0 -46,-77.9,0 -61,-74.7,0 -58,-63.1,0 </coordinates> </LinearRing> </outerBoundaryIs> </Polygon> </Placemark> </Folder> </kml>

경도 나누기가 발생하는 델타 인코딩 또는 이동은 이와 같은 데이터에는 도움이되지 않습니다. 그것을 남극 대륙에 특정한 투영으로 사용하면 효과가 있지만 이것은 일반적인 해결책이 아닙니다.

놀랍게도, Google 어스 프로는 "개요"모드를 사용하지 않는 한이 다각형을 올바르게 표시하지 않습니다. 여기를 봐 Google 어스 프로 스크린 샷


Google 어스에 대해 잘 모르므로 개요 모드를 사용하는 방법을 모르겠습니다. 그러나 여기 자오선에 걸친 유효한 다각형이 있으며 이미지에서 Google 어스가 올바르게 렌더링하지 못한다는 것을 알 수 있습니다. 따라서 Google 어스가 대처할 수없는 경우 모호성을 클라이언트 애플리케이션에 전달하는 것이 가장 좋은 방법이라는 증거는 어떻게됩니까? 그것? 덧붙여서 QGIS는 SRID 4326에서이 다각형에 대한 렌더링 문제를 제공하지만 반 자오선에 선을 도입하면 (선은 제외하고) 그렇지 않습니다. 남극 입체 투영법을 사용하면 원본이 훌륭하게 렌더링됩니다.
alphabetasoup

충분합니다. 그러나 kml 좌표가 위도와 경도로 제한되어 있기 때문에 사용자가이 특정 예에서 Google 어스를 돕기 위해 할 수있는 일은 없습니다. 클라이언트 측 에서이 문제를 해결하기 위해 Google 어스 관리자에게 책임이 있습니다. (불행히도, 그들은 그렇게하는 경향이 거의 없습니다!)
cffk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.