Punkte über Linien mit QGIS verbinden?


9

Ich habe eine .shp-Datei, in der ich alle Punkte (ca. 100) durch Linien verbinden möchte. Ich habe ein Datenfeld mit der Reihenfolge (dh 1, 2, 3, ...).

Ich habe PointConnector und Points2One ausprobiert. Vielleicht verwende ich sie falsch, aber ich kann keine Ergebnisse erzielen.

Bei meinen Suchen habe ich Erwähnung der Plugin-Punkte zu Pfaden gefunden, aber das scheint weg zu sein?

Ich verwende QGIS 2.6.1

Antworten:


8

Erstens können Sie weiterhin das PointsToPaths-Plugin ( https://plugins.qgis.org/plugins/pointstopaths_v02/ ) verwenden. Möglicherweise müssen Sie die Option "Auch experimentelle Plugins anzeigen" unter Plugins> Plugins verwalten und installieren (Plugin Manager)> Einstellungen aktivieren.

Stellen Sie zweitens sicher, dass Ihr Datenfeld mit der Reihenfolge einen numerischen Typ hat (z. B. Ganzzahl, ...).

Ich habe versucht, mit meiner QGIS-Version (2.0.1) Linien aus einer Punktform zu erstellen, und alles war in Ordnung. Hier ein Screenshot:Geben Sie hier die Bildbeschreibung ein

Vielleicht hilft das!

Screenshot mit den Ergebnissen der Form test_coords: Geben Sie hier die Bildbeschreibung ein


Danke - jetzt habe ich zumindest die PointsToPaths gefunden und installiert, aber keine Kombination aus Punktgruppenfeld und Punktreihenfolgefeld scheint Daten zu generieren. Welche Felder werden hier benötigt?
Magnus

Für das "Punktgruppenfeld" haben Sie zwei Möglichkeiten: Sie können ein vorhandenes Feld verwenden oder mit dem Feldrechner (Zeichenfolgentyp) ein neues Feld erstellen. Wenn Sie ein neues Feld erstellen, müssen Sie einen Standardtext in die Spalte schreiben. Wenn Sie "NULL" lassen, wird eine Fehlermeldung angezeigt. Für das Feld "Punktbestellung" können Sie Ihr "Bestellfeld" mit den Seriennummern (1,2,3, ...) verwenden. Stellen Sie sicher, dass dies ein numerisches Feld ist! Wie auch immer, wenn Sie immer noch Probleme haben, veröffentlichen Sie Ihre Formdatei und ich werde es mit Ihrem Datum versuchen.
Anja

Vielen Dank. Ich habe versucht, sowohl Text- als auch Ganzzahlfelder für "Punktgruppenfeld" und Ganzzahlen für das "Punktreihenfolgenfeld" in Kombination mit verschiedenen Werten (und Leerzeichen) für "Lückenperiode" ohne Erfolg zu verwenden. Im Anhang befindet sich die .shp, mit der ich getestet habe: drive.google.com/file/d/0B160CiiWCWKUbk9PbTF3dmpZYU0/…
Magnus

Ich habe es mit Ihrer Formdatei getestet und das Problem gefunden. Das "Punktreihenfolgefeld" kombiniert nur die Punkte mit demselben "Text" im Gruppenfeld. Ich habe der obigen Antwort einen Screenshot mit den Ergebnissen angehängt.
Anja

Ah, also muss ich jedem Punkt ein Feld mit demselben Text hinzufügen?
Magnus

5

Das MMQGISPlugin hat einen Menüeintrag Create -> Hub Lines. Dies sollte tun, was Sie wollen.

Es werden zwei Ebenen (Start und Ziel) benötigt, sodass Sie Ihre Punktebene möglicherweise zweimal zur Zeichenfläche hinzufügen müssen.


Perfekt, mein Test im kleinen Maßstab scheint zu funktionieren - ich brauche nur zwei verschiedene Attribute, ich habe ein Feld mit der Nummer und der Nummer + 1 erstellt und verwende diese für und von.
Magnus

4

Ein grundlegender Ansatz wäre:

  1. Erstellen Sie einen Vektorschreiber für ein neues Shapefile (siehe Kochbuch , Abschnitt "Schreiben von Vektorebenen", 2. Beispiel) als (Mehrfach-) Linie / Polygon oder was auch immer Sie benötigen (siehe Aufzählungen ).
  2. Laden Sie Ihre Punktebene von iface.legendInterface().layers()
  3. Durchlaufen Sie Ihre Punkte und fügen Sie das Geometrie- Feature in Ihre neue Form ein

€: nur zum Spaß:

from PyQt4.QtCore import *

# easy 2 config vars
myPath = "/media/ymirsson/MyData/GIS/tmp/"
myPts = "test_coords.shp"
myLines = "test_lines.shp"
sortField = "No"
myCRS = "25832"

# load the points layer
myPtsLayer = QgsVectorLayer(myPath + myPts, "My Points", "ogr")

# field def. 4 lines-layer
fields = QgsFields()
fields.append(QgsField("id", QVariant.Int))
fields.append(QgsField("name", QVariant.String))

# create writer
writer = QgsVectorFileWriter(myPath + myLines, "utf-8", fields, QGis.WKBLineString, QgsCoordinateReferenceSystem(int(myCRS), QgsCoordinateReferenceSystem.EpsgCrsId), "ESRI Shapefile")

if writer.hasError() == QgsVectorFileWriter.NoError:
    # featureobject to list
    features = myPtsLayer.getFeatures()
    Points=([])
    for feature in features:
        geom = feature.geometry().asPoint()
        sortID = feature.attributes()[myPtsLayer.fieldNameIndex(sortField)]
        Points.append([sortID,geom])
    Points.sort()

    # create lines
    for i in range(1,len(Points)):
        Line = QgsFeature()
        Line.setGeometry(QgsGeometry.fromPolyline([Points[i-1][1], Points[i][1]]))
        Line.setAttributes([i,str(Points[i-1][0]) + " to " + str(Points[i][0])])
        writer.addFeature(Line)
    # don't forget the last one -.-
    Line = QgsFeature()
    Line.setGeometry(QgsGeometry.fromPolyline([Points[len(Points)-1][1], Points[0][1]]))
    Line.setAttributes([len(Points),str(Points[len(Points)-1][0]) + " to " + str(Points[0][0])])
    writer.addFeature(Line)

# flush 2 disk
del writer

# load both layers into qgis-project
QgsMapLayerRegistry.instance().addMapLayer(myPtsLayer)
QgsMapLayerRegistry.instance().addMapLayer(QgsVectorLayer(myPath + myLines, "My Lines", "ogr"))

print "Done .. "

Entschuldigung - ich bin kein fortgeschrittener Benutzer und Sie haben mich im ersten Schritt verloren. Könnten Sie einen einfacheren Ansatz ausarbeiten oder vorschlagen?
Magnus

Ich sehe, Sie haben eine einfachere Lösung - aber ich habe Ihnen ein kleines Skript geschrieben .. just4fun;)
Ymirsson
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.