Best practice per database e API con dati geografici che coprono l'antimeridiano


24

Qual è la best practice per la memorizzazione di funzioni geografiche (linee, poligoni e loro equivalenti multipart) quando queste funzionalità si estendono sull'antimeridiano (± 180 ° di longitudine) e devono essere inviate e ricevute dalle applicazioni Web client come GeoJSON?


Sto iniziando a lavorare su un'API Web lato server con il supporto di un database Postgres / PostGIS per lavorare con piste ciclabili tropicali e previsioni e raggi del vento tropicali. Molti cicloni nell'Oceano Pacifico hanno la sfortunata tendenza ad attraversare l'antimeridiano, a volte più volte nella loro vita:

inserisci qui la descrizione dell'immagine

Come neozelandese che vive vicino all'antimeridiano, ho riscontrato questo problema abbastanza spesso nei dati regionali per avere alcune strategie di coping, ma vorrei davvero scoprire quale sia considerata la migliore pratica. Sfortunatamente non ci sono domande taggate , quindi è difficile cercare domande correlate. Quelle domande che ho visto lottare contro questo problema sembrano tutte cercare consigli molto specifici per l'applicazione. Questa domanda discute brevemente l'antimeridiano per il caso di un poligono GeoJSON che si estende sulla terra senza confini. Questa domanda è abbastanza vicina a quello che sto chiedendo.

Devo memorizzare i cicloni storici e di previsione in un database spaziale, ma prevedo che ci saranno problemi con l'antimeridiano. Ad esempio, una linea che inizia a latitudine / longitudine (0,179)e termina a (0,-179)è ambigua rispetto alla sua direzione: se prende il breve sentiero attraverso l'antimeridiano o "avvolge" l'intero pianeta. Come dovrebbe essere memorizzato un tale percorso in un database spaziale (in particolare sto lavorando con PostGIS ma spero che la soluzione sia abbastanza generica)? Alcune idee che ho:

  1. Non apportare modifiche alle geometrie delle caratteristiche e sposta l'ambiguità sulle applicazioni client.
  2. Dividi qualsiasi caratteristica che attraversa l'antimeridiano in una geometria multipart con una rottura nell'antimeridiano . ( La specifica GeoJSON supporta CRS denominati .)
  3. Lavora con proiezioni non globali per diversi bacini di cicloni o regioni oceaniche che non hanno una tale discontinuità
  4. Sfruttando il fatto che non è mai stato osservato che un ciclone viaggi in tutto il pianeta, memorizza le coordinate dei cicloni che iniziano nella gamma di latitudine (90,-90) sfalsate di una fase di 360 ° (mantenendo gli altri -180-180 °)
  5. Sfruttando il fatto che un ciclone è estremamente improbabile a sud della punta meridionale dell'Africa, usa una pausa a 30 ° di longitudine (come nella mappa sopra).
  6. Consentire alle coordinate di estendersi oltre l'intervallo valido di EPSG 4326 , ad es.> 180 ° e <-180 ° per tutte le funzioni che superano l'antimeridiano.
  7. Codifica delta , come in TopoJSON (ad es. Iniziare da (0,-179)e quindi la coordinata successiva è -3latitudine ovest). Non ho idea se o come implementarlo durante la memorizzazione dei dati in PostGIS, ma questa è un'ottima soluzione per l'invio di dati alle applicazioni client.
  8. Qualche forma di notazione vettoriale o coordinate polari. (Sembra piuttosto difficile e insolito.)

Di questi, non mi piacciono le idee 2–5 perché non sono generiche, ma mi piacciono perché hanno un senso per la mia particolare applicazione. Per le applicazioni che si occupano solo di dati nell'Oceano Pacifico, potrebbero avere molto senso, quindi non voglio scartarli completamente come opzioni.

Le idee 6 e 7 sono state sollevate dal blog di Tom MacWright , che vale la pena leggere ma non è conclusivo rispetto all'antimeridiano.

Idea 4 è utilizzato da GeographicaGS 'GeodesicLinesToGISPython , che a sua volta utilizza fiona.transform.transform_geomun offset antimeridico a 360 °. A sua volta, Fiona sta usando OGR -wrapdateline. Suppongo che sia un precedente molto solido e in realtà piuttosto generico.

In concomitanza con il problema dell'archiviazione, devo considerare come inviare tali funzionalità alle applicazioni client e in che modo la mia applicazione dovrebbe prendere in considerazione i dati inviati ad esso (ad esempio un meteorologo umano che modifica la traccia di previsione di un ciclone nel Pacifico). Il formato di interscambio sarà probabilmente GeoJSON, ma non è necessario.

Sfortunatamente la specifica GeoJSON non è esplicita sui problemi degli antimeridiani. Questo da Wikipedia :

Molte librerie di software geografici o formati di dati proiettano il mondo su un rettangolo; molto spesso questo rettangolo viene diviso esattamente al 180 ° meridiano. Ciò rende spesso impossibile svolgere semplici compiti (come rappresentare un'area o una linea) oltre il 180 ° meridiano. Qualche esempio:

  • La specifica GeoJSON non menziona la gestione del 180 ° meridiano nella sua specifica, in quanto tale, le rappresentazioni di linee che attraversano il 180 ° meridiano possono essere interpretate come girando il mondo.

  • In OpenStreetMap, aree (come il confine con la Russia) sono divise al 180 ° meridiano.

La mia lettura è che GeoJSON non ha una particolare rappresentazione standard delle funzionalità di antimeridian-spanning ed è volutamente lasciato ambiguo (le geometrie multi-parte risolverebbero forse il problema). Allo stesso modo in OpenStreetMap ci sono divisioni geometriche nell'antimeridiano, anche se non so se tali funzioni divise siano multipart o in realtà record discreti.

Ciò sembra piuttosto problematico, soprattutto dal punto di vista del bounding box o di altre richieste spaziali che si estendono su questa linea, ma anche nell'analisi e nella sanificazione dell'input e di eventuali aggiornamenti delle geometrie delle caratteristiche. Questo è il motivo per cui sto cercando di determinare una best practice a cui posso cercare di conformarmi.


1
Questa è davvero una bella domanda, in precedenza ho usato un sistema di coordinate fatto a mano a partire da 90 gradi, ma mi occupavo solo di un'area molto piccola. Non c'è davvero nulla da "avvolgere" correttamente; Immagino sia perché non ci sono terre emerse (di importanza) a cavallo di 180 e pochissime persone devono mappare su di esso l'intero problema riceve poca attenzione.
Michael Stimson,

Ottima domanda Penso che stai tentando il destino con il punto 4, anche se in pratica non c'è motivo per cui le coordinate non possano estendersi oltre il 360, usando mod per recuperarle. Delta sembra la soluzione più estensibile e potrebbe anche avere qualche vantaggio in termini di compressione dei dati, ma, come dici tu, sposta la responsabilità verso il cliente.
John Powell,

Alcuni dei commenti su GeoJSON non sono più aggiornati dall'RC 1.0. Un esempio è che le definizioni di CRS in GeoJSON sono obsolete ( sgillies.net//2014/08/06/pruning-crs-from-geojson.html ). Lo modificherò alla fine.
alphabetasoup,

Risposte:


7

Parlando esclusivamente dal punto di vista dell'archiviazione e dell'analisi dei dati, il geographytipo di PostGIS è stato progettato pensando all'antimeridiano (tra diversi obiettivi di progettazione). Esistono diverse funzioni appositamente progettate per il geographytipo .

Ad esempio, considera un LineString attraverso Taveuni, Figi ( mappato con Great Circle Mapper ), che si trova a cavallo dell'antimeridiano:

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

La lunghezza di questo geodetico è di circa 46 km. Allo stesso modo, ST_Area funzionerebbe correttamente su un poligono dell'isola, anche con coordinate di longitudine che saltano tra +179 e -179.

Il cast di un EPSG: 4326 geometryin un geographytipo normalizza anche le coordinate, ad esempio la longitudine dell'ultima coordinata è> 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]]}

viene riconvertito nello stesso geographytipo esatto nel primo esempio, ma ora con output GeoJSON. Puoi scegliere di ignorare AVVISO (o ad esempio SET client_min_messages TO WARNING;) e convertire tutti i tipi di geometrie dall'aspetto divertente come geographytipi.


Mostrare geographytipi su mappe esterne a PostGIS è una storia diversa, e si spera che risposte migliori tocchino questo aspetto.


2
Una limitazione è che una geografia non dovrebbe essere più / più ampia di 180º (vedi FAQ avanzate ). Tuttavia, potresti semplicemente usare questa regola per i vertici e fare qualcosa di stupido come questo : LINESTRING(179.9 -17, 60 -16.9, -60 -16.8, -179.8 -16.7)che tipo di avvolgimento.
Mike T,

0

Sicuramente, la risposta preferita è (1), ovvero i clienti fanno la "cosa giusta". Un buon caso da considerare è il poligono che rappresenta il continente dell'Antartide approssimato da questo file 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>

La codifica o lo spostamento delta nel punto in cui si verifica l'interruzione della longitudine non aiuta con dati come questo. Funzionarlo una proiezione specifica dell'Antartide funzionerà, ma questa non è certo una soluzione generale.

Sorprendentemente, Google Earth Pro non visualizza correttamente questo poligono (a meno che tu non utilizzi la modalità "struttura"). Vedere qui schermata da Google Earth Pro


Non so molto su Google Earth, quindi non so come abilitare la modalità struttura. Ma qui hai un poligono valido che abbraccia l'antimeridiano e nella tua immagine vediamo che Google Earth non riesce a renderlo correttamente: quindi come è questa prova che passare l'ambiguità all'applicazione client è la migliore pratica se Google Earth non riesce a far fronte vero? Per inciso, QGIS mi dà problemi di rendering con questo poligono in SRID 4326, ma non se introduco una linea nell'antimeridiano (tranne ... beh, la linea). L'originale viene visualizzato in modo brillante se utilizzo una proiezione stereografica antartica.
alphabetasoup,

Giusto. Tuttavia, dato che le coordinate kml sono limitate a latitudine e longitudine, non c'è niente che tu, l'utente, puoi fare per aiutare Google Earth in questo esempio particolare. Spetta ai manutentori di Google Earth risolvere questo problema sul lato client. (Sfortunatamente, mostrano poca propensione a farlo!)
cffk,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.