Semplificare i poligoni adiacenti usando PostGIS?


24

Ho riscontrato un problema nella semplificazione di una serie di poligoni adiacenti. Se semplifico ogni poligono separatamente con l'algoritmo Douglas – Peucker (che viene utilizzato da molti strumenti open source), i poligoni risultanti di solito non sono più adiacenti. Questo problema esiste, ad esempio, quando si semplificano i confini di paesi / province.

Qualcuno ha una soluzione per esso utilizzando PostGIS?

Risposte:


19

Un modello vettoriale topologico fornirà ciò di cui hai bisogno. In una memoria non topologica (come un file di forma), un bordo singolo tra le geometrie viene memorizzato due volte. In un vettore topologico, le aree sono memorizzate separatamente dalle linee, quindi è possibile effettuare regolazioni senza influire sulla topologia. Non sono riuscito a trovare un buon diagramma, quindi ho creato questo semplice esempio, in cui le aree A, B e C sono calcolate dalle intersezioni delle linee (che collegano 1-4) che le separano. esempio di un vettore topologico

Questo modello viene utilizzato da ArcInfo come coperture, in GRASS come modello vettoriale predefinito e può essere utilizzato in PostGIS con lo strumento sperimentale Topologia PostGIS . Forse una soluzione più semplice sta convertendo i tuoi dati in linework, rimuovendo i segmenti ridondanti e quindi ricreando i tuoi poligoni dopo la semplificazione.


15

Vuoi trasformare i tuoi poligoni in linee, rendere quelle linee semplici bordi di copertura, semplificare quei bordi, quindi ricostruirli nuovamente in poligoni e infine utilizzare il punto-in-poligono per ricongiungere gli attributi dei vecchi poligoni con nuovi.

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));

Ci sono errori in quanto sopra, ma il concetto di base è lì. Se lo desideri, puoi fare tutto in una sola query.



-1

Devi tessellate. Nella vecchia teoria ARC / INFO sulla creazione della geometria, due geometrie adiacenti sono create da una polilinea e condividono questa polilinea. Pertanto, quando hai generalizzato, ha generalizzato entrambi i bordi perché faceva riferimento alla stessa polilinea.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.