การโอนกระแส (การเชื่อมต่อ + ค่า) ระหว่างรูปหลายเหลี่ยม


14

ใน QGIS มีสองรูปร่างไฟล์ที่แสดงถึงข้อมูลเคลื่อนไหวระหว่างเซลล์และอีกหนึ่งเลเยอร์เพิ่มเติมดูที่ภาพด้านล่าง

Example_of_shapefiles


การย้ายข้อมูลที่กำหนดโดย:

  • รูปหลายเหลี่ยม"LayerA"(สี่เหลี่ยมโปร่งใสด้วยเค้าร่างสีแดง) นอกจากนี้ยังเกี่ยวข้องกับวงกลมที่แสดงถึงการเคลื่อนไหวภายในเซลล์มองเห็นตำแหน่งของ"LayerA"geocentroids

    LayerA_AT

  • ชั้น Polyline "Flows"(ลูกศรสีเหลือง / สีเทา) ถ่ายทอดค่าผ่านการเชื่อมต่อระหว่าง"LayerA"คุณสมบัติของ geocentroids

    Flows_AT


เลเยอร์เป้าหมาย:

  • รูปหลายเหลี่ยม"LayerB"(สีม่วงอ่อนที่มีเค้าร่างสีเทาเข้ม)

    LayerB_AT

นอกจากนี้ฉันได้ถ่ายโอนแล้ว"FLUX"และค่าการเคลื่อนไหวภายในเซลล์จาก"LayerA"เป็น"LayerB"รูปหลายเหลี่ยมดูคำถามก่อนหน้าของฉัน: รับค่าระหว่างรูปหลายเหลี่ยมใน QGIS? . มันก็ทำได้โดยใช้%การ$areaคำนวณ


อาจจะมีวิธีการแก้ปัญหาที่มีความหมาย / วิธีการของการถ่ายโอน / ส่งสัญญาณ / การเปลี่ยนแปลงการไหลของ การเชื่อมต่อแทนด้วย"Flows"และคุณค่าของมันมาจากความสัมพันธ์ของเข้าไปในความสัมพันธ์ของ"LayerA""LayerB"

ฉันจะบรรลุการเชื่อมต่อเหล่านั้นในฐานะ polylines ได้อย่างไร

"Flows"นอกจากนี้กระแสใหม่จะได้รับมรดกสไตล์คล้ายกับ

โดยการร้องขอฉันสามารถให้ตัวอย่างของข้อมูล

กระแสจะมีอยู่ไม่ได้อยู่ระหว่างคุณสมบัติของ"LayerA"แต่ระหว่างคุณสมบัติของ "LayerB"เป้าหมายหลักคือเพื่อให้ได้แอตทริบิวต์"FLUX"(เช่นจาก / ถึง) สำหรับการเชื่อมต่อระหว่างที่"LayerB"เป็นไปได้เช่นตาราง / Origin-Destination Matrix


มีข้อกำหนด / เกณฑ์บางประการที่ควรปฏิบัติตาม:

1.ไม่มีการเชื่อมต่อการไหลระหว่างส่วนต่าง ๆ ของคุณสมบัติ (เลือกเป็นสีเหลือง) ในเซลล์เดียวกัน

condition_1

2.ไม่มีการเชื่อมต่อระหว่างคุณสมบัติเดียวกันแม้จะอยู่ในส่วนต่าง ๆ ของเซลล์

condition_2

3. การเชื่อมต่อมีอยู่ระหว่างส่วนต่าง ๆ ของคุณสมบัติ"LayerB"(ขึ้นอยู่กับ"Union"เอาต์พุต) หากอยู่ภายใน"LayerA"คุณสมบัติของเซลล์ที่แตกต่างกันสองแบบ

condition_3

4."FLUX"ค่าใหม่ที่สื่อความหมายจะถูกคำนวณตามที่แสดงในภาพด้านล่าง

ตัวอย่างเช่นมีการเชื่อมต่อระหว่างสองเซลล์IและIIที่เป็น"FLUX" 100สมมติว่าค่าอื่น ๆ"NEW_FLUX"ระหว่างA'และจะอยู่ที่ประมาณB'' เป็นเพียงตัวอย่างเดียว1.5625100

condition_4


อ้างอิง:


1
ขอบคุณสำหรับการแก้ไขฉันเริ่มเข้าใจ แต่ไม่แน่ใจ คุณสามารถแก้ไขโพสต์ต้นฉบับของคุณอีกครั้งเพื่อเพิ่มผลลัพธ์ที่ต้องการได้หรือไม่ (ตัวอย่างเช่น: เลเยอร์บรรทัดระหว่าง polygon_b centroids กับฟิลด์นี้ด้านล่าง: - "field1": คำอธิบายข้อมูลที่พยายามแล้ว ฯลฯ )
J. Monticolo

1
สำหรับการชี้แจงเราสามารถพูดคุยอย่างอิสระมากขึ้นในห้องนี้ GSE แชท: chat.stackexchange.com/rooms/92038/... ?
J. Monticolo

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. Monticolo

1
ฉันได้เพิ่มคำอธิบายหวังว่าจะช่วย
J. Monticolo

1
ใช่มันถูกต้องที่จะมีรูปหลายเหลี่ยม ฉันทำการแก้ไขเพื่อให้มีทั้งpolygon_bเลเยอร์และpolygon_a . ** ค่า ** หากการไหลสร้างการเชื่อมต่อ สำหรับฉันผลลัพธ์ไม่ได้เป็นเลเยอร์บรรทัด แต่เป็นชั้นpolygon_bโดยตรงที่มีค่าpolygon_a ที่นำเข้าโดยโฟลว์เลเยอร์
J. Monticolo

4

layerBคุณสามารถทำร่วมกันระหว่างสามชั้นแล้วรวมโดย เลเยอร์เสมือนสามารถใช้งานได้ ฉันไม่แน่ใจว่าข้อมูลที่สำคัญอยู่ในlayerAหรือในflowเลเยอร์ .. นี่คือความเป็นไปได้ (ยังไม่ทดลอง):

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

@ Taras เยี่ยมมาก! นอกจากนี้คุณยังสามารถใช้มวลเช่นsum(f.flow_var)หรือแม้กระทั่งsum(fl.flow_var * a.poly_var)
JGH
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.