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:
(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_VoronoiPolygons
pero 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?
ExteriorRing
y,Intersects
pero no he tenido tiempo de trabajar durante las vacaciones.Respuestas:
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):
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;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.
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.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;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
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;
8) A partir de exper_list6, corte el resultado de exper_list11 figura 8 exper_list12;
9) De exper_list4 corte exper_list11 el resultado figura 9 exper_list13;
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.
buena suerte, tuyo fielmente
fuente