Sắp xếp nhiều điểm để xếp hàng trong QGIS?


11

Tôi muốn căn chỉnh nhiều điểm cho một dòng hoặc các dòng trong một lớp, sử dụng dung sai hoặc bộ đệm được chỉ định xung quanh các đối tượng dòng. Vui lòng tham khảo bản phác thảo mẫu đính kèm.

Vì lợi ích của ví dụ này, các điểm gần đường thẳng nhất trong hình TRƯỚC là trong 5 đơn vị bản đồ của đường, trong khi các điểm ngoài cùng cách xa hơn 10 đơn vị bản đồ. Tôi muốn chụp các điểm gần nhất vào đường gần nhất, sử dụng dung sai 5 đơn vị bản đồ để đạt được kết quả trong ảnh SAU.

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


Vì vậy, điểm cần phải là 0 đơn vị bản đồ về phía bên của đường, nhưng bạn có quan tâm đến điểm cuối cùng theo chiều dọc của đường đối với vị trí ban đầu của điểm không?
Joe

Kịch bản lý tưởng sẽ là di chuyển các điểm bằng đường vuông góc với đường thẳng. Tuy nhiên, ý định là sử dụng dung sai khá nhỏ. Nếu các điểm được di chuyển theo chiều dọc hoặc theo chiều dọc, về phía đường thẳng, nó sẽ không bù các điểm đó từ vị trí vuông góc thích hợp hơn.
Ed Camden

Không chắc đây có phải là cách tốt nhất không, nhưng một cách tôi có thể nghĩ đến là viết một số mã python để phân tích hai bộ dữ liệu và tạo ra một số tọa độ điểm. Nếu đây là những gì bạn nghĩ rằng bạn muốn, thì hãy cho tôi biết và tôi có thể cung cấp câu trả lời cho bạn. Ví dụ: đối với mọi điểm, nếu giá trị tuyệt đối của lat dist từ dòng <= 5 đơn vị, thì khoảng cách bên = 0. Bạn sẽ phải nhập thư viện gdal để chuyển đổi giá trị x, y thành coords. Xem ý kiến ​​trong: gis.stackexchange.com/questions/185445/ Kẻ
Joe

Với PyQGIS, nó có thể được tạo ra một lớp bộ nhớ trong đó các điểm được ngắt theo dung sai được coi là trước đây của 5 đơn vị bản đồ và đường đi vuông góc với đường thẳng. Xem câu trả lời của tôi.
xunilk

Câu trả lời:


15

Có một công cụ tích hợp để thực hiện việc này trong phiên bản QGIS 3.0 (chưa được phát hành). Bạn có thể nhận được một ảnh chụp nhanh hàng đêm từ trang web của QGIS để kiểm tra trước điều này.

Để làm điều này:

  1. Chạy thuật toán xử lý "Snap geometries to layer"
  2. Chọn lớp điểm của bạn làm "lớp đầu vào"
  3. Chọn lớp dòng là "lớp tham chiếu"
  4. Nhập dung sai phù hợp (khoảng cách tối đa để di chuyển điểm trong khi chụp)
  5. Thay đổi hành vi thành "Thích điểm gần nhất"

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

Đây là kết quả, hiển thị các điểm ban đầu là "x" và các điểm được ngắt là các chấm màu lục. Tôi đã sử dụng một dung sai ở đây để chỉ một số điểm đầu vào bị ngắt.

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


Đây chính xác là những gì tôi cần. Thật không may, chủ nhân của tôi chỉ cài đặt các phiên bản LTR của QGIS và tất cả chúng tôi đều bị hạn chế tải xuống và cài đặt các phiên bản thử nghiệm. (thở dài) Tôi đoán đó là vấn đề chờ đợi. Đây có phải là một chức năng tiêu chuẩn / được xây dựng hoặc một trình cắm thêm không?
Ed Camden

Chức năng tiêu chuẩn dựa trên các thay đổi trong các lớp c ++ - không có cách nào để sao chép thủ công này sang phiên bản cũ hơn. Bạn có khả năng có thể thử cài đặt bằng OSGEO4W trên một máy khác, sau đó sao chép thư mục osgeo4w vào thẻ nhớ USB để chạy trên máy trạm của bạn. Tôi đã có may mắn với cách tiếp cận đó trong quá khứ.
ndawson

1
Đối với phiên bản cũ, hãy xem plugin này. docs.qgis.org/2.14/en/docs/user_manual/plugins/iêu
iRfAn

có vẻ như plugin không hỗ trợ các lớp của điểm.
Mykola Kozyr

7

Điều này có thể được cung cấp với PyQGIS . Đối với tình huống tiếp theo:

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

mã sau, xem xét dung sai của 5 đơn vị bản đồ, đã được chạy tại Bảng điều khiển Python của QGIS:

from math import sqrt

registry = QgsMapLayerRegistry.instance()

points = registry.mapLayersByName('points')
line = registry.mapLayersByName('line')

feat_points = [ feat for feat in points[0].getFeatures() ]
feat_line = line[0].getFeatures().next()

new_points = []

for feat in feat_points:
    pt = feat.geometry().asPoint()
    sqrdist, point, vertex = feat_line.geometry().closestSegmentWithContext(pt)
    if sqrt(sqrdist) <= 5:
        new_points.append(point)
    else:
        new_points.append(pt)

epsg = points[0].crs().postgisSrid()

uri = "Point?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"

mem_layer = QgsVectorLayer(uri,
                           'new_points',
                           'memory')

prov = mem_layer.dataProvider()

feats = [ QgsFeature() for i in range(len(new_points)) ]

for i, feat in enumerate(feats):
    feat.setAttributes([i])
    feat.setGeometry(QgsGeometry.fromPoint(new_points[i]))

prov.addFeatures(feats)

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

Nó được tạo ra một lớp bộ nhớ trong đó các điểm được chụp theo dung sai được coi là trước đây của 5 đơn vị bản đồ và đường đi vuông góc với đường thẳng.

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


2

Bạn cũng có thể thực hiện việc này trong Máy tính trường với plugin refFifts. Bạn có thể sử dụng Máy tính trường để cập nhật hình dạng lớp cũng như các trường. refFifts cung cấp cho bạn hàm "geomdistance" để tìm dòng gần nhất trong một khoảng cách nhất định (hoặc "geomgầnest" nếu bạn không muốn có ngưỡng) và sẽ trả về một thuộc tính hoặc hình học, và hàm "near_point" sẽ tìm thấy gần nhất điểm trên một hình học nhất định. Chuỗi chúng lại với nhau như vậy để tính toán hình học mới cho lớp điểm của bạn:

closest_point(geom_from_wkt(geomdistance('snap_lines','$geometry',10)) , $geometry)

Thay vì trực tiếp cập nhật hình học, bạn có thể tính toán một trường với hình dạng được chụp thay thế. Tôi lưu trữ nhiều hình học để chụp các điểm cống vào các lớp luồng khác nhau và tôi có thể dễ dàng cập nhật hình dạng điểm trong Máy tính Trường tùy thuộc vào dòng dòng tôi cần sử dụng.

Có một số hạn chế với điều này, cả hai lớp cần phải là cùng một CRS và chức năng phân tích địa lý sẽ gây ra lỗi nếu bạn có hơn 100.000 điểm nhưng bạn có thể thay đổi giới hạn này nếu bạn chỉnh sửa tệp plugin refFifts.

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.