Kleine Zwischenräume (Splitter) zwischen Polygonen entfernen? [geschlossen]

51

Ich habe eine Reihe von Polygonen, die Verwaltungsbezirke darstellen. Die Bezirke wurden von Hand digitalisiert und es gibt kleine Zwischenräume (Splitter) zwischen Polygonen, in denen sich die Polygone berühren sollten.

Wie kann ich die Polygone zusammenschnappen lassen und die Leerzeichen entfernen?

QGIS wird bevorzugt, aber ArcGIS und allgemeine Programmierung sind ebenfalls Optionen.

Zoo
quelle

Antworten:

27

Verwenden Sie beseitigen (ArcInfo - Lizenz erforderlich)

Eliminiert Polygone, indem sie mit benachbarten Polygonen mit der größten Fläche oder der längsten gemeinsamen Grenze zusammengeführt werden. Eliminate wird häufig verwendet, um kleine Splitterpolygone zu entfernen, die das Ergebnis von Überlagerungsoperationen sind, z. B. Intersect oder Union.

http://help.arcgis.com/de/arcgisdesktop/10.0/help/index.html#//00170000005p000000.htm

Bildbeschreibung hier eingeben

ArcGIS 10-Benutzer Beachten Sie, dass die Optionen für dieses Tool eine NEUE Funktion enthalten.

Mit der Option> ex_features (optional) kann jetzt das ursprüngliche POLYGON oder POLYLINE beibehalten werden. Eine Eingabe-Polylinie oder Polygon-Feature-Class oder -Layer , die Polygongrenzen oder Teile davon definiert, die nicht entfernt werden dürfen.

Mapperz
quelle
3
Funktioniert das in Zoos Fall? Der Datensatz scheint keine Splitter zu enthalten, nur Lücken zwischen Polygonen.
Underdunkel
3
Ich habe dieses Tool erfolgreich verwendet, um Lücken zwischen Polygonen zu entfernen. Bei der Verwendung dieses Tools ist jedoch ein Problem aufgetreten. Wenn die Polygone während der Geoverarbeitung geknackt werden, werden die neu erstellten Polygone verallgemeinert. Kurven werden also nicht so glatt sein, sondern scharfe "gezackte" Linien haben. Ymmv.
Amasephy
3
@underdark Guter Punkt. Man könnte die Faserbänder jedoch immer über eine Vereinigung der Daten mit einem monolithischen umgebenden Polygon (wie dem Begrenzungsrahmen des Datensatzes) einführen. Eine interessante Frage ist, wie "Eliminate" auswählt, in welche Polygone die Faserbänder zusammengeführt werden sollen. Dies könnte die Ergebnisse verzerren (obwohl ich bezweifle, dass die Verzerrung in den meisten Anwendungen wichtig ist). In dieser besonderen Situation würde eine ideale Lösung die Faserbänder aufteilen oder die Fehler herausmitteln.
whuber
Eine der Optionen des Werkzeugs besteht darin, das Faserband mit dem benachbarten Polygon entweder mit dem längsten Rand (der Standardoption) oder mit dem größten Bereich zusammenzuführen.
Kenbuja
4
Wenn Sie keine ArcInfo-Lizenz haben, finden Sie unter arcscripts.esri.com/details.asp?dbid=14672 ein Skript, das dies über Python automatisiert. Ich habe es vor ein paar Jahren erfolgreich eingesetzt.
Stephen Lead
20

Um dies manuell in QGIS zu tun, gehen Sie zu Aktivieren Sie auf Settings|Project Properties...der GeneralRegisterkarte unten Snapping options...die Ebene, die Sie fangen möchten, stellen Sie den Modus auf to vertexund stellen Sie die Toleranz auf einen Wert ein, der kleiner als der kürzeste Abstand zwischen zwei Punkten ist, den Sie haben. Wenn Sie sich nicht sicher sind, stellen Sie die Einheiten auf pixelsund die Toleranz auf etwa 5, damit Sie bei gewissen Details richtig zoomen und sicherstellen können, dass Sie nicht am falschen Scheitelpunkt einrasten.

Bearbeiten Sie dann Ihre Vektorebene, wählen Sie das Knotenwerkzeug aus und verschieben Sie die fehlerhaften Punkte auf ihre Gegenstücke.

Es ist etwas kniffliger, es automatisch zu machen. AFAIK QGIS verfügt nicht über ein Plugin zur Automatisierung, und obwohl PostGIS auf GEOS basiert, das über Fangfunktionen verfügt, sind sie nicht mit PostGIS konfrontiert. Es könnte möglich sein, eine Abfrage zu schreiben, um jeden Punkt eines Polygons auf Nachbarn innerhalb der Fangentfernung zu prüfen, aber ich kann das derzeit nicht näher erläutern.

GRASS verfügt über v.clean.snap, auf das Sie über QGIS zugreifen können. Es gibt jedoch noch einen zusätzlichen Schritt zum Erstellen eines GRASS-Datasets.

MerseyViking
quelle
Sie können jederzeit die QGIS-Verarbeitungs-Toolbox verwenden und v.clean.snap direkt auf Ihr Shapefile anwenden.
SAnderka
v.clean.snap ist nicht verfügbar. Ich habe v.clean verwendet und dann das Snap-Tool ausgewählt und es gab eine leere Ebene. Die Dokumentation besagt, dass der Fang das Verbinden von Linien mit dem Scheitelpunkt ist. Ich möchte einen Scheitelpunkt mit einem anderen Scheitelpunkt innerhalb der Schwelle verbinden.
Neogeomat
17

Wenn Sie mit QGIS vertraut sind: Im QGIS-Trunk 1.9 (kann über den OSGEO-Installer als qgis.dev installiert werden, siehe qgis-Homepage) befindet sich im Vektormenü eine neue Funktion namens "Splitterpolygone entfernen", die genau das tut, was Sie tun wollen. Sie können die problematischen Polygone auswählen und basierend auf einer gemeinsamen Grenze oder einem gemeinsamen Flächenanteil zu benachbarten Polygonen zusammenführen. Versuch es!

Brachvogel
quelle
3
Um diese Antwort zu aktualisieren, finden Sie in QGIS 2.18.1 'Splitterpolygone entfernen' im Stable-Paket unter Vektor -> Geoverarbeitungswerkzeuge.
Valerie Anderson
Dies gilt für vorhandene Streusplitterpolygone zwischen den Hauptpolygonen, nicht für Räume zwischen Polygonen.
stragu
15

Wenn Sie ein QGIS-Benutzer sind, erhalten Sie die gesamte Leistung von GRASS, da es sich um ein vollständig topologisches GIS handelt. Aktivieren Sie in QGIS das GRASS-Plugin und erstellen Sie einen Ort / ein Mapset, an dem Ihre Daten importiert werden sollen.

Öffne das Mapset und importiere deine schmutzige Ebene mit v.in.ogr. Spiele mit den beiden erweiterten Parametern "Fangschwelle für Grenzen" und "Mindestgröße des zu importierenden Bereichs".

Sie können auch die vom v.clean-Modul bereitgestellten Optionen verwenden.

Giovanni Manghi
quelle
10

In ArcGIS gibt es Topologieregeln , mit denen Sie Lücken in Ihren Daten identifizieren und korrigieren können, z. B. auf die Sie sich beziehen. Zum Erstellen von Topologieregeln benötigen Sie entweder eine ArcEditor- oder eine ArcInfo-Lizenz und speichern Ihre Feature-Class in einem Feature-Dataset in einer persönlichen oder einer File-Geodatabase.

Sie möchten höchstwahrscheinlich die Regel " Darf keine Lücken haben " implementieren . Nachdem Sie die Regelbasis mit allen Regeln erstellt haben, die Sie für notwendig halten, möchten Sie die Topologie validieren, die alle Fehler in Ihren Daten identifiziert.

Anschließend können Sie mit dem Fehlerinspektor und dem Tool zum Beheben von Topologiefehlern die zu behebenden Fehler einzeln oder in großen Mengen auswählen und festlegen, wie sie behoben werden sollen (z. B. neue Polygone erstellen, um die Lücken zu füllen, oder mit größeren Polygonen zusammenführen). .

RyanDalton
quelle
7

In der QGIS 2.12 (Lyon) Toolbox gibt es die Funktion "Splitterpolygone entfernen". Ich bin sicher, dass es auch in einer früheren Version ist.

dnltsk
quelle
2

Nun, ich habe eine PostGIS-Funktion (die ich direkt in meinem QGIS verwende) verwendet, die einen rekursiven Snap ausführt, um dieses Problem zu lösen. Die Ergebnisse sind recht gut, es ist nur eine gute Auswahl an Toleranzwerten erforderlich, um die besten Ergebnisse zu erzielen. Wenn Sie bereit sind, es zu versuchen, überprüfen Sie es (in meinem Fall sind die Geometrien alle multi, folglich das st_multi in meinem Execute):

CREATE OR REPLACE FUNCTION dsgsnap(tabela text, snap float) RETURNS void AS 
        $BODY$
            DECLARE
            id int;
            BEGIN
                FOR id in execute('select id from '||tabela)
                LOOP
                    EXECUTE     
                'update '||tabela||' as classe set geom = st_multi(res.geom) 
                from 
                    (
                        select st_snap(a.geom, st_collect(b.geom), '||snap||') as geom, a.id as id 
                        from '||tabela||' a, '||tabela||' b 
                        where a.id != b.id and a.id = '||id||' 
                        group by a.id, a.geom
                    ) as res 
                where res.id = classe.id';
                END LOOP;
                RETURN;                        
            END
        $BODY$
        LANGUAGE plpgsql;
lcoandrade
quelle
1

Keine perfekte Lösung, aber eines dieser beiden Dinge funktioniert in den meisten Fällen für mich:

  1. Speichern Sie die Ebene in QGIS im GEOJSON-Format. Stellen Sie vor dem Speichern im Dialogfeld "Ebene speichern unter" die Koordinatengenauigkeit auf 3 ein (15 ist die Standardeinstellung). Dies hat den Effekt, Scheitelpunkte zu vereinen, die sehr nahe beieinander liegen.

  2. Gehen Sie zu Mapshaper , laden Sie die Datei hoch und klicken Sie auf "Vereinfachen". In der oberen linken Ecke wird angezeigt, wie viele Linienkreuzungen gefunden wurden, und Sie haben die Möglichkeit, diese zu korrigieren. Ich finde, dass dieses Update etwa die Hälfte der Zeit funktioniert.

mgalka
quelle
0

Ich habe es nicht verwendet, aber ET Geowizards , das viele ArcEditor- und ArcInfo-Verarbeitungswerkzeuge in die ArcView-Level-Lizenz (auch bekannt als ArcGIS Standard) bringt, verfügt über einen Eliminate-Assistenten , der "unerwünschte Polygone (Splitter) durch Zusammenführen mit benachbarten Polygonen oder" eliminiert " löschen " . Das Wizard-Toolkit gibt Ihnen 250 USD ( Preisliste ) zurück.

Matt Wilkie
quelle
0

Ich hatte das gleiche Problem: Durch das Erforschen der Werkzeuge konnte ich mich recht leicht zurechtfinden, obwohl ich die Logik nicht kenne. ! [Gehen Sie in den Tools zur Toolbox "Datenverwaltung", gehen Sie zu "Feature-Class" und führen Sie das Integrationsskript durch Doppelklick aus.] [1]

Wählen Sie im Skriptfenster die Feature-Class mit dem Problem aus, und fügen Sie in der XY-Toleranz das Tal hinzu, indem Sie den Abstand mit Hilfe des Messwerkzeugs an mehreren Punkten messen. Lassen Sie ein durchschnittliches Tal diesen Wert in die Toleranzumgebung einfügen und das von mir gelöste Problem anwenden nicht wie sondern mit ca. 90% genauigkeit gelöst. ! [Bildbeschreibung hier eingeben] [2]

Ich habe alle anderen in den obigen Antworten beschriebenen Methoden ausprobiert, aber es war schwierig und umständlich, die automatisierten Korrekturen für Lücken zwischen den benachbarten Polygonen zu erhalten.

SM Farooqi
quelle
1
Wenn Sie einen Link zu den Bildern einfügen, auf die Sie sich beziehen, kann ich sie hinzufügen.
DJQ