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

Magnus
quelle

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

anja
quelle
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.

AndreJ
quelle
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 .. "
Ymirsson
quelle
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