Chuyển luồng (kết nối + giá trị) giữa các đa giác


14

Trong QGIS có hai shapefile biểu thị dữ liệu di chuyển giữa các ô và một lớp bổ sung, xem hình ảnh bên dưới

Ví dụ_of_shapefiles


Di chuyển dữ liệu được xác định bởi:

  • Đa giác "LayerA"(hình vuông trong suốt có viền đỏ). Bên cạnh đó, nó cũng liên quan đến các vòng tròn đại diện cho các chuyển động trong các tế bào, được hình dung về vị trí của "LayerA"geocroids.

    LớpA_AT

  • Lớp polyline "Flows"(mũi tên màu vàng / xám), truyền tải các giá trị thông qua các kết nối giữa các "LayerA"tính năng địa tâm

    Dòng chảy


Lớp mục tiêu:

  • Đa giác "LayerB"(tính năng màu hoa cà nhạt với viền màu xám đậm).

    LớpB_AT

Ngoài ra, tôi đã chuyển "FLUX"và chuyển các giá trị trong các ô từ "LayerA"thành "LayerB"đa giác, xem câu hỏi trước của tôi: Các giá trị được kế thừa giữa các đa giác trong QGIS? . Nó được thực hiện bằng cách sử dụng %các $areatính toán.


Có thể có một giải pháp / cách tiếp cận có ý nghĩa về chuyển / truyền / chuyển đổi các kết nối dòng được đại diện bởi "Flows"và các giá trị của nó từ quan hệ "LayerA"thành quan hệ "LayerB".

Làm thế nào tôi có thể đạt được những kết nối như polylines?

Ngoài ra, các luồng mới sẽ kế thừa một kiểu tương tự "Flows".

Theo yêu cầu, tôi có thể cung cấp một mẫu dữ liệu.

Dòng chảy sẽ tồn tại không phải giữa các tính năng của "LayerA", mà là giữa các tính năng của "LayerB" . Mục đích chính là để đạt được thuộc tính "FLUX"(tức là từ / đến) cho các kết nối giữa "LayerB"có thể như ma trận bảng / Xuất xứ-Điểm đến.


Có một số yêu cầu / tiêu chí cần được tôn trọng:

1. Không có kết nối luồng giữa các phần của tính năng (được chọn màu vàng) trong cùng một ô

điều kiện_1

2. Không có kết nối giữa cùng một tính năng, ngay cả các bộ phận của nó nằm trong các ô khác nhau

điều kiện_2

3. Kết nối tồn tại giữa các phần của tính năng "LayerB"(dựa trên "Union"đầu ra) nếu chúng hoàn toàn nằm trong hai "LayerA"tính năng ô riêng biệt

điều kiện_3

4. Giá"FLUX" trị mới đang truyền tải, sẽ được tính như thể hiện trên hình ảnh bên dưới.

Ví dụ, có một mối liên hệ giữa hai tế bào III, nơi "FLUX"100. Giả sử các giá trị khác, "NEW_FLUX"giữa A'B''sẽ xung quanh 1.5625. 100chỉ là một ví dụ duy nhất.

điều kiện_4


Người giới thiệu:


1
Cảm ơn đã chỉnh sửa, tôi bắt đầu hiểu nhưng không chắc lắm. Bạn có thể chỉnh sửa bài viết gốc của mình một lần nữa để thêm kết quả mong đợi không? (ví dụ: lớp ranh giới giữa centroids polygon_b với các lĩnh vực này dưới đây: - "field1": giải thích, dữ liệu ngay cố gắng, vv)
J. Monticolo

1
Để làm rõ, chúng ta có thể thảo luận tự do hơn về phòng trò chuyện GSE này không: chat.stackexchange.com/rooms/92038/iêu ?
J. Monticolo

1
Từ quan điểm kỹ thuật, mọi thứ đều có thể thực hiện được, nhưng bạn thực sự đang cố gắng đạt được điều gì? Dường như với tôi rằng bạn đang cố gắng nội suy dữ liệu từ lưới tổng quát đến địa lý chi tiết hơn. Trừ khi tôi hiểu sai về bạn, điều này có thể dẫn đến kết quả rất sai lệch. Nếu bạn không có dữ liệu về các luồng ở cấp độ "lớp B", thì không có thủ thuật toán học nào có thể tạo lại chúng. Nó tương đương với thu phóng dưới mức pixel và thực hiện xoay 3D bằng hình ảnh có độ phân giải thấp trong phim cảnh sát không chính xác.
MarHoff

Câu trả lời:


4

Về mặt lý thuyết, với các Lớp ảo, điều đó là có thể (với các shapefile, quá trình này sẽ kéo dài thêm, nhưng nếu các lớp nằm trong Cơ sở dữ liệu Không gian, tôi nghĩ rằng nó nhanh hơn rất nhiều).

Đây là mã:

WITH inter_ab AS ( 
--create intersection between LayerA and LayerB 
SELECT LayerA.id || '_' || LayerB.FLAECHEID AS id, 
LayerA.id AS id_a, 
ST_AREA(LayerA.geometry) AS area_a, 
LayerB.FLAECHEID AS id_b, 
ST_INTERSECTION(LayerB.geometry, LayerA.geometry) AS geom 
FROM LayerA, LayerB 
WHERE ST_INTERSECTION(layerB.geometry, layerA.geometry) IS NOT NULL 
),

--calculation of the new flux value 
new_flux AS (SELECT t1.id_b AS origine, 
t2.id_b AS dest, 
SUM(Flows.flux * ST_AREA(t1.geom) / t1.area_a * ST_AREA(t2.geom) / t2.area_a) AS value  
FROM inter_ab t1, inter_ab t2, flows 
-- no connection between the same feature 
WHERE t1.id <> t2.id 
-- rule 1 
AND t1.id_a <> t2.id_a 
-- rule 2 
AND t1.id_b <> t2.id_b 
-- get flow data 
AND flows.origine = t1.id_a 
AND flows.dest = t2.id_a 
GROUP BY t1.id_b, t2.id_b
)

--create flows between original layerB features
SELECT new_flux.origine,
new_flux.dest,
new_flux.value AS flux,
make_line(ST_CENTROID(t3.geometry), ST_CENTROID(t4.geometry)) AS geom --ST_MakeLine under postGIS
FROM LayerB t3,
LayerB t4,
new_flux
WHERE t3.FLAECHEID = new_flux.origine
AND t4.FLAECHEID = new_flux.dest

Đầu ra đồ họa sẽ trông như

Đầu ra

Kết quả đã được kiểm tra bằng tay. Sự khác biệt về "FLUX"giá trị là không thể bỏ qua.

Đầu ra cuối cùng sẽ kế thừa các kiểu từ "Flow"và trông giống như

Đầu ra

Tôi khuyên bạn nên kiểm tra nó với một vài dữ liệu và nếu mất quá nhiều thời gian cho các tập dữ liệu lớn, hãy thực hiện từng bước các truy vấn ( "inter_ab", "new_flux") và lưu kết quả và thực hiện truy vấn tiếp theo.


1
Xin lỗi, tôi là người Pháp và tôi sử dụng cơ sở dữ liệu thị trấn mở của Pháp làm Polygon_blớp và đó là lĩnh vực chính id_geofla. Tôi đã sửa chữa.
J. Monticolo

1
Tôi đã thêm giải thích, hy vọng rằng sẽ giúp.
J. Monticolo

1
Có chính xác của nó để có đa giác. Tôi đã thực hiện điều chỉnh cho có toàn bộ polygon_b lớp và polygon_a . ** giá trị ** nếu một dòng chảy tạo ra một kết nối. Đối với tôi, kết quả không phải là một lớp dòng, mà là lớp polygon_b trực tiếp với giá trị polygon_a được nhập bởi lớp dòng .
J. Monticolo

4

Bạn có thể thực hiện nối giữa ba lớp, sau đó tổng hợp theo layerB. Các lớp ảo có thể được sử dụng. Tôi không chắc liệu dữ liệu quan trọng nằm trong layerAhay trong flowlớp .. Đây là một khả năng (chưa được kiểm tra):

SELECT b.id, b.geometry, sum(a.myVar)
FROM layerB b
LEFT JOIN flow f
   ON ST_Intersects(ST_EndPoint(f.geometry),b.geometry)
 JOIN layerA a
   ON ST_Intersects(ST_StartPoint(f.geometry),a.geometry)
GROUP BY b.id

Tôi đã thử giải pháp này nó hoạt động. Các dữ liệu quan trọng là trong "Flows".
Taras

@Tara Tuyệt vời! Bạn cũng có thể sử dụng các tổng hợp như sum(f.flow_var)hoặc thậm chísum(fl.flow_var * a.poly_var)
JGH
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.