注:現在、QGISプラグインがありますQChainage
。これ以上のことをすべて行います。以下のコードはQGIS 2.0以降では古くなっています。
ファイルに貼り付けてQGIS内で使用できるPythonコードを次に示します。
QGISには、APIにライナーリファレンスを実行するメソッドがありますが、正しく動作させることができませんでしたが、コードの作成者に連絡して、何か間違っているのかどうかを確認します。
とりあえず、便利な Pythonライブラリをインストールする必要があります。また、http://toblerity.github.com/shapely/manual.htmlにすばらしいドキュメントがあります。
これは、次の例http://toblerity.github.com/shapely/manual.html#interoperationで使用しているセクションです。
次のコードのほとんどは、フィーチャ、レイヤーを作成し、wkbとwktから変換するだけのQGIS定型コードです。コアビットは、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)
上記のコードをコピーしてファイルに貼り付け、~./qgis/python
ディレクトリ内のLocate.pyを呼び出し(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