¿Simplificando polígonos adyacentes usando PostGIS?


24

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

¿Alguien tiene una solución para ello usando PostGIS?

Respuestas:


19

Un modelo vectorial topológico le proporcionará lo que necesita. En un almacenamiento no topológico (como un archivo de forma), un solo borde entre las 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 ejemplo simple, donde las áreas A, B y C se calculan a partir de las intersecciones de las líneas (conectando 1-4) que las separan. ejemplo de un vector topológico

ArcInfo utiliza este modelo como coberturas, en GRASS como su modelo vectorial predeterminado , y puede utilizarse en PostGIS con la herramienta experimental de topología PostGIS . Quizás una solución más simple es convertir sus datos en líneas, eliminar los segmentos redundantes y luego recrear sus polígonos después de la simplificación.


15

Desea convertir sus polígonos en líneas, hacer que esas líneas sean bordes de cobertura simples, simplificar esos bordes, luego volver a construirlos en polígonos y finalmente usar punto en polígono para volver a unir los atributos de los antiguos polígonos con el 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.



-1

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.