Lưu ý: Hiện tại đã có plugin QGIS QChainage
. Nó làm tất cả điều này và nhiều hơn nữa. Mã dưới đây đã lỗi thời với QGIS 2.0 trở lên.
Đây là một số mã Python mà bạn có thể dán vào một tệp và sử dụng bên trong QGIS:
QGIS có một phương thức trong API để thực hiện tham chiếu lớp lót tuy nhiên tôi không thể làm cho nó hoạt động chính xác, nhưng tôi sẽ liên hệ với tác giả của mã và xem liệu tôi có làm gì sai không.
Còn bây giờ, bạn sẽ cần sự quyến rũ thư viện Python, mà bạn nên cài đặt anyway vì nó tiện dụng để có xung quanh. Nó cũng có tài liệu tuyệt vời tại http://toblerity.github.com/shapely/manual.html
Đây là phần tôi đang sử dụng trong ví dụ sau http://toblerity.github.com/shapely/manual.html#interoperation .
Hầu hết các mã sau đây là mã soạn sẵn của QGIS chỉ tạo các tính năng, các lớp, chuyển đổi từ wkb và wkt và trở lại. Bit cốt lõi là bit point = line.interpolate(currentdistance)
trả về một điểm ở khoảng cách dọc theo đường thẳng. Chúng tôi chỉ gói cái này trong một vòng lặp cho đến khi hết dòng.
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)
Sao chép và dán mã ở trên vào tệp, tôi đã gọi hàm locine của tôi, trong ~./qgis/python
thư mục (vì nó nằm trong đường dẫn Python) và chỉ cần thực hiện việc này trong bảng điều khiển Python bên trong QGIS.
import locate
locate.pointsAlongLine(30)
Điều đó sẽ tạo ra một lớp điểm mới với các điểm ở mỗi 30 mét dọc theo các đường đã chọn, như vậy:
Lưu ý: Mã khá thô và có thể cần phải dọn sạch.
EDIT: Bản dựng devISIS mới nhất hiện có thể thực hiện điều này một cách tự nhiên.
Thay đổi vòng lặp while createPointsAt
thành:
while currentdistance < length:
point = geom.interpolate(distance)
fet = QgsFeature()
fet.setAttributeMap( { 0 : currentdistance } )
fet.setGeometry(point)
feats.append(fet)
currentdistance = currentdistance + distance
và bạn có thể loại bỏ
from shapely.wkb import loads
from shapely.wkt import dumps