국제 날짜 표시 줄의 다각형 [-180 .. + 180 경도]


10

위성 궤도 스와 스에 대한 다각형을 생성하려고합니다. 지금까지 각 스와 스 가장자리를 [lat, long] 단위로 나타내는 두 개의 선을 생성하는 방법이 있습니다. swath의 일부는 국제 날짜 표시 줄을 가로 지르므로 다음과 같이 포장하십시오.

스와 스 랩

나는 이것을 해결 할 수 있었다 ogr2ogr -wrapdateline:

ogr2ogr -wrapdateline  -f "ESRI Shapefile" test.shp orbits.shp

아마 선을 분할합니까

이제 두 줄의 내부에 다각형을 생성 할 수 있기를 원합니다. 예를 들어, swath의 한쪽 가장자리가 다른 쪽에서 나타날 때 다각형이 채우는 날짜 표시 줄을 가로 지르는 경우 :

가득 따르다

작업을 많이 반복해야하므로 자동화 된 방법이 필요합니다. 파이썬에서 선을 생성 한 방식이므로 바람직합니다. 다음은 선을 포함하는 두 개의 shapefile입니다. wraparound ; 날짜 표시 줄


추가 아이디어는 gis.stackexchange.com/questions/429gis.stackexchange.com/questions/18562 에서 관련 스레드를 참조하십시오 . gis.stackexchange.com/questions/17788에 제시된 아이디어 도 도움이 될 수 있습니다. 그러나 "내부"의 의미가 무엇인지 궁금합니다. 이러한 다각형은 잘 정의되어 있지 않으므로 최소한 (a) 각 폴리 라인의 어느 쪽이 "내부"로 간주되는지 (b) 방법을 나타내는 정보를 제공해야합니다. 기둥 근처에서 잘라냅니다.
whuber

답변:


3

스와 스의 중심을 중심으로 맞춤형 메르카토르 투영을 만들 수 있습니다. 예를 들어, swath 25에 사용하십시오.

+proj=merc +lon_0=-140 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs

이 프로젝션에서 스와 스는 날짜 표시 줄로 분리되지 않습니다. 선에서 다각형을 만들 수 있습니다.

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

그런 다음 EPSG : 4326에서 -179.95 ° E와 179.95 ° E 사이의 절단 다각형을 만듭니다.

Nr;WKT
1;POLYGON ((-179.95 89, 179.95 89, 179.95 -89, -179.95 -89, -179.95 89))

사용자 정의 CRS에도 다시 투영하고 스와 스 다각형에서 빼십시오.

EPSG : 4326으로 ​​다시 투영 한 후 스와 스가 날짜 표시 줄로 올바르게 나뉩니다.

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

날짜 표시 줄을 가로 지르는 모든 스와 스를 계속하십시오.


1

동일한 긴 세로 공간에서 시작하고 마무리하기 위해 스와 스 라인 생성 프로세스를 다시 작성하겠습니다. 즉, 선이 170 °에서 시작하여 -170 °에서 완료된 경우 -180,180으로 줄 바꿈하지 않고 190 °에서 완료되도록 프로세스를 다시 작성합니다.

그런 다음 선 사이에 끊어지지 않은 다각형을 만들 수 있습니다.

그런 다음 클립 프로세스를 사용하여 180, -180 라인에서 다각형을 분할하고 적절하게 360 °를 더하거나 빼서 -180,180 공간 밖에있는 부분을 이동하십시오.

특정 투영 / 데이텀으로 저장하기 전에 모든 작업을 완료하십시오.


1

이 아이디어에 대한 @AndreJ 덕분에 Django GEOS API를 사용 하면 아무것도 다시 투영 할 필요가없는 간단한 솔루션이 있습니다.

1) 날짜 표시 줄에 테두리가있는 다중 다각형을 만듭니다.

from django.contrib.gis.geos.collections import MultiPolygon, LinearRing, Polygon
box1 = ((180.0, 89), (179.95, 89), (179.95, -89), (180.0, -89), (180.0, 89))
box2 = ((-180.0, 89), (-179.95, 89), (-179.95, -89), (-180.0, -89), (-180.0, 89))
poly1 = Polygon(LinearRing(box1))
poly2 = Polygon(LinearRing(box2))
poly = MultiPolygon(poly1, poly2)

2) 문제의 지오메트리가 교차하면 차이를 반환하십시오.

from django.contrib.gis.geos.geometry import GEOSGeometry
geometry = GEOSGeometry(WKT)  # WKT is your polygon in WKT string format
if geometry.intersects(poly):
    print("Geometry crosses dateline... splitting")
    geometry = geometry.difference(poly) # clip with dateline polygon

결과는 다음과 같습니다.

전에

후

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.