Rozpuść wielokąty w QGIS (GEOS) z tolerancją


11

Mam wieloboczną warstwę wektorową reprezentującą obszar zalany powodzią. Warstwa została wykonana w taki sposób, że niektóre obszary składają się z wielu mniejszych dotykających się wielokątów (patrz zrzut ekranu poniżej, z etykietą „oryginalne dane”).

Chciałbym rozpuścić wielokąty tam, gdzie się dotykają. Jeśli użyję narzędzia geoprzetwarzania rozpuszczania w narzędziu fGools QGIS, które korzysta z biblioteki GEOS, otrzymam nieoczekiwane wyniki (patrz „rozpuszczanie z QGIS fTools”). Wygląda na to, że GEOS nie używa progu do określania, czy wielokąty się dotykają, jak wspomniano w tych kwestiach:

http://trac.osgeo.org/qgis/ticket/3126

http://trac.osgeo.org/qgis/ticket/3184

http://hub.qgis.org/issues/2806

To samo podejście w ArcGIS daje oczekiwany wynik (patrz „rozpuszczenie z ArcGIS 10.1”).

Najwyraźniej jest to „funkcja” GEOS, a nie błąd. Czy jest jakiś sposób, aby naprawić dane, które muszę wygenerować oczekiwany wynik? Drobna utrata precyzji (kilka cm?) Może być dla mnie do zaakceptowania. Idealnie rozwiązaniem byłoby coś, co mógłbym napisać we wtyczce QGIS, jako etap wstępnego przetwarzania.

Powiązane pytanie (bez odpowiedzi): Jak ustawić wartość tolerancji narzędzia Geoprocessing w QGIS?

Link do przykładowych danych jako plik kształtu: https://www.dropbox.com/s/c8ns7wwfv289ad0/sample.zip

rozpuszczać wielokąty v. rozpuścić


Obejściem tego problemu byłoby najpierw powiększenie, a następnie zmniejszenie wielokąta rozpuszczonego fTools (przez buforowanie najpierw buforem dodatnim, a następnie ujemnym).
Jake

Próbowałem tego, ale mam inne problemy (np. I.stack.imgur.com/LnFJy.png ). Tutaj niebieski obszar jest tworzony, gdy buforuję / rozpuszczam / neg-bufor, gdzie nie powinno być. Nie jest to o wiele lepsze niż pierwotny problem. Nie widzę, jak mogę odzyskać oryginalny „ostry” róg.
Snorfalorpagus,

Odpowiedzi:


14

W takim przypadku wygląda na to, że musisz pomóc w rozwiązaniu narzędzia, najpierw ustalając topologię. Oto, jak możesz to zrobić w GRASS.

Kiedy ładujesz plik kształtu, tak go widzi GRASS:

Każdy krzyż oznacza obszar. Widać, że na liniach granicznych znajdują się krzyże: są to wielokąty taśmy spowodowane niewielkim przesunięciem między liniami granicznymi.

  1. Usuń wielokątne taśmy utworzone przez luki między prawdziwymi wielokątami:

    v.clean input=sample output=tempA --o tool=rmarea thresh=0.001
  2. Przyciągaj linie graniczne:

    v.clean input=tempA output=tempB --o tool=snap thresh=0.001
  3. Przełam linie graniczne na nowych skrzyżowaniach:

    v.clean input=tempB output=tempA --o tool=break thresh=0.001
  4. Usuń teraz zduplikowane linie graniczne:

    v.clean input=tempA output=tempB --o tool=rmdupl thresh=0.001
  5. Rozpuść wielokąty

    v.dissolve input=tempB output=cleaned --o column=ID

Zrobione:


Dzięki @Jake. To bardzo jasna odpowiedź. Niestety, kiedy próbuję zastosować ten proces do całego mojego zestawu danych (obejmującego 2500 km2), pojawia się błąd z narzędzia Snap „ERROR: G_realloc: nie można przydzielić 144720024 bajtów pamięci na snap.c: 186”. Chyba będę musiał to rozbić na mniejsze części. To powinno być OK, ponieważ już dzielę go na kwadraty 0,25 km2, aby przyspieszyć skrzyżowania / indeksowanie przestrzenne (jest to pole „ID” w przykładowych danych).
Snorfalorpagus,

7

Użyj polecenia GRASS GIS v.dissolve (we wtyczce Sextante -> Polecenia GRASS -> Wektor)

Jeśli szybko odtworzę przykład: wprowadź opis zdjęcia tutaj

Wynik z v.dissolve:

wprowadź opis zdjęcia tutaj

Wyjaśnienie

Problem jest łatwy do zrozumienia. Plik shapefile nie ma topologii, jeśli dwa obszary mają wspólną granicę, która byłaby dwukrotnie digitalizowana, a także przechowywana w duplikacie.

Widać to wyraźnie, gdy próbujesz edytować plik kształtu:

wprowadź opis zdjęcia tutaj

GRASS GIS (jako ArcGIS) jest topologicznym gis. Po zaimportowaniu pliku kształtu w GRASS uzyskana warstwa ma topologię: wspólna granica między dwoma obszarami istnieje raz i jest współdzielona.

wprowadź opis zdjęcia tutaj

Z tego powodu, gdy chcesz rozpuścić plik kształtu ( rozwiązać dwie granice ), możesz napotkać problemy (w QGIS, GvSIG, OpenJUMP lub starym ArcView 3.x), patrz ArcUserI: Zrozumienie topologii i plików kształtów .

W GRASS v.dissolve ma na celu zlikwidowanie wspólnych granic między obszarami o tym samym numerze kategorii


1
Domyślam się, że jest to problem numeryczny i zastanawiam się, czy twoja całkiem dobra kopia geometrii OP, przechwyciłaby te same właściwości numeryczne?
Chau

@Chau: v.dissolvema parametr tolerancji, który rozwiązuje problem PO.
Jake

Ten szczegół powinien zostać włączony do powyższej odpowiedzi, dziękuję za wyjaśnienie :)
Chau

W pytaniu dodałem link do oryginalnych danych jako plik kształtu. Kiedy v.dissolvego używam , wydaje się, że działa, poza tym, że „wypełnia” mały kwadrat pośrodku elementów. i.stack.imgur.com/AA59l.png
Snorfalorpagus

1
Proponuję wyjaśnienie
gen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.