Créer des points le long de la ligne en fonction des données d'attributs à l'aide de QGIS?

9

Je voudrais créer des points équidistants le long des lignes dans QGIS, mais chacune de mes lignes a un attribut du nombre de points qui devraient y figurer dans une colonne appelée "pièce" et ces valeurs sont différentes dans presque tous les cas.

entrez la description de l'image ici

Ma première pensée a été de diviser les lignes en morceaux égaux en fonction des valeurs du tableau d'attributs, puis de mettre des points sur les centroïdes des lignes, mais je n'ai pas pu le faire.

Cette question est très similaire à ce que j'aimerais faire, mais ce n'est pas pour QGIS:

Comment créer le même nombre de points le long de plusieurs polylignes?

La plupart des questions similaires que vous pouvez trouver ici à stackexchange dans cette rubrique concernent une distance spécifique entre les points, un nombre qui peut être facilement tapé dans un champ (comme dans le cas des algorithmes Créer des points le long des lignes ou Convertir les lignes en points ) et non sur des données spécifiques d'une table attributaire, que je n'ai pas pu trouver comment utiliser à de telles fins.

Ce serait fantastique s'il n'y avait pas de points au début et à la fin de la ligne, mais je serais juste au-dessus de la lune s'il y avait autant de points sur une ligne que dans sa table d'attributs.

Skye
la source

Réponses:

10

Voici un script PyQGIS rapide qui devrait faire l'affaire

from qgis.core import QgsFeature, QgsVectorFileWriter, QgsGeometry

def create_points(feat,writer):
    geometry = feat.constGeometry()
    if not geometry:
        return
    length = geometry.length()
    # -----------------
    # change 'num_points' to match your field name for the number of points field
    # -----------------
    num_points = feat['num_points']
    delta = length / ( num_points + 1.0 )
    distance = 0.0
    for i in range(num_points):
        distance += delta
        output_feature = QgsFeature(feat)
        output_feature.setGeometry( geometry.interpolate(distance) )
        writer.addFeature(output_feature)

layer = iface.activeLayer()

# ---------------
# change 'd:/test_points.shp' to desired output file name
# ---------------

writer = QgsVectorFileWriter('d:/test_points.shp',None, layer.fields(), QGis.WKBPoint, layer.crs())

for f in layer.getFeatures():
    create_points(f,writer)

del writer

Modifiez simplement le num_pointsnom du champ et le nom du fichier de sortie pour correspondre à vos données, sélectionnez la couche d'entrée et exécutez-la dans la console python.

ndawson
la source
Pour une raison quelconque, après avoir copié ce script, un message d'erreur apparaît: Fichier "<input>", ligne 1 longueur = geometry.length () ^ IndentationError: indentation inattendue
Skye
1
ndawson - J'ai édité le formatage pour qu'il soit plus facile de copier / coller dans la console python mais n'hésitez pas à revenir en arrière si vous ne l'aimez pas =). @Skye - Je suggérerais de copier le code dans un éditeur de texte, de changer le nom du champ et le chemin de sortie, puis de recopier le code dans la console python. Espérons qu'il ne devrait plus y avoir d'erreur d'indentation.
Joseph
1
Merci à vous deux !! :) ndawson, votre script est génial et @Joseph, votre mise en forme a été d'une grande aide! De plus, il s'est avéré que j'aurais dû utiliser la marque "/" au lieu de "\" sur le chemin de sortie.
Skye