ポリゴン間のフロー(接続+値)の転送


14

QGISには、セルと1つの追加レイヤーの間の移動データを表す2つのシェープファイルがあります。下の画像を参照してください

シェープファイルの例


以下によって定義されたデータの移動:

  • ポリゴン"LayerA"(赤い輪郭の透明な正方形)。それに加えて、細胞内の動きを表す円にも関連し、"LayerA"ジオセントロイドます。

    LayerA_AT

  • ポリラインレイヤー"Flows"(黄色/灰色の矢印)、"LayerA"フィーチャのジオセントロイド間の接続を介して値を伝えます

    Flows_AT


ターゲット層:

  • ポリゴン"LayerB"(濃い灰色の輪郭の明るい薄紫色の特徴)。

    LayerB_AT

さらに、"FLUX"セル内の値"LayerA""LayerB"ポリゴンから既に移動し、移動しています。前の質問「QGISのポリゴン間で値を継承しますか?」を参照してください。これは、使用して行った%$area計算を。


フロー接続を転送/送信/変換する有意義なソリューション/アプローチがあるかもしれません によって表される"Flows"とその関係からの関係"LayerA"へのその値"LayerB"

これらの接続をポリラインとしてどのように実現できますか?

さらに、新しいフローは同様のスタイルを継承します "Flows"ます。

リクエストにより、データのサンプルを提供できます。

フローはないの機能の間に存在します"LayerA"が、の特徴間 "LayerB"。主な目的は"FLUX""LayerB"可能なテーブル/オリジン-宛先マトリックス間の接続の属性(from / to)を達成することです。


いくつかの要件/基準があります遵守すべき。

1.同じセル内のフィーチャのパーツ(黄色で選択)間にフロー接続がありません

condition_1

2.部品が異なるセルにある場合でも、同じ機能間に接続はありません

condition_2

3.フィーチャの部分が完全に2つの異なるセルフィーチャ内にある場合、フィーチャの部分間に接続が存在します"LayerB""Union"出力に基づく)"LayerA"

condition_3

4."FLUX"伝達している新しい値は、以下の画像に示すように計算されます。

たとえば、2つのセルIとの間に接続II"FLUX"あり100ます。他の値を仮定すると、"NEW_FLUX"A'とは、B''周りになります1.5625100ただ一つの例です。

condition_4


参照:


1
編集のおかげで、理解し始めましたが、よくわかりません。元の投稿をもう一度編集して、期待される結果を追加できますか?(例:以下のこのフィールドを持つpolygon_b重心間のラインレイヤー:-"field1":説明、試行されたデータなど)
J.モンティコロ

1
明確にするために、このGSEチャットルームchat.stackexchange.com/rooms/92038/…でもっと自由に議論できますか?
J.モンティコロ

1
技術的な観点からはすべてが実行可能ですが、実際に何を達成しようとしていますか?一般化グリッドからよりきめの細かい地理にデータを補間しようとしているように思えます。誤解しない限り、これは非常に誤解を招く結果につながる可能性があります。「レイヤーB」レベルのフローに関するデータがない場合、数学的なトリックはそれらを再作成できません。これは、ピクセルレベルでズームし、不正確な警官ムービーの低解像度画像を使用して3D回転を行うのと同じです。
MarHoff

回答:


4

理論的には、仮想レイヤーを使用すると可能です(シェープファイルを使用すると、プロセスが非常に長くなりますが、レイヤーが空間データベース内にある場合は、はるかに高速です)。

ここにコード:

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

グラフィカル出力は次のようになります

出力

結果は手動でテストされました。の違い"FLUX"値は無視できます。

最終的な出力は、スタイルを継承し"Flow"、次のようになります

Output_Final

少数のデータでテストすることをお勧めします。大きなデータセットに時間がかかりすぎる場合は、クエリを段階的に実行し("inter_ab""new_flux")、結果を保存して次のクエリを実行します。


1
申し訳ありませんが、私はフランス人であり、オープンフランスタウンシップデータベースをPolygon_bレイヤーとして使用していますid_geofla。キーフィールドはです。修正しました。
J.モンティコロ

1
説明を追加しましたが、それが役に立てば幸いです。
J. Monticolo

1
はい、ポリゴンを持つのは正しいです。フローが接続を確立する場合、polygon_bレイヤーとpolygon_a。** value ** 全体を修正しました。私にとっては、結果は、配線層が、直接ではありませんpolygon_b有する層polygon_aのでインポートした値フロー層。
J.モンティコロ

4

3つのレイヤーを結合してから、で集約できますlayerB。仮想層が使用される可能性があります。重要なデータがレイヤー内にあるのlayerAflowレイヤー内にあるのかはわかりません。

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

私はそれが機能するこのソリューションを試しました。重要なデータはにあり"Flows"ます。
タラス

@Taras素晴らしい!sum(f.flow_var)または次のような集約を使用することもできますsum(fl.flow_var * a.poly_var)
JGH
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.