Tạo các điểm trong khoảng cách được chỉ định dọc theo đường bằng cách sử dụng QGIS


20

Tôi muốn sử dụng các điểm tạo QGIS dọc theo đường, nhưng trong khoảng cách được chỉ định. Tôi tìm thấy hai công cụ GRASS trong SEXTANTE Toolbox

  • v.to.point
  • v. phán quyết

Tôi đã thử v.to.point , đặt khoảng cách tối đa giữa các điểm trong đơn vị bản đồ thành 100 và nhận được điều này

điểm dọc theo dòng

nhìn gần

Bức ảnh thứ hai cho thấy một cái nhìn cận cảnh từ phía trên. Kết quả là những gì tôi muốn, nhưng tôi muốn nhận được ít điểm hơn , nhưng ngay cả khi tôi đặt khoảng cách tối đa là 1000, hoặc 1000000, kết quả vẫn như vậy.

Tôi đã cố gắng sử dụng v.seribution , nhưng tôi không có tệp nào chứa quy tắc phân đoạn.

Underdark đã cho tôi một lời khuyên, và tôi đã thử Densify hình học cho một khoảng thời gian . Đầu tiên, nó cho tôi một shapefile polyline giống như tôi nhập vào, và sau đó tôi đã sử dụng các nút trích xuất để cố gắng có được những điểm đó. Nhưng kết quả vẫn giống như tôi đã sử dụng v.to.point , bất kể tôi đặt khoảng cách khoảng cách nào.

Làm cách nào tôi có thể tạo điểm dọc theo đường và trong khoảng cách đã chỉ định


4
Hãy xem cái này, cho chúng tôi biết nathanw.net/2012/08/05/ Khăn
Willy

Cảm ơn đã cho tôi lời khuyên hữu ích này! Nếu tôi muốn sử dụng tập lệnh của bạn, tôi có phải cài đặt python không? hoặc trong phiên bản mới QGIS 2.0, nó đã có chức năng này được xây dựng chưa?
Heinz

5
Hiện tại có một plugin cho điều này trong QGIS 2.0, được gọi là QChainage. Lấy plugin và cài đặt nó.
Willy

Lưu ý rằng hộp công cụ "Sextante" được gọi là "Đang xử lý" trong QGIS 2.2.0+ và các hình học Densify được cung cấp một khoảng "nằm trong menu Xử lýToolbox / QGISGeoalacticms / VectorGeometryTools. Lưu ý rằng điều này biểu thị hình học và không xóa gần hơn khoảng thời gian đã chọn.
Dave X

Điều này làm việc cho tôi: plugins.qgis.org/plugins/LocatePoints
Tactopoda

Câu trả lời:


20

Trong bảng điều khiển Python:

1) tạo một lớp lớp bộ nhớ (lớp hoàn chỉnh (không có thuộc tính) tại crea_mem_layer.py )

class Create_vlayer(object):
    '''creation of a virtual layer''' 
     def __init__(self,nom,type):
         self.type=type
         self.name = nom
         self.layer =  QgsVectorLayer(self.type, self.name , "memory")
         self.pr =self.layer.dataProvider() 
     def create_point(self,geometry):
         # add point to the layer
         self.seg = QgsFeature()
         self.seg.setGeometry(QgsGeometry.fromPoint(geometry))
         self.pr.addFeatures([self.seg])
         self.layer.updateExtents()
     @property
     def display_layer(self):
         #end of layer and display layer 
         QgsMapLayerRegistry.instance().addMapLayers([self.couche])

2) các hàm đại số vectơ (từ algèename_vect_PyQGIS.py )

import math 
def mag(point):
    # magnitude of a vector
    return math.sqrt(point.x()**2 + point.y()**2)
def diff(point2, point1):
    # substraction betwen two vector
    return QgsPoint(point2.x()-point1.x(), point2.y() - point1.y())
def length(point1,point2):
    # with PyQGIS: sqrDist
    return math.sqrt(point1.sqrDist(point2))

3) cosin hướng

def dircos(point):
    cosa = point.x() / mag(point)
    cosb = point.y()/ mag(point)
    return cosa,cosb

4) quá trình dòng hoặc phân đoạn dòng

def pairs(list):
    # list pairs iteration 
    for i in range(1, len(list)):
    yield list[i-1], list[i]

layer = qgis.utils.iface.activeLayer()
# interval between points
interval = 5 m
# create virtual layer
gen_pt  = Create_vlayer("mid5", "Point")

for elem in layer():
    line = elem.geometry()
    for seg_start, seg_end in pairs(line.asPolyline()):
       line_start = QgsPoint(seg_start)
       line_end = QgsPoint(seg_end)
       # mid point = vector coordinates [x2-x1,y2-y1]
       pointm =diff(line_end, line_start)
       # direction cosines of the segment
       cosa,cosb = dircos(pointm)
       # length of the segment
       lg = length(line_end, line_start)
       # generate and add points to the virtual layer 
       for i in range(interval,lg,interval):
           gen_pt.create_point(QgsPoint(line_start.x()  + (i * cosa), line_start.y() + (i*cosb)))

# display layer
gen_pt.display_layer

Các kết quả

đa tuyến, điểm tương đương với Shapely hoặc PyQGIS2, với các cosin hướng

đa tuyếntạo dángvéc tơ

Sau đó chỉ cần điều chỉnh khoảng


Từ việc nhìn vào đường giao nhau, có vẻ như nó giữ các điểm nút tồn tại trước trên đường thẳng, vì vậy nó không thể làm mỏng chúng thành độ phân giải nhỏ hơn các đỉnh đã có trên đường. Với các đường cong phức tạp như trong OP, các quy trình này có thể không có nhiều tác dụng.
Dave X

bạn hoàn toàn có thể điều chỉnh kịch bản
gen

17

Hiện tại có một plugin có tên QChainage thực hiện chính xác những gì bạn muốn. Bạn chỉ định một khoảng cách khoảng cách và plugin tạo các điểm dọc theo dòng của bạn tại khoảng thời gian được chỉ định.


* Lưu ý rằng điều này sẽ không chiếm được các nút dòng của bạn, vì vậy nếu bạn cần chúng, bạn cũng sẽ cần sử dụng công cụ hình học - trích xuất các nút và nối vào các điểm chuỗi của bạn.
Jason

1
Chào mừng bạn đến với GIS SE! Tôi nghĩ rằng thông tin mà bạn đã thêm vào đây dưới dạng Nhận xét sẽ được kết hợp tốt hơn vào Câu trả lời thực tế của bạn bằng cách sử dụng nút chỉnh sửa bên dưới thông tin đó. Bạn có thể làm điều này với Sao chép / Dán và xóa nhận xét của bạn bằng cách nhấp vào chữ thập nhỏ bên cạnh nó.
PolyGeo

11

Tôi đã viết một tập lệnh thay đổi công cụ hình học Sextante Densify để chấp nhận một khoảng cách nhất định. Nó được gọi là Densify hình học cho một khoảng .

Sau khi chạy Densify, bạn có thể trích xuất các điểm bằng công cụ Trích xuất nút .

Bạn có thể lấy nó từ Github và hướng dẫn cài đặt trên blog của tôi .

nhập mô tả hình ảnh ở đây


Nó xuất hiện công cụ này hiện có sẵn trong QGIS mà không cần cài đặt Sextante (QGIS 2.18.7). Tôi đã không nhìn thấy nó trong các menu, nhưng thấy nó là một thuật toán địa lý của QGIS trong khi tìm kiếm trong Hộp công cụ xử lý.
Nate Wanner

0

Nếu bạn không muốn sử dụng tập lệnh python, bạn chỉ cần cài đặt và sử dụng plugin "Hồ sơ từ dòng" và bỏ qua / xóa cột giá trị raster. Chuỗi sẽ là bất cứ điều gì bạn đặt khoảng thời gian lấy mẫu là.


Trong QGIS 2.2.0, tôi thấy một "Công cụ hồ sơ", "qProf" và "VoGIS-ProfilTool", nhưng không phải là công cụ "Hồ sơ từ dòng".
Dave X

0

Cũng không chắc đây có phải là bản phát hành ổn định hay không, nhưng trong hộp công cụ sextante trên 1.9 alpha trong Thuật toán địa lý-> Vector là tùy chọn "Chuyển đổi dòng thành điểm". Mặc dù vậy, nó cũng rất tuyệt nếu nó thêm một trường cho khoảng cách dọc theo đường.

Thật thú vị, nó đã thêm trường NAME từ lớp vector của tôi.

Tôi đã cố gắng để Python Script của Nathan Woodrow hoạt động, nhưng tôi mút với con trăn. Và với mã nói chung có vẻ như.


0

Tôi đã trải qua một thời gian dài vật lộn với vấn đề này, nhưng cuối cùng cũng nhận được ít nhiều những gì tôi đang tìm kiếm bằng cách sử dụng QChainage. Những gì tôi muốn chia sẻ là một cái gì đó có thể giúp đỡ người khác. Khi sử dụng công cụ hòa tan địa lý SAGA trên dòng, QChainage tạo ra kết quả không chính xác. Sử dụng một công cụ hòa tan khác nhau làm cho nó hoạt động tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.