Upraszczanie sąsiadujących wielokątów za pomocą PostGIS?

24

Wystąpił problem polegający na uproszczeniu zestawu sąsiadujących wielokątów. Jeśli uproszczę każdy wielokąt osobno za pomocą algorytmu Douglasa – Peuckera (używanego przez wiele narzędzi typu open source), powstałe wielokąty zwykle już nie sąsiadują. Problem ten występuje na przykład podczas uproszczenia granic krajów / województw.

Czy ktoś ma na to rozwiązanie za pomocą PostGIS?

stachu
źródło

Odpowiedzi:

19

Topologiczny model wektorowy zapewni to, czego potrzebujesz. W pamięci nie topologicznej (takiej jak plik kształtu) pojedyncza krawędź między geometriami jest przechowywana dwukrotnie. W wektorze topologicznym obszary są przechowywane osobno od linii, dzięki czemu można dokonać regulacji bez wpływu na topologię. Nie mogłem znaleźć dobrego schematu, więc stworzyłem ten prosty przykład, w którym obszary A, B i C są obliczane na podstawie przecięć linii (łączących 1-4), które je oddzielają. przykład wektora topologicznego

Ten model jest używany przez ArcInfo jako pokrycia, w GRASS jako domyślny model wektorowy , i może być stosowany w PostGIS z eksperymentalnym narzędziem Topology PostGIS . Być może prostszym rozwiązaniem jest przekształcenie danych w linie, usunięcie zbędnych segmentów, a następnie odtworzenie wielokątów po uproszczeniu.

scw
źródło
15

Chcesz zamienić wielokąty w linie, sprawić, by były prostymi krawędziami pokrycia, uprościć te krawędzie, a następnie ponownie zbuduj je z powrotem w wielokąty, a na koniec użyj punkt-w-wielokącie, aby ponownie połączyć atrybuty starych wielokątów z nowe.

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

Powyższe zawiera błędy, ale podstawowa koncepcja już istnieje. Możesz to zrobić w jednym zapytaniu, jeśli chcesz.

Paul Ramsey
źródło
-1

Musisz teselować. W starej teorii tworzenia geometrii ARC / INFO dwie sąsiednie geometrie są tworzone przez jedną polilinię i dzielą tę polilinię. Dlatego podczas uogólnienia uogólnia on obie granice, ponieważ odnosi się do tej samej polilinii.

CrazyEnigma
źródło