28 votos

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

¿Cuál es la mejor práctica para almacenar rasgos geográficos (líneas, polígonos y sus equivalentes multiparte) cuando estos rasgos abarcan el antimeridiano (±180° de longitud), y necesitan ser enviados y recibidos por aplicaciones web cliente como GeoJSON?


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

enter image description here

Como neozelandés que vive cerca del antimeridiano, me he encontrado con este problema lo suficientemente a menudo en los datos regionales como para tener algunas estrategias de afrontamiento, pero me gustaría averiguar realmente qué se considera la mejor práctica. Desgraciadamente, no existen preguntas etiquetadas antimeridiano Por lo tanto, es difícil buscar preguntas relacionadas. Las preguntas que he visto luchando contra este problema parecen buscar consejos muy específicos para la aplicación. Esta pregunta discute brevemente el antimeridiano para el caso de un polígono GeoJSON que abarca toda la tierra y no tiene límites. Esta pregunta se acerca bastante a lo que estoy pidiendo.

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

  1. No hacer ningún cambio a las geometrías de las características y trasladar la ambigüedad a las aplicaciones de los clientes.
  2. Dividir cualquier rasgo que cruce el antimeridiano en un geometría multiparte con ruptura en el antimeridiano . ( La especificación GeoJSON admite CRSs con nombre .)
  3. Trabajar con proyecciones no globales para diferentes cuencas ciclónicas o regiones oceánicas que no tienen esa discontinuidad
  4. Aprovechando el hecho de que nunca se ha observado que un ciclón dé la vuelta a todo el planeta, almacenar las coordenadas de los ciclones a partir de la latitud (90,-90) compensado por una fase de 360°. (manteniendo los otros -180-180°)
  5. Aprovechando el hecho de que un ciclón es extremadamente improbable al sur del extremo sur de África, utilice un ruptura a 30° de longitud (como en el mapa anterior).
  6. Permitir coordenadas que se extienden más allá del rango válido de la EPSG 4326 Por ejemplo, > 180° y < -180° para cualquier característica que pase el antimeridiano.
  7. Codificación delta como en TopoJSON (por ejemplo, empezar en (0,-179) y la siguiente coordenada es -3 latitud oeste). No tengo ni idea de si se puede implementar esto cuando se almacenan los datos en PostGIS, pero es una gran solución para enviar datos a las aplicaciones de los clientes.
  8. Alguna forma de notación vectorial o coordenadas polares. (Parece bastante difícil e inusual).

De éstas, no me gustan las ideas 2-5 porque no son genéricas, pero sí me gustan porque tienen algún sentido para mi aplicación particular. Para aplicaciones que sólo tratan con datos en el Océano Pacífico, podrían tener mucho sentido, así que no quiero descartarlas completamente como opciones.

Las ideas 6 y 7 fueron tomadas de Blog de Tom MacWright que vale la pena leer, pero no es concluyente con respecto al antimeridiano.

La idea 4 es utilizada por GeographicaGS' GeodesicLinesToGISPython que a su vez utiliza fiona.transform.transform_geom con un desplazamiento antimeridiano de 360°. A su vez, Fiona está utilizando el sistema OGR -wrapdateline . Supongo que es un precedente muy sólido y en realidad bastante genérico.

Junto con la cuestión del almacenamiento, tengo que considerar cómo deben enviarse esas características a las aplicaciones de los clientes, y cómo debe considerar mi aplicación los datos que se le envían (por ejemplo, un pronosticador humano que cambia la trayectoria prevista de un ciclón en el Pacífico). El formato de intercambio será probablemente GeoJSON, pero no tiene por qué serlo.

Lamentablemente, la especificación GeoJSON no es explícita en lo que respecta a las cuestiones antimeridianas. 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 hace que a menudo sea imposible realizar tareas sencillas (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, por lo que las representaciones de las líneas que cruzan el meridiano 180 pueden ser interpretadas como si dieran la vuelta al mundo.

  • En OpenStreetMap, las zonas (como la frontera de Rusia) se dividen en el meridiano 180.

Mi lectura es que GeoJSON no tiene una representación estándar particular de los rasgos que abarcan el antimeridiano, y se deja deliberadamente ambigua (las geometrías de varias partes tal vez resolverían la cuestión). Del mismo modo, en OpenStreetMap hay divisiones geométricas en el antimeridiano, aunque no sé si esas características divididas son multipartes o son realmente registros discretos.

Esto se siente bastante problemático, especialmente desde la perspectiva de hacer cajas delimitadoras u otras solicitudes espaciales que abarcan esta línea, pero también en el análisis y la limpieza de la entrada y cualquier actualización de las geometrías de las características. Por eso estoy tratando de determinar una mejor práctica a la que pueda intentar ajustarme.

9voto

hernan43 Puntos 566

Desde el punto de vista del almacenamiento y el análisis de datos, la geography tipo para PostGIS se diseñó pensando en el antimeridiano (entre varios objetivos de diseño). Hay varias funciones diseñadas específicamente para el geography tipo .

Por ejemplo, considere una LineString a través de Taveuni, Fiyi ( mapeado con Great Circle Mapper ), que está a caballo entre el antimeridiano:

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

La duración de este geodésico está a unos 46 km. Del mismo modo, ST_Area funcionaría correctamente en un polígono de la isla, incluso con coordenadas de longitud que saltan entre +179 y -179.

Fundición de un EPSG:4326 geometry a un geography 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 en el mismo geography del primer ejemplo, pero ahora con salida GeoJSON. Puede elegir ignorar el AVISO (o por ejemplo SET client_min_messages TO WARNING; ), y convertir todo tipo de geometrías divertidas como geography tipos.


Mostrando geography Los tipos en los mapas fuera de PostGIS es una historia diferente, y esperemos que las respuestas mejores toquen este aspecto.

0voto

GSree Puntos 161

Seguramente, la respuesta preferida es (1), es decir, 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 delta o el desplazamiento donde se produce la ruptura de la longitud no ayudará con datos como estos. Trabajar una proyección específica para la Antártida funcionará, pero no es una solución general.

Sorprendentemente, Google Earth Pro no muestra este polígono correctamente (a no ser que utilices el modo "outline"). Ver aquí screen shot from Google Earth Pro

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X