Mejores prácticas para bases de datos y API con datos geográficos que abarcan el antimeridiano

24

¿Cuál es la mejor práctica para almacenar características geográficas (líneas, polígonos y sus equivalentes multiparte) cuando estas características abarcan el antimeridiano (± 180 ° de longitud) y deben enviarse y recibirse de las aplicaciones web del cliente como GeoJSON?


Estoy comenzando a trabajar en una API web del lado del servidor con soporte de una base de datos Postgres / PostGIS para trabajar con pistas de ciclones tropicales históricas y pronosticadas y radios de viento. Muchos ciclones en el Océano Pacífico tienen la desafortunada tendencia a cruzar el antimeridiano, a veces varias veces en su vida útil:

ingrese la descripción de la imagen aquí

Como neozelandés que vive cerca del antimeridiano, he encontrado este problema con la frecuencia suficiente en los datos regionales para tener algunas estrategias de afrontamiento, pero me gustaría descubrir qué se considera la mejor práctica. Lamentablemente, no hay preguntas existentes etiquetadas como , por lo que es difícil buscar preguntas relacionadas. Esas preguntas que he visto lidiar con este problema parecen estar buscando consejos muy específicos para cada aplicación. Esta pregunta discute brevemente el antimeridiano para el caso de un polígono GeoJSON que abarca la Tierra sin límite. Esta pregunta está bastante cerca de lo que estoy preguntando.

Necesito almacenar ciclones históricos y pronosticados en una base de datos espacial, pero anticipo que habrá problemas con el antimeridiano. Por ejemplo, una línea que comienza en la latitud / longitud (0,179)y termina en (0,-179)es ambigua con respecto a su dirección: si toma el camino corto a través del antimeridiano o "envuelve" todo el planeta. ¿Cómo debe almacenarse dicha ruta en una base de datos espacial (específicamente estoy trabajando con PostGIS pero espero que la solución sea lo suficientemente genérica)? Algunas ideas que tengo:

  1. No modifique las geometrías de las características y cambie la ambigüedad a las aplicaciones del cliente.
  2. Divida cualquier característica que cruce el antimeridiano en una geometría multiparte con un salto en el antimeridiano . ( La especificación GeoJSON admite CRS con nombre ).
  3. Trabaje con proyecciones no globales para diferentes cuencas ciclónicas o regiones oceánicas que no tienen esa discontinuidad.
  4. Explotando el hecho de que nunca se ha observado que un ciclón viaje alrededor del planeta entero, almacene las coordenadas de los ciclones comenzando en el rango de latitud (90,-90) compensado por una fase de 360 ​​° (manteniendo a los otros -180–180 °)
  5. Aprovechando el hecho de que un ciclón es extremadamente improbable al sur del extremo sur de África, use un descanso a 30 ° de longitud (como en el mapa anterior).
  6. Permita que las coordenadas se extiendan más allá del rango válido de EPSG 4326 , por ejemplo,> 180 ° y <-180 ° para cualquier característica que pase el antimeridiano.
  7. Codificación Delta , como en TopoJSON (por ejemplo, comenzar en (0,-179)y luego la siguiente coordenada es -3latitud oeste). No tengo idea de si implementar esto o cómo hacerlo al almacenar datos en PostGIS, pero esta es una gran solución para enviar datos a las aplicaciones del cliente.
  8. Alguna forma de notación vectorial o coordenadas polares. (Parece bastante difícil e inusual).

De estos, no me gustan las ideas 2–5 porque no son genéricas, pero me gustan porque tienen sentido para mi aplicación en particular. Para las aplicaciones que solo se ocupan de datos en el Océano Pacífico, pueden tener mucho sentido, por lo que no quiero descartarlas por completo como opciones.

Las ideas 6 y 7 fueron extraídas del blog de Tom MacWright , que vale la pena leer, pero no es concluyente con respecto al antimeridiano.

Idea 4 es utilizada por GeographicaGS 'GeodesicLinesToGISPython , que a su vez está utilizando fiona.transform.transform_geomun desplazamiento antimeridiano de 360 ​​°. A su vez, Fiona está usando OGR -wrapdateline. Supongo que es un precedente muy sólido y en realidad bastante genérico.

Junto con el tema del almacenamiento, necesito considerar cómo se deben enviar tales funciones a las aplicaciones del cliente, y cómo mi aplicación debe considerar los datos que se le envían (por ejemplo, un pronosticador humano que cambia la trayectoria del pronóstico de un ciclón en el Pacífico). El formato de intercambio probablemente será GeoJSON, pero no tiene que serlo.

Lamentablemente, la especificación GeoJSON no es explícita sobre los problemas antimeridianos. Esto de Wikipedia :

Muchas bibliotecas de software geográfico o formatos de datos proyectan el mundo en un rectángulo; muy a menudo este rectángulo se divide exactamente en el meridiano 180. Esto a menudo hace que sea imposible realizar tareas simples (como representar un área o una línea) sobre el meridiano 180. Algunos ejemplos:

  • La especificación GeoJSON no menciona el manejo del meridiano 180 en su especificación, como tal, las representaciones de líneas que cruzan el meridiano 180 también pueden interpretarse como dar la vuelta al mundo.

  • En OpenStreetMap, las áreas (como el límite de Rusia) se dividen en el meridiano 180.

Mi lectura es que GeoJSON no tiene una representación estándar particular de características que abarquen antimeridios, y se deja deliberadamente ambigua (las geometrías de múltiples partes tal vez resolverían el problema). De manera similar, en OpenStreetMap hay divisiones de geometría en el antimeridiano, aunque no sé si esas características divididas son multiparte o en realidad son registros discretos.

Esto parece bastante problemático, especialmente desde la perspectiva de hacer un cuadro delimitador u otras solicitudes espaciales que abarcan esta línea, pero también al analizar y desinfectar entradas y cualquier actualización de las geometrías de entidades. Es por eso que estoy tratando de determinar una mejor práctica con la que pueda intentar conformarme.

alphabetasoup
fuente
1
Esa es una muy buena pregunta, anteriormente he usado un sistema de coordenadas hecho a mano a partir de 90 grados, pero solo me preocupaba un área muy pequeña. Realmente no hay nada para 'envolver' adecuadamente; Supongo que es porque no hay una masa de tierra (de importancia) que se extiende entre 180 y muy pocas personas tienen que mapearlo, todo el problema recibe muy poca atención.
Michael Stimson
Gran pregunta Creo que estás tentando al destino con el punto 4, aunque en la práctica no hay ninguna razón por la cual las coordenadas no puedan extenderse más allá de 360, usando mod para recuperarlas. Delta parece la solución más extensible, e incluso podría tener algún beneficio en términos de compresión de datos, pero, como usted dice, transfiere la responsabilidad al cliente.
John Powell
Algunos de los comentarios sobre GeoJSON ahora están desactualizados desde el 1.0 RC. Un ejemplo es que las definiciones de CRS en GeoJSON están en desuso ( sgillies.net//2014/08/06/pruning-crs-from-geojson.html ). Editaré esto eventualmente.
alphabetasoup

Respuestas:

7

Hablando únicamente desde una perspectiva de análisis y almacenamiento de datos, el geographytipo de PostGIS fue diseñado con el antimeridiano en mente (entre varios objetivos de diseño). Hay varias funciones diseñadas específicamente para el geographytipo .

Por ejemplo, considere un LineString a través de Taveuni, Fiji ( mapeado con Great Circle Mapper ), que se extiende a horcajadas sobre el antimeridiano:

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

La longitud de esta geodésica es de unos 46 km. Del mismo modo, ST_Area funcionaría correctamente en un Polígono de la isla, incluso con coordenadas de longitud que salten entre +179 y -179.

Lanzar un EPSG: 4326 geometrya un geographytipo también normaliza las coordenadas, por ejemplo, la longitud de la última coordenada es> 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]]}

se convierte de nuevo al mismo geographytipo exacto en el primer ejemplo, pero ahora con salida GeoJSON. Puede optar por ignorar el AVISO (o por ejemplo SET client_min_messages TO WARNING;) y convertir todo tipo de geometrías de aspecto divertido como geographytipos.


Mostrar geographytipos en mapas fuera de PostGIS es una historia diferente, y espero que mejores respuestas toquen este aspecto.

Mike T
fuente
2
Una limitación es que una geografía no debe ser más larga / más ancha que 180º (ver preguntas frecuentes avanzadas ). Sin embargo, podría usar esta regla para los vértices y hacer algo tonto como este : LINESTRING(179.9 -17, 60 -16.9, -60 -16.8, -179.8 -16.7)que se envuelve.
Mike T
0

Seguramente, la respuesta preferida es (1), es decir, hacer que los clientes hagan lo "correcto". Un buen caso a considerar es el polígono que representa el continente de la Antártida aproximado por este archivo 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 codificación o el desplazamiento delta donde se produce el corte de longitud no ayudará con datos como este. Trabajarlo funcionará una proyección específica para la Antártida, pero esta no es una solución general.

Sorprendentemente, Google Earth Pro no muestra este polígono correctamente (a menos que use el modo "esquema"). Mira aquí captura de pantalla de Google Earth Pro

cffk
fuente
No sé mucho sobre Google Earth, por lo que no sé cómo habilitar el modo de esquema. Pero aquí tiene un polígono válido que abarca el antimeridiano y en su imagen vemos que Google Earth no puede representarlo correctamente: entonces, ¿cómo es esta evidencia de que pasar la ambigüedad a la aplicación del cliente es la mejor práctica si Google Earth no puede hacer frente? ¿eso? Por cierto, QGIS me da problemas de representación con este polígono en SRID 4326, pero no si introduzco una línea en el antimeridiano (excepto ... bueno, la línea). El original se muestra brillantemente si uso una proyección estereográfica antártica.
alphabetasoup
Lo suficientemente justo. Sin embargo, dado que las coordenadas kml están restringidas a la latitud y longitud, no hay nada que usted, el usuario, pueda hacer para ayudar a Google Earth en este ejemplo en particular. La responsabilidad recae en los mantenedores de Google Earth para solucionar este problema en el lado del cliente. (¡Desafortunadamente, muestran poca inclinación a hacerlo!)
cffk