Simplificar polígonos adyacentes

23

Encontré un problema al simplificar el conjunto de polígonos adyacentes. Si simplifico cada polígono por separado con el algoritmo de Douglas-Peucker (que es usado por muchas herramientas de código abierto), los polígonos resultantes generalmente ya no son adyacentes. Este problema existe, por ejemplo, al simplificar las fronteras de los países / provincias.

¿Alguien tiene una buena solución para ello, preferiblemente para hacer en postgis?

    
pregunta stachu 23.07.2010 - 11:28

4 respuestas

19

Un modelo vectorial topológico proporcionará lo que necesita. En un almacenamiento no topológico (como un shapefile), un borde único entre geometrías se almacena dos veces. En un vector topológico, las áreas se almacenan por separado de las líneas, por lo que se pueden hacer ajustes sin afectar la topología. No pude encontrar un buen diagrama, así que creé este simple ejemplo, donde las áreas A, B y C se calculan a partir de las intersecciones de las líneas (conectando 1-4) que las separan.

ArcInfoutilizaestemodelocomocoberturas,enGRASScomo modelo vectorial predeterminado , y se puede utilizar en PostGIS con la herramienta de topología PostGIS experimental. Quizás una solución más simple es convertir sus datos en trabajos de línea, eliminar los segmentos redundantes y luego recrear sus polígonos después de la simplificación.

    
respondido por el scw 24.07.2010 - 03:28
14

Desea convertir sus polígonos en líneas, hacer que esas líneas sean bordes de cobertura simples, simplificar esos bordes, volver a crearlos en polígonos y finalmente usar el punto en polígono para volver a unir los atributos del antiguo Polígonos con los nuevos.

CREATE TABLE rings AS SELECT (ST_DumpRings(polys)).geom AS rings FROM polytable;
CREATE TABLE simplerings AS SELECT ST_Union(rings) AS simplerings FROM rings;
CREATE TABLE newpolycollection AS SELECT ST_Polygonize(ST_Simplify(simplerings, 10.0)) AS geom FROM simplerings;
CREATE TABLE newpolysnoattributes AS SELECT (ST_Dump(geom)).geom FROM newpolycollection;
CREATE TABLE newpolytable AS SELECT new.geom, old.attr FROM newpolysnoattributes new, polytable old WHERE ST_Contains(new.geom, ST_PointOnSurface(old.polys));

Hay errores en lo anterior, pero el concepto central está ahí. Puede hacerlo todo en una consulta si lo desea.

    
respondido por el Paul Ramsey 03.08.2010 - 22:04
3

Para evitar este problema, debe modelar sus datos utilizando restricciones topológicas. enlace lo hace.

    
respondido por el julien 23.07.2010 - 21:45
0

Necesitas un mosaico. En la antigua teoría ARC / INFO de la creación de geometría, dos geometrías adyacentes son creadas por una polilínea y compartían esta polilínea. Por lo tanto, cuando generalizó, generalizó ambos bordes porque hacía referencia a la misma polilínea.

    
respondido por el CrazyEnigma 23.07.2010 - 23:59

Lea otras preguntas en las etiquetas