Auto-intersecciones de anillo en PostGIS

10

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.

ESRIHelp
fuente
1
¿Qué devuelve "select geometry_type (the_geom) from sgm_buffer limit 1"? Además, en relación con el tiempo de ejecución de 40 horas mencionado en la otra pregunta, ¿hay índices espaciales definidos en su tabla?
diciu
Es posible que necesite a ST_Multi()para forzar a todos los polígonos a ser MULTIPOLYGONs (esto es una suposición)
Mike T
Gracias por los comentarios. Diciu Creo que hay índices, parecen ser visibles en pgAdminIII, pero ¿quizás necesito actualizarlos? Podría encontrar soluciones para acelerar la consulta. No sé cuál sería un tiempo razonable para que se ejecute. Landcover tiene aproximadamente 20 millones de características.
ESRIHelp

Respuestas:

12

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:

CREATE TABLE new_buffered_table as
SELECT ST_Buffer(the_geom,0.0) as the_geom, gid FROM original_table;

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.

Nicklas Avén
fuente
0

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é:

     -- Create the new polygons 

SELECT ST_GeomFromText(polygone) as geom

   from (

    SELECT st_astext(ST_MakePolygon(linear)) as polygone

        from (
              SELECT st_astext
                ((ST_dump
                   (st_boundary
                      (ST_MakeValid
                     (ST_Transform
                        (ST_SETSRID
                           (geometry,4326),32631))))).geom) 
                          as linear from tables_name)
        as query2)

  as query1

where ST_area(polygone) > 1

Calculé el área del polígono y la auto-intersección y solo mantendré los polígonos que tienen un área> 1. 1es 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.

Abdillahi Abdi Mohamed
fuente