Próbuję generować wielokąty dla satelitarnych pokosów orbit. Do tej pory mam metodę generowania dwóch linii, które reprezentują krawędź każdego pokosu w [łac, długo]. Niektóre pokosy przekraczają międzynarodową linię danych i dlatego obejmują:
Udało mi się to rozwiązać za pomocą ogr2ogr
-wrapdateline
:
ogr2ogr -wrapdateline -f "ESRI Shapefile" test.shp orbits.shp
Co prawdopodobnie dzieli linie
Chcę teraz móc generować wielokąty we wnętrzu obu linii. Na przykład w przypadku, gdy jedna krawędź pokosu przecina linię danych, wielokąt wypełnia się, gdy pojawia się po drugiej stronie, na przykład:
Potrzebuję metody zautomatyzowanej, ponieważ muszę często powtarzać to zadanie. Najlepiej w pythonie, ponieważ tak wygenerowałem linie. Oto dwa pliki kształtów zawierające linie: wraparound ; naprawiono linię danych
Odpowiedzi:
Możesz zbudować niestandardową projekcję mercatora wyśrodkowaną w przybliżeniu na środku pokosu. Na przykład użyj dla pokosu 25:
W tej projekcji pokos nie jest łamany przez linię danych. Możesz utworzyć wielokąt z linii.
Następnie utwórz wycięty wielokąt między -179,95 ° E a 179,95 ° E w EPSG: 4326:
Odrzuć go również do własnego CRS i odejmij od wielokąta pokosu.
Po ponownym rzutowaniu z powrotem do EPSG: 4326 pokos jest poprawnie dzielony przez linię danych:
Kontynuuj z wszystkimi pokosami, które przecinają linię danych.
źródło
Przepisałbym proces generowania linii pokosu, aby rozpocząć i zakończyć w tej samej ciągłej przestrzeni podskórnej. tzn. jeśli linia zaczyna się przy 170 ° i kończy przy -170 °, przepisałbym proces, aby zakończyć przy 190 ° zamiast owijania przy -180,180
Następnie możesz tworzyć nieprzerwane wielokąty między liniami.
Następnie użyj procesu przycinania, aby podzielić wielokąty na linii 180, -180 i przesunąć dowolne części, które leżą poza przestrzenią -180,180, dodając lub odejmując odpowiednio 360 °.
Po prostu zrób to wszystko, zanim zapiszesz go z konkretną projekcją / punktem odniesienia
źródło
Dzięki @AndreJ za ten pomysł, użycie Django GEOS API tutaj jest prostym rozwiązaniem, które pozwala uniknąć konieczności ponownego wyświetlania czegokolwiek:
1) Utwórz MultiPolygon, który graniczy z linią danych:
2) Jeśli przecinająca się geometria przecina się, zwróć różnicę:
Wynik pokazano w następujący sposób:
źródło