10 votos

Ayuda con la geometría de polígonos de PostGIS - anillos no cerrados

He conseguido una copia del súper estupendo libro 'Python Geospatial Development' de Erik Westra (enlace de Amazon), y estoy trabajando en él. Actualmente, me está enseñando a cargar datos costeros de GSHHS desde un shapefile a una base de datos PostGIS, en preparación para construir una aplicación web geoespacial.

Mi problema es el siguiente: cuando intento importar los datos de GSHHS a PostGIS, son rechazados debido a que los polígonos costeros no son considerados 'válidos'. Específicamente, recibo un mensaje de error que describe algunos (pero no todos) de los polígonos costeros como 'anillos no cerrados'.

Entiendo que este error está tratando de decirme que los primeros y últimos puntos del polígono no son los mismos. Sin embargo, esto simplemente no es verdad. He examinado la representación WKT de muchos de los polígonos, y son correctos. Definitivamente comienzan y terminan con las mismas coordenadas.

Los polígonos se extraen de los shapefiles utilizando la biblioteca OGR, y exportando cada característica del polígono a WKT. He intentado reconstituir el polígono a través de Shapely, y he experimentado con WKB, pero sin éxito. He logrado cargar los mismos datos en PostGIS como una tabla MULTIPOLYGON, utilizando el cargador shp2pgsql.

Me preguntaba si alguien allí había:
(a) quizás utilizado el mismo libro, se atascó en el mismo problema, y tiene la respuesta para mí?
(b) ha encontrado un problema similar, y ha encontrado una solución?
(c) de no ser así, ¿tiene algún consejo de 'mejores prácticas' para garantizar geometría válida antes de cargarla en PostGIS?

ACTUALIZACIÓN: un colega ha sugerido que el problema de 'anillos no cerrados' puede ser simplemente un síntoma de otro problema. Es posible que mi configuración de PostGIS/PostgreSQL tenga límites de tamaño (en transacciones de inserción, paquetes recibidos, cadenas de texto, etc).

Dado que estoy utilizando polígonos WKT muy largos como entrada, es posible que PostGIS los esté cortando demasiado pronto para permitir que cada polígono se complete. Lo probaré mañana, pero suena probable. Mi inserción de fronteras de países solo aceptaba algunos registros y no otros. Por lo que recuerdo, las geometrías aceptadas eran para pequeñas naciones isleñas como Antigua (y probablemente tenían representaciones WKT cortas).

Entonces, esto podría terminar siendo más un hilo de administración de base de datos de PostGIS, en lugar de un hilo de geometría inválida.

0 votos

¿Puede proporcionar un archivo shp de ejemplo?

0 votos

No hay problema. Los datos de líneas de costa de GSHHS que estoy utilizando son una descarga de 96mb de aquí. Los datos de límites mundiales que estoy utilizando son el Conjunto de datos de Límites Mundiales de thematicmapping.org

6voto

UberAlex Puntos 1854

He revisado tus datos y el ejemplo del libro, el problema es que hay tres polígonos inválidos en los datos que se procesan en el libro:

GSHHS_l_L1.shp

ID = 92-W

POLYGON ((-180.0 71.514793999999995,-179.69008299999999 71.577888999999999,-178.648889 71.577416999999997,-178.40644399999999 71.549916999999994,-177.406306 71.244167000000004,-177.877444 71.022889000000006,-179.500111 70.863749999999996,-179.93011100000001 70.979583000000005,-180.0 70.962072000000006))

ID = 486-W

POLYGON ((-180.0 -16.799126,-179.84419399999999 -16.691278,-179.80041700000001 -16.789193999999998,-179.850472 -16.878361000000002,-180.0 -16.959561))

GSHHS_l_L2.shp

ID = 7333-W

POLYGON ((-180.0 65.393473,-179.76583299999999 65.428332999999995,-179.95416700000001 65.385555999999994,-179.90972199999999 65.316389,-180.0 65.321635))

Ya que esto es un ejemplo, sería más fácil eliminar esos polígonos del conjunto de datos o simplemente agregar un if statement en tu código

if geometry.IsValid():
       cursor.execute("INSERT INTO gshhs (level, geom) VALUES (%s, ST_GeomFromText(%s, 4326))", (level, wkt))

0 votos

Gracias Mario, parece que me estaba adelantando demasiado, en lugar de validar adecuadamente TODOS mis polígonos de entrada. Tu respuesta fue correcta - estos polígonos aparecieron como inválidos al ser probados con OGR. Curiosamente, se veían bien en QGis, pero ArcMap los mostraba como sin un anillo completo. Estos tres polígonos caían en la línea de fecha, y supongo que la geometría del shapefile no contaba el borde del polígono a lo largo de la línea de fecha. Tu solución es una forma agradable y fácil de detectar polígonos inválidos. Marcaré el mensaje como respondido.

0 votos

Si te sientes caritativo, ¿tienes alguna buena solución para el próximo paso en el proceso, que es corregir los polígonos inválidos? Intenté usar la función .CloseRing() de OGR, pero sin éxito. Simplemente ignoró la llamada a la función, creo.

0 votos

Intenté usar el "truco del buffer" (workshops.opengeo.org/postgis-intro/validity.html) con shapely y ogr pero sin éxito. Shapely no lee polígonos inválidos y ogr no realiza la operación de buffer, actualmente no sé por qué. Si descubro la respuesta, te lo haré saber. Quizás alguien más tenga más éxito con este problema. Lo siento.

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