जहाँ खंड में चौराहे के प्रतिशत क्षेत्र की गणना


15

मेरे पास पोस्टग्रे में पॉलीगॉन (जनगणना ब्लॉक समूह) की एक तालिका है। मैं शहर के साथ प्रत्येक ब्लॉक समूह (एक और बहुभुज तालिका) को टैग करना चाहता हूं जो मुख्य रूप से भीतर रहता है। क्या यह संभव है? मुझे लगता है कि मैं अनिवार्य रूप से कुछ बनाने की आवश्यकता होगी सोच रहा हूँ:

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 शहर ...) मिल गए हैं। यदि यह गलत है, या तेजी से सही होने पर इस क्वेरी को कैसे बनाया जाए, इस पर कोई सुझाव?


लगता है कि आप अधिकतम ओवरलैप के आधार पर ब्लॉक समूहों को टैग करना चाहते हैं? यदि हां, तो यह उत्तर देखें । यदि आपके 'कस्बों' में भी जनगणना भौगोलिक (एमसीडी या स्थान हैं) कहते हैं, तो शायद ओवरलैप प्रतिशत की गणना करने की कोई आवश्यकता नहीं है।
dbaston

जवाबों:


23

जिस तरह से आप कर रहे हैं वह काम करेगा लेकिन इसमें बहुत अधिक समय लगेगा, क्योंकि पोस्टगिस हर "ब्लॉकग्रुप बनाम टाउन" संयोजन के चौराहे की ज्यामिति बनाने की कोशिश कर रहा है, यहां तक ​​कि जब वे स्पर्श भी नहीं करते हैं।

यदि आपके दो ज्यामितीय अवरोधन हैं, और मौजूदा एक से पहले इसे जांचने के लिए अपने WHERE क्लॉज में एक और शर्त जोड़ें।

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 को प्रारंभिक संचालन में से एक में लौटाया जाता है, तो कुआरी सिर्फ दूसरों की स्थितियों की जाँच करेगी, क्योंकि परिणाम हमेशा FALSE होगा।

इसके अलावा, सुनिश्चित करें कि आपके पास ब्लॉकगूप्स.wkb_geometry और towns.wkb_geometry पर स्पेसियल इंडेक्स हैं।


1
जोड़ना ST_Intersectsयहाँ जाने का सही तरीका है, लेकिन प्लानर अपने लिखे गए नियमों को लागू नहीं कर सकता है या नहीं कर सकता है। इस पर विवरण के लिए पोस्टग्राउंड डॉक्स देखें । ST_Intersectsऔर ST_Intersectionमेरी स्थापना (100) पर एक ही लागत है, इसलिए ईमानदार होने के लिए मुझे यकीन नहीं है कि योजनाकार क्या कर रहा है, लेकिन यह हमेशा यहां सही काम करता है।
dbaston

आह ... मुझे लगता है कि अन्य भाषाओं की तरह स्थितियों की जाँच की जाएगी। लेकिन मुझे लगता है कि यह योजनाकार को एक और विकल्प देता है।
अलेक्जेंड्रे नेटो

10

अलेक्जेंड्रे के बहुत उपयोगी उत्तर को जोड़ना, यदि आपकी कुछ जनगणना इकाइयाँ आपके तीन कस्बों को फैला सकती हैं (और इसलिए आप किसी भी कस्बे में 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
मैं इसे पूरी तरह से स्वीकार करता हूं जब एसओ उत्तर के साथ मेरा पहला अंक मिलता है तो अगले उत्तर को हल कर दिया जाता है। चीयर्स, @RobinL!
wfgeo

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.