Mentransfer aliran (koneksi + nilai) antara poligon

14

Dalam QGIS ada dua shapefile yang mewakili data bergerak antara sel dan satu lapisan tambahan, lihat gambar di bawah ini

Example_of_shapefiles


Memindahkan data yang didefinisikan oleh:

  • Poligon "LayerA"(kotak transparan dengan garis merah). Selain itu juga berhubungan dengan lingkaran yang mewakili gerakan di dalam sel, divisualisasikan pada posisi "LayerA"geocentroid.

    LayerA_AT

  • Lapisan polyline "Flows"(panah kuning / abu-abu), menyampaikan nilai melalui koneksi antara "LayerA"fitur geocentroid

    Flows_AT


Lapisan target:

  • Polygon "LayerB"(fitur ungu muda dengan garis abu-abu gelap).

    LayerB_AT

Selain itu, saya telah mentransfer "FLUX"dan memindahkan nilai dalam sel dari "LayerA"ke dalam "LayerB"poligon, lihat pertanyaan saya sebelumnya: Nilai yang diwariskan antara poligon di QGIS? . Itu dilakukan menggunakan% dari $areaperhitungan.


Mungkin ada solusi / pendekatan yang berarti untuk mentransfer / mentransmisikan / mengubah koneksi aliran yang diwakili oleh"Flows" dan nilai-nilainya dari hubungan "LayerA"ke dalam hubungan "LayerB".

Bagaimana saya bisa mencapai koneksi tersebut sebagai polyline?

Selain itu, aliran baru akan mewarisi gaya yang mirip dengan "Flows" .

Dengan permintaan, saya dapat memberikan sampel data.

Aliran tidak akan ada antara fitur "LayerA", tetapi antara fitur "LayerB" . Tujuan utamanya adalah untuk mencapai atribut "FLUX"(yaitu dari / ke) untuk koneksi antara "LayerB"kemungkinan sebagai tabel / Asal-Tujuan Matriks.


Ada beberapa persyaratan / kriteria yang harus dipatuhi:

1. Tidak ada koneksi aliran antara bagian fitur (dipilih dengan warna kuning) di sel yang sama

condition_1

2. Tidak ada koneksi antara fitur yang sama bahkan bagian-bagiannya ada di sel yang berbeda

condition_2

3. Koneksi ada di antara bagian-bagian fitur "LayerB"(berdasarkan "Union"output) jika mereka sepenuhnya dalam dua "LayerA"fitur sel yang berbeda

condition_3

4. Baru"FLUX" yang disampaikan, akan dihitung seperti yang ditunjukkan pada gambar di bawah ini.

Misalnya, ada hubungan antara dua sel Idan II, di mana "FLUX"ada 100. Dengan asumsi nilai-nilai lain, "NEW_FLUX"antara A'dan B''akan ada 1.5625. 100hanya satu contoh.

condition_4


Referensi:

Taras
sumber
1
Terima kasih atas hasil editnya, saya mulai mengerti tetapi tidak begitu yakin. Bisakah Anda mengedit posting asli Anda sekali lagi untuk menambahkan hasil yang diharapkan? (misalnya: Garis lapisan antara centroid polygon_b dengan bidang di bawah ini: - "field1": penjelasan, data yang dicoba, dll.)
J. Monticolo
1
Untuk memperjelas, bisakah kita berdiskusi lebih bebas di ruang obrolan GSE ini: chat.stackexchange.com/rooms/92038/… ?
J. Monticolo
1
Dari sudut pandang teknis semuanya bisa dilakukan, tetapi apa yang sebenarnya ingin Anda capai? Menurut saya, Anda mencoba menyisipkan data dari kisi generalisasi ke geografi berbutir lebih halus. Kecuali jika saya salah, ini dapat menyebabkan hasil yang sangat menyesatkan. Jika Anda tidak memiliki data tentang aliran di tingkat "lapisan B", tidak ada tipu daya matematika yang dapat membuatnya kembali. Ini setara dengan memperbesar di bawah tingkat piksel dan melakukan rotasi 3D menggunakan gambar resolusi rendah dalam film polisi yang tidak akurat.
MarHoff

Jawaban:

4

Dengan Virtual Layers, secara teoritis, itu mungkin (dengan shapefile, prosesnya akan ekstra panjang, tetapi jika lapisannya ada dalam Database Spasial, saya pikir ini jauh lebih cepat).

Berikut kodenya:

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

Output grafis akan terlihat seperti

Keluaran

Hasilnya diuji secara manual. Perbedaan "FLUX"nilai diabaikan.

Hasil akhir akan mewarisi gaya dari "Flow"dan terlihat seperti

Output_Final

Saya merekomendasikan untuk mengujinya dengan beberapa data, dan jika terlalu lama untuk set data yang besar, jalankan langkah demi langkah kueri ( "inter_ab", "new_flux") dan simpan hasilnya dan jalankan kueri berikutnya.

J. Monticolo
sumber
1
Maaf, saya orang Prancis dan saya menggunakan basis data kota perancis terbuka sebagai Polygon_blapisan, dan bidang utamanya adalah id_geofla. Saya melakukan koreksi.
J. Monticolo
1
Saya telah menambahkan penjelasan, semoga membantu.
J. Monticolo
1
Ya itu benar memiliki poligon. Saya telah membuat koreksi untuk memiliki seluruh polygon_b lapisan dan polygon_a . ** nilai ** jika aliran membuat sambungan. Bagi saya, hasilnya bukan lapisan garis, tetapi langsung lapisan polygon_b dengan nilai polygon_a diimpor oleh lapisan aliran .
J. Monticolo
4

Anda bisa melakukan gabungan antara tiga lapisan, lalu digabungkan dengan layerB. Lapisan virtual kemungkinan dapat digunakan. Saya tidak yakin apakah data penting ada di layerAatau di dalam flowlapisan .. Berikut ini adalah kemungkinan (yang belum diuji):

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
JGH
sumber
Saya sudah mencoba solusi ini berhasil. Data penting ada di "Flows".
Taras
@Tara Hebat! Anda juga dapat menggunakan agregat seperti sum(f.flow_var)atau bahkansum(fl.flow_var * a.poly_var)
JGH