การคำนวณพื้นที่ร้อยละของการแยกในกรณีที่ข้อ


15

ฉันมีตารางรูปหลายเหลี่ยม (กลุ่มบล็อกการสำรวจสำมะโนประชากร) ใน postgres ฉันต้องการติดแท็กกลุ่มบล็อกแต่ละกลุ่มด้วยเมือง (ตารางรูปหลายเหลี่ยมอื่น) ส่วนใหญ่อยู่ภายใน เป็นไปได้ไหม ฉันคิดว่าฉันจำเป็นต้องสร้างสิ่งที่ต้องการ:

select b.*,t.name  
from blockgroups b, towns t  
where (st_area(st_intersection(b.wkb_geometry, t.wkb_geometry))/st_area(b.wkb_geometry)) > .5  

แต่แบบสอบถามนี้ใช้เวลาตลอดไป (ฉันมีกลุ่มบล็อกประมาณ 5,000 กลุ่มและ 375 เมือง ... ) คำแนะนำใด ๆ เกี่ยวกับวิธีทำให้คิวรีนี้ใช้งานได้ถ้ามันไม่ถูกต้องหรือเร็วกว่านั้นถ้ามันถูกต้อง?


ดูเหมือนว่าคุณต้องการแท็กกลุ่มบล็อกตามการทับซ้อนสูงสุดใช่ไหม ถ้าเป็นเช่นนั้นดูคำตอบนี้ หาก 'เมือง' ของคุณเป็นภูมิศาสตร์การสำรวจสำมะโนประชากร (MCDs หรือสถานที่พูด) อาจไม่จำเป็นต้องคำนวณเปอร์เซ็นต์ที่ทับซ้อนกัน
dbaston

คำตอบ:


23

วิธีที่คุณกำลังทำอยู่จะใช้งานได้ แต่จะใช้เวลานานเกินไปเนื่องจาก postgis พยายามสร้างรูปทรงเรขาคณิตของจุดตัดของชุดค่าผสม "blockgroup vs town" ทุกครั้งแม้ว่าจะไม่ได้สัมผัสก็ตาม

เพิ่มการตรวจสอบเงื่อนไขอื่นใน WHERE clause ของคุณเพื่อตรวจสอบว่ารูปทรงเรขาคณิตทั้งสองนั้นถูกตัดและวางไว้ข้างหน้าสิ่งที่มีอยู่:

select b.*,t.name
from blockgroups b, towns t
where st_intersects(b.wkb_geometry, t.wkb_geometry) and    
    (st_area(st_intersection(b.wkb_geometry, t.wkb_geometry))/st_area(b.wkb_geometry)) > .5

ใน SQL ถ้าคุณมีรายการเงื่อนไขในส่วนคำสั่ง WHERE พวกเขาจะถูกทดสอบตามลำดับที่เขียน หากมีการส่งคืน FALSE ในช่วงแรกของการดำเนินการ Querie จะข้ามการตรวจสอบเงื่อนไขอื่น ๆ เนื่องจากผลลัพธ์จะเป็น FALSE เสมอ

นอกจากนี้ตรวจสอบให้แน่ใจว่าคุณมีดัชนีพิเศษใน blockgroups.wkb_geometry และ towns.wkb_geometry


1
การเพิ่มST_Intersectsเป็นวิธีที่เหมาะสมในการไปที่นี่ แต่ผู้วางแผนอาจหรือไม่ปฏิบัติตามเงื่อนไขตามลำดับที่เขียน ดูเอกสาร Postgres สำหรับรายละเอียดเกี่ยวกับเรื่องนี้ ST_IntersectsและST_Intersectionมีค่าใช้จ่ายเท่ากันกับการติดตั้งของฉัน (100) ดังนั้นความจริงแล้วฉันไม่แน่ใจว่าผู้วางแผนทำอะไร แต่ดูเหมือนว่าจะทำสิ่งที่ถูกต้องที่นี่เสมอ
dbaston

อ่า ... ฉันคิดว่าเงื่อนไขจะถูกตรวจสอบเหมือนภาษาอื่น ๆ แต่ฉันเดาว่ามันจะให้ทางเลือกอื่นกับผู้วางแผน
Alexandre Neto

10

การเพิ่มคำตอบที่มีประโยชน์มากของ Alexandre หากหน่วยสำรวจสำมะโนประชากรของคุณบางแห่งอาจครอบคลุมสามเมืองของคุณ (ดังนั้นคุณจึงไม่สามารถรับประกันได้ว่าจะตกหล่นกว่า 50% ในเมืองใดก็ได้) คุณสามารถทำได้:

select distinct on (b.id)
b.*,t.name,
(st_area(st_intersection(b.wkb_geometry, t.wkb_geometry))/st_area(b.wkb_geometry)) as proportion
from blockgroups b, towns t
where st_intersects(b.wkb_geometry, t.wkb_geometry) 
order by b.id, proportion desc;

สิ่งนี้จะช่วยป้องกันสถานการณ์ต่อไปนี้ซึ่งพื้นที่สีฟ้าจะหายไป: ป้อนคำอธิบายรูปภาพที่นี่


1
ฉันรักมันอย่างแน่นอนเมื่อปัญหาแรกที่ฉันพบกับคำตอบ SO ถูกแก้ไขโดยคำตอบถัดไป ไชโย @ RobinL!
wfgeo

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.