¿Dividir la superposición entre polígonos y asignarlos al polígono más cercano usando PostGIS?

8

Mi pregunta está bastante relacionada con la superposición dividida sin respuesta entre polígonos en conjuntos disjuntos, excepto que no estoy usando shapely, estoy usando PostGIS 2.4 en PostgreSQL 10.

Tengo una tabla que contiene multipolígonos para unidades administrativas. Las geometrías solo cubren el área del terreno. Mi objetivo es extenderlos una distancia dada en el agua.

Para extender los polígonos actuales al agua, hago un búfer seguido de restar todas las demás geometrías en la tabla. Esto recorta el búfer donde la geometría tiene vecinos y retiene el búfer donde la capa actualmente no tiene nada. Entonces, algo como:

SELECT c1.name
     , ST_Difference( ST_Buffer( ST_Union(c1.geom), 250 )
                    , (SELECT ST_Union(c2.geom)
                         FROM foo.county AS c2
                        WHERE c2.name <> c1.name)
                    )
  FROM foo.county AS c1
 GROUP BY c1.name;

Sin embargo, esto, por supuesto, me da un búfer superpuesto donde dos polígonos se encuentran en el borde del agua, así como a través de estrechos estrechos:

mapa

(Tenga en cuenta que la pequeña astilla púrpura de la izquierda debe asignarse completamente al polígono rojo, ya que ningún punto en esa geometría está más cerca del azul que el rojo debido a la península tipo apéndice).

Aquí es donde estoy atrapado. Quiero cortar las superposiciones (partes moradas) en dos polígonos disjuntos a lo largo de una línea equidistante a los polígonos sin búfer, y luego restar esas astillas de los condados con búfer.

No creo que tenga un caso de tres o más memorias intermedias superpuestas. Cruzaré ese puente si llego a él.

A mí me huele a algo similar pero no bastante idéntico a usar ST_VoronoiPolygonspero alrededor de polígonos en lugar de puntos.

¿Existe esto, idealmente, como funciones de PostGIS, como la funcionalidad de geoprocesamiento de QGIS o tal vez en algunas bibliotecas de Python?

kthy
fuente
En la imagen de arriba, ¿es esa pequeña mancha de aguas internacionales no azules? o lo rellenas?
Evan Carroll
El no azul está simplemente fuera de todos los polígonos: solo estoy haciendo un búfer de 250 metros, por lo que sigue siendo aguas nacionales. Para mi propósito, solo necesito un pequeño búfer para asegurarme de capturar características "en el surf". Ver el agujero al sur de la isla del anillo en el medio definitivamente me hace querer hacer un volcado ExteriorRing también, pero eso no es relevante para esta pregunta. :)
kthy
¿Encontraste una solución? Estoy enfrentando un problema similar y me gustaría dividir algunos polígonos superpuestos a sus vecinos.
DanielK
Todavía no hay solución, lamentablemente. Tengo una idea para progresar usando una combinación de ExteriorRingy, Intersectspero no he tenido tiempo de trabajar durante las vacaciones.
kthy
su ejemplo puede haber sido parcialmente automatizado, pero la función st_difference se comporta horriblemente al cortar, dejando "bigotes" en los bordes de los cortes, lo que obliga al desarrollador a buscar soluciones alternativas, y los casos de fusión de polígonos pueden ser simples y complicados, lo que implicará una revisión manual ... ¿todavía te enfrentas al trabajo con tu ejemplo?
Cyril Mikhalchenko

Respuestas:

5

Si la solución a este problema es relevante, y la entendí correctamente, su solución es la siguiente: (Los datos originales son abstractos, ya que entendí que están adyacentes a la intersección en el búfer con un número dado de metros, en mi caso 2 tablas : exper_list3 y exper_list4 ver figura 1):

ingrese la descripción de la imagen aquí 1) En pgAdmin, ejecute la consulta: create table exper_list5 as SELECT st_intersection (exper_list4.geom, exper_list3.geom) AS geom FROM exper_list4, exper_list3 WHERE st_intersects (exper_list4.geom, exper_list3.geom) = true; resultado: tabla exper_list5 ver figura 2;

ingrese la descripción de la imagen aquí

2) En pgAdmin, ejecute la consulta: create table exper_list6 as SELECT (ST_Dumppoints (geom)). Geom FROM exper_list5; el resultado es una tabla con puntos, adicionalmente vaya a las propiedades de la tabla, cree un campo gid y establezca restricciones en él;

3) En QGIS, ejecute la herramienta Polígono de Voronoi en la tabla (capa vectorial) exper_list6. El resultado se muestra en la Figura 3.

ingrese la descripción de la imagen aquí

4) En pgAdmin, ejecute la consulta: create table exper_list8 as SELECT (ST_Dumppoints (geom)).geom FROM exper_list7; el resultado se muestra en la Figura 4.

ingrese la descripción de la imagen aquí

5) Seleccione de exper_list8 aquellos puntos que ingresan al polígono exper_list5 En pgAdmin, ejecute la consulta: create table exper_list9 as SELECT st_intersection (exper_list8.geom, exper_list5.geom) AS geom FROM exper_list8, exper_list5 WHERE st_intersects (exper_list8.geom, exper_list5.geom) = true; y copie estos puntos al resultado de la tabla exper_list6 figura 5;

ingrese la descripción de la imagen aquí

6) En QGIS En la tabla exper_list6 ejecute la herramienta "triangulación de Delaunay" y obtenga el resultado exper_list10, vea la figura 6

ingrese la descripción de la imagen aquí

7) En QGIS en el modo de edición "Lápiz" en la tabla exper_list10, elija los triángulos que toquen el área de interés, use la herramienta "Vector" - "Geoprocesamiento" - "Unificación por función" (marque "solo objetos seleccionados" "Clasificación" - por todos los signos) resultado exper_list11 figura 7;

ingrese la descripción de la imagen aquí

8) A partir de exper_list6, corte el resultado de exper_list11 figura 8 exper_list12;

ingrese la descripción de la imagen aquí

9) De exper_list4 corte exper_list11 el resultado figura 9 exper_list13;

ingrese la descripción de la imagen aquí

10) Se deben realizar acciones similares con el polígono izquierdo (en mi caso, la tabla exper_list4)

11) El resultado general es las dos tablas exper_list13 y exper_list14 ver figura 10.

ingrese la descripción de la imagen aquí

buena suerte, tuyo fielmente

Cyril Mikhalchenko
fuente
Esto parece oro sólido. Lo marcaré como aceptado una vez que haya tenido tiempo de probarlo en algún momento de la próxima semana. ¡Gracias!
kthy