Este es un seguimiento de la pregunta anterior . Verás que soy un nuevo usuario de PostGIS.
He analizado la validez de la topología en mis datos y encuentro alrededor de 1700 problemas de topología en el conjunto de datos de cobertura terrestre (polígono). Todos estos son "Ring Self_intersection".
Utilizando información útil en esta presentación de Paul Ramsay (página 20), he intentado almacenar mis datos en búfer en consecuencia:
ACTUALIZAR schema.data SET the_geom = buffer (the_geom, 0.0) WHERE isvalid (the_geom) = false and isvalid (buffer (the_geom, 0.0)) = true;
Pero recibo la respuesta:
AVISO: anillo de auto-intersección en o cerca del punto (editado) ERROR: la nueva fila para la relación "sgm_buffer" viola la restricción de verificación "enforce_geotype_the_geom"
********** Error **********
ERROR: nueva fila para la relación "sgm_buffer" viola la restricción de verificación "enforce_geotype_the_geom" Estado SQL: 23514
También he intentado solo:
ACTUALIZAR csgn.sgm_buffer SET the_geom = buffer (the_geom, 0.0)
y obten:
ERROR: la nueva fila para la relación "sgm_buffer" viola la restricción de verificación "enforce_geotype_the_geom"
********** Error **********
ERROR: nueva fila para la relación "sgm_buffer" viola la restricción de verificación "enforce_geotype_the_geom" Estado SQL: 23514
Entonces, ¿asumo que esta técnica de amortiguación no funcionará en mis problemas? ¿O estoy haciendo algo mal?
El Sr. Ramsay continúa en el mismo documento para sugerir una técnica adicional para tratar con polígonos de "figura de 8". No entiendo completamente cómo escribir esto por completo en código (o qué está haciendo y si me ayudará):
SELECCIONA ST_BuildArea (ST_Union ('LINESTRING EMPTY', ST_ExteriorRing ('POLYGON ((...))'
Entonces ... ¿alguien puede ayudar? Esto está resultando una verdadera pesadilla con mis escalas de tiempo apretadas y habilidades limitadas en PostGIS.
ST_Multi()
para forzar a todos los polígonos a serMULTIPOLYGON
s (esto es una suposición)Respuestas:
Creo que lo que está sucediendo es que sus polígonos que se intersectan entre sí se convierten en MULTIPOLÍGONOS cuando se almacenan en el búfer.
tienes dos opciones:
1 elimine la restricción "enforce_geotype_the_geom", puede hacerlo en pgAdmin
2 y coloque el resultado en una nueva tabla en lugar de actualizar la anterior. esa es a menudo una buena forma de hacer las cosas porque entonces no cambias nada en tu tabla original. la consulta puede parecerse a algo como:
por supuesto, es posible que desee traer más campos a su nueva tabla.
prueba el truco del búfer primero. En el segundo enfoque, Paul puede decirse a sí mismo qué efecto tiene la cadena lineal vacía. No recuerdo cómo ocurre esa magia.
fuente
Tuve los mismos problemas hace unos meses. Tenía polígonos en mi base de datos con muchas auto intersecciones. Utilicé el método de Niklas Aven, pero no funcionó. También usé otros métodos.
Mi método es eliminar la auto intersección de mis polígonos. Aquí está la consulta SQL que utilicé:
Calculé el área del polígono y la auto-intersección y solo mantendré los polígonos que tienen un área> 1.
1
es la tolerancia porque el área de la auto-intersección es muy pequeña. También tenga en cuenta que la transformación del SRID a metros es importante si tiene datos en grados.fuente