Çokgenler arasındaki akışları (bağlantılar + değerler) aktarma


14

QGIS'de hücreler ve bir ek katman arasındaki hareketli verileri temsil eden iki şekil dosyası vardır, aşağıdaki resme bakın

Example_of_shapefiles


Verileri tanımlayan taşıma:

  • Çokgen "LayerA"(kırmızı anahat şeffaf kareler). Ayrıca, "LayerA"jeosentroidlerin konumu üzerinde görselleştirilen, hücreler içindeki hareketleri temsil eden daireler ile de ilgilidir .

    LayerA_AT

  • Polyline katmanı "Flows"(sarı / gri oklar), "LayerA"özelliklerin jeocentroidleri arasındaki bağlantılar aracılığıyla değerleri iletir

    Flows_AT


Hedef katman:

  • Çokgen "LayerB"(koyu gri çerçeveli açık leylak özellikleri).

    LayerB_AT

Ayrıca, ben zaten aktardıktan "FLUX"gelen hücrelerin içinde hareket değerleri ve "LayerA"içine "LayerB"çokgen, benim önceki soru bkz: QGIS çokgen arasındaki Kalıtsal değerler? . Bu kullanılarak yapıldı %ait $areahesaplanması.


Aktarılması anlamlı çözüm / yaklaşım da olabilir / verici / dönüştürme akış bağlantıları ile temsil "Flows"ilişkilerinden ve değerlerini "LayerA"ilişkilerine doğru "LayerB".

Bu bağlantıları çoklu hat olarak nasıl başarabilirim?

Ek olarak, yeni akışlar benzer bir stili miras alacaktır "Flows".

İstek üzerine, verilerin bir örneğini sağlayabilirim.

Akışlar özellikleri arasında değil var olacak "LayerA", fakat özellikleri arasında "LayerB" . Ana amaç, tablo / Köken-Hedef Matrisi olarak olası "FLUX"bağlantılar arasındaki özniteliği (yani / den) elde etmektir "LayerB".


Uyulması gereken bazı gereksinimler / kriterler vardır:

1. Aynı hücredeki özelliklerin parçaları (sarı ile seçilen) arasında akış bağlantısı yok

condition_1

2. Parçaları farklı hücrelerde olsa bile aynı özellik arasında bağlantı yoktur.

condition_2

3. Tamamen iki farklı hücre özelliği içindeyse , özelliklerin bölümleri "LayerB"( "Union"çıktıya dayalı ) arasında bağlantılar vardır"LayerA"

condition_3

4."FLUX" İletilen yeni değer, aşağıdaki resimde gösterildiği gibi hesaplanacaktır.

Örneğin, iki hücre Ive IInerede "FLUX"olduğu arasında bir bağlantı vardır 100. Diğer değerleri varsayarsak, "NEW_FLUX"aralarında A've B''etrafında olacaktır 1.5625. 100sadece tek bir örnektir.

condition_4


Referanslar:


1
Düzenleme için teşekkürler, anlamaya başladım ama çok emin değilim. Beklenen sonucu eklemek için orijinal yayınınızı bir kez daha düzenleyebilir misiniz? (örneğin: Aşağıdaki alanlarla poligon_b sentroidleri arasındaki çizgi katmanı: - "field1": açıklama, denenen veriler vb.)
J. Monticolo

1
Açıklığa kavuşturmak için, bu GSE sohbet odasında daha özgürce tartışabilir miyiz: chat.stackexchange.com/rooms/92038/… ?
J. Monticolo

1
Teknik açıdan her şey yapılabilir, ama aslında ne elde etmeye çalışıyorsunuz? Bana öyle geliyor ki, verileri genel bir tablodan daha ince taneli bir coğrafyaya enterpolasyon yapmaya çalışıyorsunuz. Eğer yanlış anlamazsam, bu çok yanıltıcı sonuçlara yol açabilir. "B katmanı" düzeyindeki akışlarla ilgili verileriniz yoksa, bunları hiçbir matematik hilesi yeniden oluşturamaz. Bu, piksel seviyesi altında yakınlaştırmaya eşdeğerdir ve yanlış bir polis videosunda düşük çözünürlüklü bir resim kullanarak 3D döndürme yapar.
MarHoff

Yanıtlar:


4

Sanal Katmanlar ile teorik olarak mümkündür (şekil dosyaları ile işlem çok uzun olacaktır, ancak katmanlar bir Uzamsal Veritabanındaysa, bence çok daha hızlıdır).

İşte kod:

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

Grafiksel çıktı

Çıktı

Sonuç manuel olarak test edildi. "FLUX"Değerler arasındaki fark ihmal edilebilir düzeydedir.

Son çıktı stilleri miras alır "Flow"ve

Output_Final

Birkaç veri ile test etmenizi öneririm ve büyük veri kümeleri için çok uzun sürerse, sorguları adım adım ( "inter_ab", "new_flux") yürütün ve sonucu kaydedin ve sonraki sorguyu yürütün.


1
Üzgünüm, Fransızım ve Polygon_bkatman olarak açık bir Fransız ilçe veritabanı kullanıyorum ve bu anahtar alan id_geofla. Düzeltmeyi yaptım.
J. Monticolo

1
Açıklamalar ekledim, umarım yardımcı olur.
J. Monticolo

1
Evet, çokgenlere sahip olmak doğru. Bir akış bir bağlantı yaparsa tüm polygon_b katmanları ve polygon_a . ** değeri ** için düzeltmeler yaptım . Benim için, sonuç bir çizgi tabakası, ancak doğrudan değil polygon_b ile katman polygon_a tarafından ithal değere akış tabakasına.
J. Monticolo

4

Üç katman arasında birleştirme yapabilir ve ardından toplayabilirsiniz layerB. Sanal katmanlar kullanılabilir. Önemli verilerin katman layerAveya flowkatman içinde olup olmadığından emin değilim .. İşte (denenmemiş) bir olasılık:

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

Çalıştığı bu çözümü denedim. Önemli veriler "Flows".
Taras

@Taras Harika! Ayrıca, sum(f.flow_var)hattasum(fl.flow_var * a.poly_var)
JGH
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.