Jak inteligentnie degradować lub wygładzać dane GIS (upraszczając wielokąty)?

Mam szczegółowe mapy hrabstwa USA, z linii tygrysa zestawów danych. W jaki sposób mogę pobierać, wygładzać lub degradować dane, aby uzyskać prostsze, bardziej pudełkowe, mniej "hałaśliwe" kształty, aby reprezentować cechy geograficzne - w tym przypadku tylko granice hrabstw i linie stanowe, ale może również w ogólnym przypadku?

Próbkowanie może się zdarzyć w czasie renderowania, jeśli można to zrobić efektywnie, lub równoległy zestaw danych może być generowany i przechowywany. Używam PostGIS i linie są multi-poliliniami generowanymi przez shp2pgsql -- ale każde rozwiązanie, w którym weźmiesz linię squiggly i zmniejszysz ją do gładszej linii o mniej więcej takim samym znaczeniu dla ludzkiego interpretera, byłoby bardzo przydatne.

Author: ire_and_curses, 2009-12-05

6 answers

Problem z prostym wyrzucaniem punktów polega na tym, że można szybko zniekształcić kształt oryginalnego wielokąta. Lepszym podejściem jest przyjście do niego z innego kierunku; zacznij od podstawowego przybliżenia wielokąta, a następnie udoskonal go w górę w kierunku złożonego kształtu.

Doskonałym przykładem takiego podejścia jest algorytm Douglasa-Pueckera . Zaczynasz od dwóch wierzchołków narysowanych z pełnego wielokąta. Dodać trzeci wierzchołek wybierając ten, który leży najdalej od krawędź rysowana między dwoma pierwszymi wierzchołkami. Kontynuuj dodawanie punktów, dopóki nie uzyskasz czegoś, co wystarczająco przypomina twój oryginalny wielokąt.

 30
Author: ire_and_curses,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-04 22:13:10

Douglas-Peucker jest zdecydowanie właściwym podejściem. Istnieje kilka prostych sposobów dostępu do implementacji it w PostGIS i QGIS, które myślałem, że dodam tutaj dla tych, którzy natkną się na ten post z podobnym pytaniem. Celem jest zacząć od czegoś takiego:

alt text

I skończyć z czymś takim:

alt text

W PostGIS Douglas-Peucker jest zaimplementowany jako simplify, składnia, szczegółowa tutaj na bostongis.org , jest jakimś wariantem of:

SELECT transform(simplify(transform(the_geom, 2249), 500),4326) from the_geo_table

To działało bardzo dobrze nawet na pełnym krajowym zbiorze danych, z kilkoma błędami, które wydają się być spowodowane kiepskimi danymi bazowymi. Okazuje się również, że w QGIS element menu Tools > Geometry Tools > Simplify Geometries wyeksportuje uproszczony plik kształtu dowolnej geometrii i doda go jako warstwę do bieżącego projektu.

Jest to dość podstawowy zestaw narzędzi i zadałem pytanie na zbyt niskim poziomie, chociaż miło było nauczyć się podstawowej matematyki, jest dobre wyjaśnienie tego tutaj: http://www.mappinghacks.com/code/PolyLineReduction / , wraz z przykładowym kodem, który okazuje się nie być zbyt potrzebny!

 61
Author: unmounted,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-08 14:17:57

Zamiast QGIS proponuję użyć ogr2ogr, ponieważ nie usuwa wielokątów !

ogr2ogr output.shp input.shp -simplify 0.0001
 19
Author: Carlos Rendon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-08 17:14:33

Oto prosty iteracyjny algorytm wygładzania:

Dla każdego z trzech punktów sekwencyjnych na dowolnej ścieżce, jeśli punkt środkowy nie ma przecięć i znajduje się w pewnym małym kącie progowym bezpośredniej ścieżki między dwoma zewnętrznymi punktami, usuń go.

Powtarzaj do momentu spełnienia.

 8
Author: Will,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-04 22:04:22

Możesz również spróbować algorytmu Visvalingama, który iteracyjnie usuwa najmniej wyczuwalną część linii. Oto świetne wyjaśnienie tego algorytmu:

 7
Author: Lars Grammel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-27 23:36:06

Możesz również użyć uprościć.js, który wykorzystuje kombinację Douglasa-Peuckera i algorytmów odległości radialnej. Istnieją również linki do wielu portów do innych języków wymienionych w projekcie github

 4
Author: Anthony Hatzopoulos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-17 17:03:02