Tengo una tabla con muchos polígonos. Todos los polígonos tienen un nombre y un valor.
Quiero aplanar estos polígonos para que cada borde de los polígonos permanezca como borde de los polígonos resultantes. En lugar de tener una pila de polígonos me quedaré con un mosaico de polígonos basados en las mismas líneas.
Resultando en esto:
Los nombres son insignificantes. Quiero sumar los valores de cada polígono original dentro de los diferentes mosaicos del mosaico. También sería relevante calcular el número de solapamientos.
Estoy buscando una solución utilizando PostGIS. He resuelto esto usando FME, pero el tamaño de mis datos (más de 20.000 objetos con millones de solapamientos) hace que esto consuma demasiado tiempo. El función de unión en QGIS lo hace de forma bastante sencilla, tal y como ilustran sus páginas web de documentos.
Para los que necesiten un contexto, los datos son en realidad topes de varios anillos alrededor de los sitios de anidación de aves marinas en Noruega. Los conjuntos de datos son por especie y estamos viendo varios miles de sitios de anidación por especie.
Puede descargar un conjunto de datos de prueba aquí .
0 votos
¿Funciona ST_Union sin un GROUP BY?
0 votos
@DPSSpatial no, he estado probando en el conjunto de datos de la imagen anterior. Lo ideal es que obtenga 7 mosaicos individuales.
0 votos
¡hmmm no estoy seguro de esto, tenía algunas ideas pero no funcionan... espero que alguien pueda opinar ya que esto parece fácil!
0 votos
FME tiene una funcionalidad similar llamada AreaOnAreaOverlayer
1 votos
¿Estás seguro de que funciona en una tabla de entrada? Parece, por la documentación, que está haciendo una combinación de intersecciones/clips en múltiples entradas...
0 votos
@DPSSpatial sí, la geometría simple está bien. Pero funciona como una disolución completa. postgis.net/docs/ST_Union.html
2 votos
Hola yo también estoy trabajando en lo mismo. Si encuentras la respuesta, por favor publícala aquí. Lo que hice hasta ahora fue obtener las intersecciones con la siguiente sentencia sql : SELECT ST_INTERSECTION(t1.geom, t2.geom) FROM yourtable t1, yourtable t2 WHERE t1.ID < t2.ID AND ST_INTERSECTS(t1.geom, t2.geom); Esto te da todas las intersecciones, sin embargo con una superposición entre ellas. Así que creo que tenemos que superponer entre ellos de nuevo y añadir al final las partes fuera de la intersección con "ST_Difference(original_dataset, intersected_dataset)". Creo que esto sería un comienzo para ustedes.
0 votos
@ragnvald ¿podría crear triángulos thiessen/delauney alrededor de los sitios en su lugar? gis.stackexchange.com/questions/114764/
1 votos
Desde PostGIS 2.5,
ST_Split
admite la división Polígono por MultiLinestring si eso es aplicable, recoja los anillos exteriores como hoja, divida todos los polígonos y cuente los iguales. distintos y únalos con la tabla original para sumar los atributos. si une/recoge/divide por intersección (intersección bbox, incluso), el rendimiento podría estar bien.0 votos
Me parece justo @ThingumaBob pero necesito hacer esto en todos los objetos al mismo tiempo. Como se trata de una lista de objetos (geoms) necesito reunirlos todos (polígonos) en un multipolígono para crear la MultiLineString antes de seguir tu consejo. Simplemente haciendo esto para cada objeto entregará una copia de cada objeto. Es decir, no avanza en absoluto. Entonces, ¿cómo puedo itarar a través de todos los objetos y sacar los multipolígonos?
0 votos
La siguiente consulta SQL dividirá el conjunto de datos de prueba en 7 partes. A continuación, habrá que sondear los valores de los polígonos que se cruzan y sumarlos. Consulta SQL: CREATE TABLE tbl_multigeom AS SELECT geom FROM ST_Dump(( SELECT ST_Polygonize(the_geom) AS the_geom FROM ( SELECT ST_Union(the_geom) AS the_geom FROM ( SELECT ST_ExteriorRing(geom) AS the_geom FROM tbl_inn) AS lines ) AS noded_lines ) )
0 votos
Ayuda con un upvote para encontrar una solución para la respuesta similar a la tuya: gis.stackexchange.com/questions/301296/