Linien automatisch an Punkten ausrichten?

19

Ich habe zwei Vektor-Shapefiles: Eine Datei ist Punkte, die Mannlöcher darstellen, und die andere ist eine Polyliniendatei, die Rohre darstellt, die zu und von den Mannlöchern führen. Ich muss die Leinen in einem bestimmten Abstand zum nächsten Mannloch einrasten lassen.

Gibt es einen einfachen Weg, dies zu erreichen, ohne es manuell zu tun?

Linien -> Punkte

Aktualisieren

Laut Alexandre habe ich meine Shapefiles in das Spatialite-Format exportiert. Ich bin mir nicht sicher, was ich als nächstes tun soll.

Bildbeschreibung hier eingeben

Update Nr. 2 Ich habe eine neue Datenbankdatei erstellt und Shapefiles mit Spatialite-GUI in die neue Datenbank importiert. Ich habe meine SQL-Abfrage angepasst.

Bildbeschreibung hier eingeben

GreyHippo
quelle
In einer räumlichen Spatialite-Tabelle (Layer) werden die Feature-Geometrien in einem Attribut gespeichert. Die Namen können unterschiedlich sein. In der "Pipe" -Tabelle heißt dieses Attribut Geometrie. Ich werde meine Antwort aktualisieren, vorausgesetzt, dass mh auch ein Geometrie-Attribut ist.
Alexandre Neto
Ich habe die Fehlermeldung "keine solche Funktion: ST_Snap" erhalten. Ich benutze QGIS 1.8 unter Windows 7 64bit.
GreyHippo
Welchen Spatialite hast du? Sie können es in QGIS> Hilfe> Über
Alexandre Neto
"no such column: f.geom" - versuchen Sie es mit f.Geometry
vinayan
Meine Spatialite-Version ist 3.0.1
GreyHippo

Antworten:

26

Wenn Sie bereit sind, Ihre Daten in Postgis (oder Spatialite ) abzulegen , können Sie ST_Snap verwenden , um das zu tun, was Sie möchten.

Verwenden Sie einfach die Ebene Linien \ Tabelle als Eingabe und die Ebene Punkte als Referenz, und legen Sie die Toleranz fest. Etwas wie das:

SELECT
    f.gid as gid,
    ST_Snap(f.Geometry, g.Geometry, 2) as geom
FROM
    pipe as f,
    (SELECT ST_Collect(Geometry) as Geometry
     FROM mh) as g

Das Ergebnis ist folgendes:

Bildbeschreibung hier eingeben

Anschließend können Sie Ihre Geometrien mithilfe der Feature-ID aktualisieren.

Alexandre Neto
quelle
Wo würde ich den Code "Select ... From ..." einfügen? Was bedeutet "Verwenden der Feature-ID"?
GreyHippo
Nach dem Importieren Ihrer Dateien in die Datenbank (Postgis oder Spatialite) können Sie mit dem DB Manager Ihre Datenbanktabellen anzeigen, die SQL-Abfrage (den Code) in SQL Window ausführen und anschließend in Ihren Erstellungsbereich laden. Sagen Sie mir, ob das für Sie funktioniert, und dann werden wir den Update-Teil machen.
Alexandre Neto
Alexandre, siehe Update oben. Ich habe eine Datei in zwei Spatiallite-Dateien exportiert.
GreyHippo
Sie sollten beide Dateien in derselben Spatialite-Datenbank speichern. Ziehen Sie einfach "pipe" in die "mh.sqlite" -Datenbank. Aktualisieren Sie anschließend den SQL-Code, um "points" in "mh" und "lines" in "pipe" zu ändern. Passen Sie "gid" auch an Ihre "Pipe" -ID an. Danach können Sie die Ergebnisse ausführen und laden.
Alexandre Neto
3

Ich weiß nicht viel über QGIS oder GRASS, aber ein schnelles Googeln hat ergeben, dass v.clean in GRASS den Trick machen sollte.

Schauen Sie sich diesen und diesen Beitrag an .

Alternativen zu QGIS und GRASS:

Wenn ich dies in ArcGIS tun würde, würde ich meine Daten wahrscheinlich in einem Feature-Dataset in einer File-Geodatabase speichern und eine Topologie erstellen , um Bereiche zu identifizieren, in denen sich der Punkt-Layer nicht auf den Endpunkten der Linien befand. Anschließend können Sie die Fehler mit dem Fehlerinspektor beheben .

Die wahrscheinlich schnellste und einfachste Lösung wäre jedoch die FME. Sie können versuchen, das Snapper-Tool oder besser noch das AnchoredSnapper-Tool zu verwenden . Wenn Sie den AnchoredSnapper verwenden, stellen Sie sicher, dass der Fangtyp Endpunktfang ist. Natürlich benötigen Sie eine Lizenz für FME. Sie können jedoch eine 14-Tage-Testversion herunterladen, wenn Sie keine haben.

Fezter
quelle
Ich habe mir v.clean angesehen, aber es wird nur eine Ebene verwendet. Ich muss eine Ebene mit einer anderen vergleichen. Außerdem suchte ich mehr nach einer QGIS / OpenSource-Option.
GreyHippo
1
@ GreyHippo, GRASS ist
Open Source
1
Ich weiß, dass GRASS Open Source ist, aber Ihre anderen Optionen sind es nicht.
GreyHippo
-1

Manueller Weg

Qgis -> Einstellungen -> Fangoptionen (und ich bin nicht sicher, aber es könnte eine CadTools-Erweiterung erfordern) und die topologische Bearbeitung aktivieren.

Automatischer Weg

v.clean in GRASS-Tools in der SEXTANTE-Toolbox in QGIS. Wenn Sie PostGIS 2.0 haben, dann ST_Snap und ST_SnapToGrid () (und es gibt keinen Grund, warum Sie es nicht verwenden können, es ist ein sehr gutes räumliches Werkzeug)

Kommerzieller Weg

FME- und MRF-Tool (kommerzielle Erweiterung, ich hatte eine Evaluierungsversion. Es war sehr gut).

Ich interessiere mich auch für die Verwaltung von Wasserrohren und Abwasserkanälen mit Open-Source-Tools. Haben Sie Tipps?

simplexio
quelle
Ich denke, das ist es, was GreyHippo unter "manuell" versteht. Wenn Sie nur die Fangoptionen verwenden, müssen Sie jeden baumelnden Knoten von Hand bewegen, um das Fangen zu aktivieren. Oder vermisse ich etwas?
Jake
Nein. Ich war blind.
Simplexio
Simplexio, ich möchte es NICHT manuell machen. Ich habe auf ein Plugin oder einen Prozess gehofft, von dem ich nichts weiß.
GreyHippo
Ich hätte nicht gedacht, dass Sie GRASS v.clean auf zwei Ebenen verwenden können?
GreyHippo
1
Wenn ich mich richtig erinnere, kann es zu kurze Linien reparieren. Sie sehen, das Problem, das Sie haben, ist nicht, dass Ihre Schächte nicht an den richtigen Stellen sind, sondern dass Ihr Kanalnetz nicht topologisch korrekt ist. Und das braucht nur Rohrleger. Jedes Versorgungsnetz, das ich gesehen habe, geht davon aus, dass sich in jeder Abwasserkreuzung ein Mannloch befindet. Bei diesem Vorgang wird davon ausgegangen, dass die Topologie korrekt sein soll.
Simplexio