Relier des points par des lignes à l'aide de QGIS?

9

J'ai un fichier .shp, où je veux connecter tous les points (environ 100) par lignes. J'ai un champ de données avec la commande (ie 1, 2, 3, ...).

J'ai essayé PointConnector et Points2One, je les utilise peut-être mal, mais je ne peux obtenir aucun résultat.

Dans mes recherches, j'ai trouvé la mention du plugin pointe vers des chemins, mais cela semble avoir disparu?

J'utilise QGIS 2.6.1

Magnus
la source

Réponses:

8

Tout d'abord, vous pouvez toujours utiliser le plug-in PointsToPaths ( https://plugins.qgis.org/plugins/pointstopaths_v02/ ). Vous devez peut-être activer l'option "Afficher également les plugins expérimentaux" sous Plugins> Gérer et installer les plugins (Plugin Manager)> Paramètres.

Deuxièmement, assurez-vous que votre champ de données avec la commande a un type numérique (par exemple entier, ...)

J'ai essayé de créer des lignes à partir d'une forme de point avec ma version QGIS (2.0.1) et tout allait bien. Voici une capture d'écran:entrez la description de l'image ici

Peut-être que cela aide!

Capture d'écran avec les résultats de la forme test_coords: entrez la description de l'image ici

anja
la source
Merci - maintenant j'ai au moins trouvé et installé les PointsToPaths, mais aucune combinaison de champ de groupe de points et de champ d'ordre de point ne semble générer de données, quels champs sont nécessaires ici?
Magnus
Pour le "Champ de groupe de points", vous avez deux options: vous pouvez utiliser un champ existant ou vous pouvez créer un nouveau champ avec le calculateur de champ (type chaîne). Dans le cas où vous créez un nouveau champ, vous devez écrire un texte par défaut dans la colonne. Si vous le laissez "NULL", vous obtiendrez une erreur. Pour le "Champ de commande point", vous pouvez utiliser votre "champ de commande" avec les numéros de série (1,2,3, ...). Assurez-vous qu'il s'agit d'un champ numérique! Quoi qu'il en soit, si vous avez encore des problèmes, postez votre fichier de forme et je vais l'essayer avec votre datat.
anja
Je vous remercie. J'ai essayé d'utiliser à la fois du texte et des champs entiers pour "Champ de groupe de points" et des entiers pour le "Champ d'ordre de points" combinés avec différentes valeurs (et des blancs) de "Période d'espace" sans succès. Ci-joint le fichier .shp que j'ai testé avec: drive.google.com/file/d/0B160CiiWCWKUbk9PbTF3dmpZYU0/…
Magnus
Je l'ai testé avec votre fichier de forme et j'ai trouvé le problème. Le "champ Ordre des points" combine uniquement les points avec le même "texte" dans le champ de groupe. J'ai joint une capture d'écran avec les résultats à la réponse ci-dessus.
anja
Ah, donc je dois ajouter un champ avec le même texte à chaque point?
Magnus
5

Le MMQGISplugin a une entrée de menu Create -> Hub Lines. Cela devrait faire ce que vous voulez.

Il a besoin de deux couches (début et destination), vous devrez donc peut-être ajouter votre couche de points deux fois au canevas.

AndreJ
la source
Parfait, mon test à petite échelle semble fonctionner - j'ai juste besoin de deux attributs différents, j'ai créé un champ nombre et numéro + 1, et je les utilise de et vers.
Magnus
4

Une approche de base serait:

  1. créer un vecteur-écrivain pour un nouveau fichier de formes (voir Cookbook , Section "Écriture de couches vectorielles", 2ème exemple) en tant que (multi) ligne / polygone ou tout ce dont vous avez besoin (voir enums )
  2. chargez votre couche de points iface.legendInterface().layers()
  3. parcourir vos points et ajouter la fonction de géométrie dans votre nouvelle forme

€: juste pour le plaisir:

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
la source
Désolé - je ne suis pas un utilisateur avancé et vous m'avez perdu à la première étape. Pourriez-vous élaborer ou suggérer une approche plus simple?
Magnus
je vois que vous avez une solution plus simple - mais je vous ai écrit un petit script .. just4fun;)
ymirsson