Nota: Agora existe um plug-in QGIS QChainage
. Faz tudo isso e muito mais. O código abaixo está desatualizado com o QGIS 2.0 e superior.
Aqui está um código Python que você pode colar em um arquivo e usar dentro do QGIS:
O QGIS possui um método na API para fazer referência ao liner, no entanto, não consegui fazê-lo funcionar corretamente, mas vou entrar em contato com o autor do código e ver se estou fazendo algo errado.
Por enquanto, você precisará da bem tornada biblioteca Python, que você deve instalar de qualquer maneira, porque é útil ter por perto. Ele também possui excelente documentação em http://toblerity.github.com/shapely/manual.html
Esta é a seção que estou usando no exemplo a seguir http://toblerity.github.com/shapely/manual.html#interoperation .
A maior parte do código a seguir é do código padrão do QGIS, apenas criando os recursos, as camadas, convertendo de wkb e wkt e vice-versa. O bit principal é o point = line.interpolate(currentdistance)
que retorna um ponto à distância ao longo de uma linha. Nós apenas envolvemos isso em um loop até ficarmos sem linha.
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)
Copie e cole o código acima no arquivo, chamei meu localiz.py, no ~./qgis/python
diretório (porque está no caminho do Python) e faça isso no console do Python dentro do QGIS.
import locate
locate.pointsAlongLine(30)
Isso criará uma nova camada de pontos com pontos a cada 30 metros, ao longo das linhas selecionadas, da seguinte forma:
Nota: O código é bastante difícil e pode precisar de uma limpeza.
EDIT: A última versão do desenvolvedor do QGIS agora pode fazer isso de forma nativa.
Altere o loop while createPointsAt
para:
while currentdistance < length:
point = geom.interpolate(distance)
fet = QgsFeature()
fet.setAttributeMap( { 0 : currentdistance } )
fet.setGeometry(point)
feats.append(fet)
currentdistance = currentdistance + distance
e você pode remover o
from shapely.wkb import loads
from shapely.wkt import dumps