Remarque: Il existe maintenant un plugin QGIS QChainage
. Il fait tout cela et plus encore. Le code ci-dessous est obsolète avec QGIS 2.0 et supérieur.
Voici du code Python que vous pouvez coller dans un fichier et utiliser dans QGIS:
QGIS possède une méthode dans l'API pour faire le référencement de ligne, mais je n'ai pas pu le faire fonctionner correctement, mais je vais contacter l'auteur du code et voir si je faisais quelque chose de mal.
Pour l'instant, vous aurez besoin de la bibliothèque Python galbée , que vous devez installer de toute façon car elle est pratique à avoir autour. Il a également une excellente documentation sur http://toblerity.github.com/shapely/manual.html
Il s'agit de la section que j'utilise dans l'exemple suivant http://toblerity.github.com/shapely/manual.html#interoperation .
La plupart du code suivant est du code passe-partout QGIS créant simplement les fonctionnalités, les couches, la conversion de wkb et wkt et vice-versa. Le trépan est le point = line.interpolate(currentdistance)
qui renvoie un point à distance le long d'une ligne. Nous emballons simplement cela dans une boucle jusqu'à ce que nous manquions de ligne.
import qgis
from qgis.core import *
from PyQt4.QtCore import QVariant
from shapely.wkb import loads
from shapely.wkt import dumps
vl = None
pr = None
def createPointsAt(distance, geom):
if distance > geom.length():
print "No Way Man!"
return
length = geom.length()
currentdistance = distance
feats = []
while currentdistance < length:
line = loads(geom.asWkb())
point = line.interpolate(currentdistance)
fet = QgsFeature()
fet.setAttributeMap( { 0 : currentdistance } )
qgsgeom = QgsGeometry.fromWkt(dumps(point))
fet.setGeometry(qgsgeom)
feats.append(fet)
currentdistance = currentdistance + distance
pr.addFeatures(feats)
vl.updateExtents()
def pointsAlongLine(distance):
global vl
vl = QgsVectorLayer("Point", "distance nodes", "memory")
global pr
pr = vl.dataProvider()
pr.addAttributes( [ QgsField("distance", QVariant.Int) ] )
layer = qgis.utils.iface.mapCanvas().currentLayer()
for feature in layer.selectedFeatures():
geom = feature.geometry()
createPointsAt(distance, geom)
QgsMapLayerRegistry.instance().addMapLayer(vl)
Copiez et collez le code ci-dessus dans un fichier, j'ai appelé mon Locate.py, dans le ~./qgis/python
répertoire (car il se trouve dans le chemin Python) et faites-le dans la console Python à l'intérieur de QGIS.
import locate
locate.pointsAlongLine(30)
Cela créera une nouvelle couche de points avec des points tous les 30 mètres le long des lignes sélectionnées, comme ceci:
Remarque: Le code est assez approximatif et peut nécessiter un nettoyage.
EDIT: La dernière version de développement de QGIS peut maintenant le faire en mode natif.
Remplacez la boucle while par createPointsAt
:
while currentdistance < length:
point = geom.interpolate(distance)
fet = QgsFeature()
fet.setAttributeMap( { 0 : currentdistance } )
fet.setGeometry(point)
feats.append(fet)
currentdistance = currentdistance + distance
et vous pouvez supprimer le
from shapely.wkb import loads
from shapely.wkt import dumps