注意:现在有一个QGIS插件QChainage
。它可以做所有这些以及更多。以下代码在QGIS 2.0及更高版本中已过期。
这是一些Python代码,您可以将它们粘贴在文件中并在QGIS中使用:
QGIS的API中确实有一种方法可以进行线性引用,但是我无法使其正常工作,但是我将与代码作者联系,查看我是否做错了什么。
现在,您将需要造型优美的 Python库,无论如何都应该安装该库,因为它很容易携带。它还在http://toblerity.github.com/shapely/manual.html上提供了出色的文档。
这是我在以下示例中使用的部分http://toblerity.github.com/shapely/manual.html#interoperation。
以下大多数代码是QGIS样板代码,仅用于创建要素,图层,从wkb和wkt转换回来。核心位是point = line.interpolate(currentdistance)
沿直线返回一定距离的点。我们只是将其包装成一个循环,直到用完为止。
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)
将上面的代码复制并粘贴到目录中的文件我的locate.py中~./qgis/python
(因为它位于Python路径中),然后在QGIS的Python控制台中执行此操作。
import locate
locate.pointsAlongLine(30)
这将创建一个新的点层,沿着选定的线每30米处有一个点,如下所示:
注意:代码很粗糙,可能需要清理。
编辑:最新的QGIS开发人员版本现在可以本地执行此操作。
将while循环更改createPointsAt
为:
while currentdistance < length:
point = geom.interpolate(distance)
fet = QgsFeature()
fet.setAttributeMap( { 0 : currentdistance } )
fet.setGeometry(point)
feats.append(fet)
currentdistance = currentdistance + distance
您可以删除
from shapely.wkb import loads
from shapely.wkt import dumps