5 votos

Forma práctica de gestionar los polígonos y las uniones de los mismos

Tengo una tabla en PostGIS con una partición bastante fina de una región, que me gustaría disolver en dos niveles superiores mediante dos claves foráneas (por ejemplo, municipio y estado). La partición es real, es decir, las zonas no se solapan, sólo se tocan. Pensé que estaría bien hacerlo en las vistas, para seguir el "no insertar en la base de datos algo que se puede calcular a partir de otros datos existentes". Sin embargo, un simple

SELECT id_municipality, ST_Union(the_geom)
FROM areas
GROUP BY id_municipality

tarda unos 22s en un core i7 para "sólo" unas 36000 áreas con un campo geométrico POLYGON. He indexado el campo de geometría con un índice GIST, pero sin suerte.

Ahora estoy pensando que la única forma práctica sería insertar una columna de geometría en la tabla de municipios y calcularla previamente.

Por desgracia, necesito compartir mis resultados con personas menos técnicas, por lo que instalar paquetes experimentales (como las extensiones topológicas) no es práctico.

2voto

Fabien Ancelin Puntos 431

Si se quiere precalcular, una forma de hacer el trabajo limpiamente sería utilizar la función disolver en Quantum GIS. Tendrá una única geometría creada para cada región del municipio, no un conjunto de geometrías. Para ello, utilice la tabla de municipios que debe tener una clave foránea que es el identificador de la zona. A continuación, en Quantum GIS usuario Vector--> Herramientas de geoprocesamiento --> Disolver. Probablemente tardará mucho tiempo, pero tendrá el procesamiento hecho de una vez por todas. La disolución de la geometría es un proceso que consume recursos de todos modos. Una vez hecho el trabajo, exporte la nueva capa en PostGIS y utilice el identificador para asociar su geometría con la tabla que describe sus regiones.

0voto

Mat Fergusson Puntos 101

Cuando estamos disolviendo geometrías, utilizamos ST_Multi(ST_BuildArea(ST_Buffer(ST_collect(geom), 0))).

ST_collect agrupa la geometría. ST_Buffer(geom, 0) 1. limpia la geometría (eliminando posibles puntos duplicados) y 2. proporciona sólo el anillo exterior. ST_BuildArea(geom) convierte la salida del buffer en un polígono.

Entonces ST_Multi(geom) lo convierte en un multipolígono. No sé por qué lo hacemos, pero asumo que tenemos una razón sensata que de momento se me escapa ;) (Edición: Las geometrías que estamos disolviendo no se tocan necesariamente. Puede que tenga algo que ver con eso).

No sé cómo se compara esto con la velocidad de ST_Union . Mi jefe técnico, sentado a mi lado, indica que es más rápido y fiable que ST_Union era cuando se llamaba geomunion .

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X