Tạo một lớp dòng liên kết nhiều điểm trong lớp với một điểm trong lớp khác?


9

Giả sử có điểm A với 300 điểm và lớp B điểm với một điểm

Làm cách nào để tạo một lớp đường nối tất cả các điểm trong lớp A với một điểm trong lớp B?

Sử dụng QGIS và / hoặc PostGIS.


hãy thử sử dụng các chức năng st_makeline
Ziggy

@ziggy đã cố gắng làm điều đó nhưng tài liệu không rõ ràng và không có ví dụ nào về hình học từ các bảng khác nhau
Luffydude

ive bao giờ sử dụng chức năng này nhưng tôi sẽ tưởng tượng nó sẽ là một cái gì đó như thế này: chọn t1.columns vv, t2.columns vv .. st_makeline (t1.geom, t2.geom) từ t1, t2
Ziggy

@ziggy nhận được lỗi cú pháp trên ngoặc khi tôi thử chọn id, geom là st_makeline (a.geom, b.geom),
Luffydude

gửi toàn bộ truy vấn của bạn
ngoằn ngoèo

Câu trả lời:


4

Trong QGIS, bạn có thể sử dụng điểm Connect plugin mà bạn có thể tải về từ:

Plugins > Manage and Install Plugins...

Thí dụ:

  1. Dưới đây là một vài lớp, layer_Acó một loạt các điểm; layer_Bcó một. Đảm bảo rằng cả hai lớp đều chứa trường số nguyên trong đó các giá trị hoàn toàn giống nhau (ví dụ: cả hai lớp của tôi đều có idtrường chứa tất cả các giá trị 1). Plugin sử dụng điều này để kết nối các điểm của bạn. Khi plugin của bạn được bật, hãy chuyển đến cài đặt của nó:

    Giao diện


  1. Chọn các tùy chọn:

    Cài đặt


  1. Kết quả:

    Kết quả


Lưu ý rằng plugin này là thử nghiệm, do đó bạn sẽ cần bật Show also experimental pluginstùy chọn (nhờ @blue_chip ):

Plugins > Manage and Install Plugins > Settings

2
Không chắc tại sao bản chỉnh sửa của tôi bị xóa nhưng dù sao trong trường hợp bạn chưa đọc nó: wow các bạn có một số câu trả lời khá đa dạng ở đây. Một Python, một plugin và một Postgis. Đưa ra đánh dấu cho plugin một vì nó thân thiện với người dùng GIS nhất và cũng vì khuôn mặt cười. Cảm ơn tất cả!
Luffydude

@Luffydude - Chỉnh sửa của bạn có thể đã bị xóa vì nó không thêm nhiều vào câu hỏi chung của bạn nhưng bạn đã trả lời đúng, rất khác! :)
Joseph

1
Bạn cần kích hoạt các plugin thử nghiệm để tìm cái này. Tôi phải nhìn lâu hơn một chút cho đến khi nó chợt nhận ra tôi. Plugin> Cài đặt> Kiểm tra Hiển thị các plugin thử nghiệm
blue_chip

@blue_chip - Xin lỗi, tôi nên đề cập đến điều đó. Sẽ chỉnh sửa nó trong :)
Joseph

3

nếu cả hai lớp của bạn đều là điểm thì truy vấn bên dưới sẽ hoạt động, chỉ cần cắm dữ liệu của riêng bạn. Tôi đã thực hiện một thử nghiệm với việc tạo các dòng từ 1 lớp với hơn 150 hàng điểm và một lớp có 1 điểm

drop table if exists line;
create table line as
select layer1.id ,st_makeline(layer1.geom,point.geom) as geom from layer1,point

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


3

Giả sử bắt đầu từ tình huống này (một lớp điểm với một tính năng và một lớp điểm với 300 tính năng):

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

bạn có thể chạy mã này từ Bảng điều khiển Python (sau khi đã tải hai lớp quan tâm trong QGIS):

from qgis.core import *
from qgis.PyQt.QtCore import QVariant

layer1 = QgsMapLayerRegistry.instance().mapLayersByName('1point')[0]
crs = layer1.crs().toWkt()
layer2 = QgsMapLayerRegistry.instance().mapLayersByName('300points')[0]

outLayer = QgsVectorLayer('Linestring?crs='+ crs, 'line_output' , 'memory')
prov = outLayer.dataProvider()
fields = layer1.pendingFields()
for field in layer2.pendingFields():
    fields.append(field)
prov.addAttributes(fields)
outLayer.updateFields()

for feature in layer1.getFeatures():
    coords = feature.geometry().asPoint()
    attr1 = feature.attributes()

    for feat in layer2.getFeatures():
        seg_start = coords
        seg_end = feat.geometry().asPoint()
        attr2 = feat.attributes()
        attrs = attr1 + attr2
        outGeom = QgsFeature()
        outGeom.setGeometry(QgsGeometry.fromPolyline([seg_start, seg_end]))
        outGeom.setAttributes(attrs)
        prov.addFeatures([outGeom])

QgsMapLayerRegistry.instance().addMapLayer(outLayer)

để có được kết quả này:

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

Bạn chỉ cần điều chỉnh tên của các lớp ( '1point''300points') thành tên mà chúng được tải trong Bảng điều khiển Lớp .

Cách tiếp cận của tôi sẽ hoạt động độc lập với số lượng tính năng trong cả hai lớp.

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.