Najlepsze praktyki dotyczące baz danych i interfejsów API z danymi geograficznymi obejmującymi antimeridian


24

Jaka jest najlepsza praktyka do przechowywania obiektów geograficznych (linii, wielokątów i ich wieloczęściowych odpowiedników), gdy obejmują one antimeridian (długość geograficzna ± 180 °) i muszą być wysyłane do aplikacji klienckich i otrzymywane z nich jako GeoJSON?


Zaczynam pracę od interfejsu API po stronie serwera z obsługą bazy danych Postgres / PostGIS do pracy z historycznymi i prognozowanymi ścieżkami cyklonów tropikalnych i promieniami wiatru. Wiele cyklonów na Oceanie Spokojnym ma niefortunną tendencję do przekraczania antymerydyny, czasami wielokrotnie w ciągu ich życia:

wprowadź opis zdjęcia tutaj

Jako Nowozelandczyk żyjący w pobliżu antymerydyjczyków często napotykałem ten problem w danych regionalnych, aby opracować pewne strategie radzenia sobie, ale chciałbym dowiedzieć się, co jest uważane za najlepszą praktykę. Niestety nie ma istniejących pytań oznaczonych jako , więc trudno jest znaleźć podobne pytania. Wszystkie te pytania, które widziałem, borykając się z tym problemem, wydają się szukać porady specyficznej dla aplikacji. To pytanie krótko omawia antimeridian w przypadku obejmującego całą ziemię wielokąta GeoJSON bez granic. To pytanie jest bardzo zbliżone do tego, o co pytam.

Muszę przechowywać historyczne i prognozowane cyklony w przestrzennej bazie danych, ale przewiduję, że wystąpią problemy z antymerydianem. Na przykład linia rozpoczynająca się na szerokości / długości geograficznej (0,179)i kończąca się na (0,-179)jest niejednoznaczna w odniesieniu do swojego kierunku: czy kroczy krótką ścieżką przez antymerydyzm, czy „owija się” wokół całej planety. Jak taka ścieżka powinna być przechowywana w przestrzennej bazie danych (konkretnie pracuję z PostGIS, ale mam nadzieję, że rozwiązanie jest wystarczająco ogólne)? Niektóre pomysły, które mam:

  1. Nie zmieniaj geometrii elementów i niejednoznaczność przenieś do aplikacji klienckich.
  2. Podziel dowolną cechę przecinającą antimeridian na wieloczęściową geometrię z przerwą na antimeridian . ( Specyfikacja GeoJSON obsługuje nazwane CRS .)
  3. Pracuj z nieglobalnymi projekcjami dla różnych basenów cyklonowych lub regionów oceanicznych, które nie mają takiej nieciągłości
  4. Wykorzystując fakt, że cyklon nigdy nie zaobserwował podróżowania po całej planecie, przechowuj współrzędne cyklonów rozpoczynające się w zakresie szerokości geograficznej (90,-90) przesuniętym o fazę 360 ° (utrzymując pozostałe -180–180 °)
  5. Wykorzystując fakt, że cyklon jest bardzo mało prawdopodobny na południe od południowego krańca Afryki, skorzystaj z przerwy na 30 ° długości geograficznej (jak na powyższej mapie).
  6. Pozwól współrzędnym wykraczać poza prawidłowy zakres EPSG 4326 , np.> 180 ° i <-180 ° dla wszystkich elementów przechodzących przez antimeridian.
  7. Kodowanie Delta , jak w TopoJSON (np. Początek o, (0,-179)a następnie następna współrzędna to -3szerokość geograficzna zachodnia). Nie mam pojęcia, czy i jak to zaimplementować podczas przechowywania danych w PostGIS, ale jest to świetne rozwiązanie do wysyłania danych do aplikacji klienckich.
  8. Jakaś forma notacji wektorowej lub współrzędnych biegunowych. (Wydaje się raczej trudne i niezwykłe.)

Spośród nich nie lubię pomysłów 2–5, ponieważ nie są one ogólne, ale lubię je, ponieważ mają sens dla mojej konkretnej aplikacji. W przypadku aplikacji zajmujących się tylko danymi na Oceanie Spokojnym mogą one mieć sens, więc nie chcę ich całkowicie pomijać jako opcji.

Pomysły 6 i 7 zostały zaczerpnięte z bloga Toma MacWrighta , który jest wart przeczytania, ale nie jest rozstrzygający w odniesieniu do antimeridian.

Idea 4 jest używana przez GeographicaGSGeodesicLinesToGISPython , która z kolei stosuje fiona.transform.transform_geomz przesunięciem antimeridian 360 °. Z kolei Fiona używa OGR -wrapdateline. Przypuszczam, że to bardzo solidny precedens i właściwie raczej ogólny.

W związku z kwestią przechowywania muszę rozważyć, w jaki sposób takie funkcje powinny być wysyłane do aplikacji klienckich oraz w jaki sposób moja aplikacja powinna rozpatrywać dane przesłane z powrotem do niej (np. Ludzki prezenter zmieniający prognozowaną ścieżkę cyklonu na Pacyfiku). Format wymiany prawdopodobnie będzie GeoJSON, ale nie musi tak być.

Niestety specyfikacja GeoJSON nie zawiera wyraźnych informacji na temat zagadnień antymerydyńskich. To z Wikipedii :

Wiele bibliotek oprogramowania geograficznego lub formatów danych rzutuje świat na prostokąt; bardzo często ten prostokąt jest dzielony dokładnie na 180. południku. To często uniemożliwia wykonywanie prostych zadań (takich jak reprezentowanie obszaru lub linii) na 180. południku. Kilka przykładów:

  • Specyfikacja GeoJSON nie wspomina o obsłudze 180. południka w swojej specyfikacji, dlatego reprezentacje linii przecinających 180. południk można równie dobrze zinterpretować jako przebiegające dookoła świata.

  • W OpenStreetMap obszary (takie jak granica Rosji) są podzielone na południku 180.

Moje czytanie jest takie, że GeoJSON nie ma szczególnego standardowego przedstawienia cech obejmujących antymerydyny i jest celowo pozostawiony niejednoznaczny (geometria wieloczęściowa rozwiązałaby prawdopodobnie problem). Podobnie w OpenStreetMap istnieją podziały geometryczne na antimeridian, chociaż nie wiem, czy takie podzielone cechy są wieloczęściowe, czy w rzeczywistości dyskretne.

Jest to dość problematyczne, szczególnie z punktu widzenia tworzenia obwiedni lub innych żądań przestrzennych obejmujących tę linię, ale także podczas analizowania i odkażania danych wejściowych oraz wszelkich aktualizacji geometrii elementów. Właśnie dlatego staram się ustalić najlepszą praktykę, do której mogę dążyć.


1
To naprawdę dobre pytanie, wcześniej korzystałem z ręcznie wykonywanego układu współrzędnych zaczynającego się od 90 stopni, ale zajmowałem się tylko bardzo małym obszarem. Naprawdę nie ma niczego, co można by właściwie „zawinąć”; Domyślam się, że to dlatego, że nie ma masy (ważnej) leżącej ponad 180 i bardzo niewiele osób musi ją mapować, cały problem jest bardzo mało uwagi.
Michael Stimson

Świetne pytanie. Myślę, że kusisz los z punktu 4, chociaż w praktyce nie ma powodu, dla którego współrzędne nie mogłyby wykraczać poza 360, używając modów do ich odzyskania. Delta wydaje się najbardziej rozszerzalnym rozwiązaniem i może nawet przynieść pewne korzyści w zakresie kompresji danych, ale, jak mówisz, przenosi odpowiedzialność na klienta.
John Powell,

Niektóre komentarze dotyczące GeoJSON są teraz nieaktualne od wersji 1.0 RC. Jednym z przykładów jest to, że definicje CRS w GeoJSON są przestarzałe ( sgillies.net//2014/08/06/pruning-crs-from-geojson.html ). W końcu to zmienię.
alphabetasoup

Odpowiedzi:


7

Mówiąc wyłącznie z perspektywy przechowywania danych i analizy, geographytyp PostGIS został zaprojektowany z myślą o antymerydynie (wśród kilku celów projektowych). Istnieje kilka funkcji zaprojektowanych specjalnie dla tego geographytypu .

Rozważmy na przykład LineString w Taveuni na Fidżi ( mapowany za pomocą Great Circle Mapper ), który otacza antimeridian:

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

Długość tej geodezyjnej wynosi około 46 km. Podobnie ST_Area działałby poprawnie na wielokącie wyspy, nawet przy współrzędnych długości skaczących między +179 a -179.

Rzutowanie EPSG: 4326 geometryna geographytyp również normalizuje współrzędne, na przykład długość geograficzna ostatniej współrzędnej wynosi> 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]]}

jest konwertowany z powrotem do dokładnie tego samego geographytypu w pierwszym przykładzie, ale teraz z wyjściem GeoJSON. Możesz zignorować OGŁOSZENIE (lub np. SET client_min_messages TO WARNING;) I przekonwertować wszelkiego rodzaju śmiesznie wyglądające geometrie na geographytypy.


Wyświetlanie geographytypów na mapach poza PostGIS to inna historia i mam nadzieję, że lepsze odpowiedzi dotkną tego aspektu.


2
Jednym z ograniczeń jest to, że geografia nie powinna być dłuższa / szersza niż 180º (patrz zaawansowane FAQ ). Jednak możesz po prostu użyć tej reguły dla wierzchołków i zrobić coś głupiego jak to : LINESTRING(179.9 -17, 60 -16.9, -60 -16.8, -179.8 -16.7)które to zawija.
Mike T

0

Z pewnością preferowaną odpowiedzią jest (1), tzn. Niech klienci wykonają „właściwą rzecz”. Dobrym przykładem jest wielobok reprezentujący kontynent Antarktydy przybliżony tym plikiem 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>

Kodowanie Delta lub przesuwanie tam, gdzie występuje przerwa długości geograficznej, nie pomoże w przypadku takich danych. Działa przy tym projekcja specyficzna dla Antarktydy, ale nie jest to ogólne rozwiązanie.

O dziwo, Google Earth Pro nie wyświetla poprawnie tego wielokąta (chyba że używasz trybu „konspektu”). Spójrz tutaj zrzut ekranu z Google Earth Pro


Nie wiem dużo o Google Earth, więc nie wiem, jak włączyć tryb konspektu. Ale tutaj masz prawidłowy wielokąt obejmujący antymerydynę i na twoim zdjęciu widzimy, że Google Earth nie renderuje go poprawnie: więc w jaki sposób jest to dowód, że przekazywanie dwuznaczności do aplikacji klienckiej jest najlepszą praktyką, jeśli Google Earth nie może sobie z tym poradzić to? Nawiasem mówiąc, QGIS daje mi problemy z renderowaniem tego wielokąta w SRID 4326, ale nie, jeśli wprowadzę linię na antimeridian (oprócz ... no cóż, linii). Oryginał renderuje się doskonale, jeśli użyję antarktycznej projekcji stereograficznej.
alphabetasoup

Słusznie. Biorąc jednak pod uwagę, że współrzędne kml są ograniczone do szerokości i długości geograficznej, użytkownik nic nie może zrobić, aby pomóc Google Earth w tym konkretnym przykładzie. Obowiązkiem opiekunów Google Earth jest naprawienie tego problemu po stronie klienta. (Niestety wykazują małą skłonność do tego!)
cffk
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.