यह एक प्रतीत होता है सरल SQL सर्वर ज्योमेट्री प्रश्न है कि मुझे लगा कि इसका आउट-ऑफ-द-बॉक्स समाधान होगा, लेकिन मुझे एक भी भाग्य नहीं मिल रहा है।
मेरा इरादा एक मेज के भीतर सभी रिकॉर्ड का चयन करना है जिसमें बहुभुज हैं जो दूसरे टेबल से बड़े बहुभुज के भीतर नेस्टेड (निहित) हैं। मेरे पास अपेक्षित कार्य थे STWithin
और STContains
मेरे लिए आवश्यक समाधान होने के नाते, लेकिन दुर्भाग्य से, दोनों केवल बड़े बहुभुज में निहित उन आंतरिक बहुभुजों की पहचान करते हैं, न कि वे निहित बहुभुज जो बड़े बहुभुज की सीमा को छू रहे हैं। उदाहरण के लिए छवि देखें।
एक वैकल्पिक विकल्प जो मेरी जरूरतों के लिए काम करता था STIntersection
। हालाँकि, इस फ़ंक्शन के साथ समस्या यह है कि यह केवल ज्यामिति कॉलम लौटाता है! मैं इसके बजाय रिकॉर्ड आईडी प्राप्त करना चाहूंगा। क्या किसी के पास यह सुझाव है कि यह कैसे किया जा सकता है?
STWithin
:
select a.bg10 from
gis.usa_10_block_group a
join gis.usa_10_mkt_definition b
on a.shape.STWithin(b.shape) = 1
where b.mktname = 'Loop'
STContains
:
select a.bg10 from
gis.usa_10_block_group a
join gis.usa_10_mkt_definition b
on b.shape.STContains(a.shape) = 1
where b.mktname = 'Loop'
STIntersection
:
select a.shape.STIntersection(b.shape)
from gis.usa_10_block_group a
join gis.usa_10_mkt_definition b
on a.shape.STIntersects(b.shape) = 1
where b.mktname = 'Loop'
संपादित करें:
एक सुझाव यह था कि इसे छोड़ दिया जाए STIntersection
और पूरी तरह से उपयोग किया जाए STIntersects
:
STIntersects
:
select a.bg10
from gis.usa_10_block_group a
join gis.usa_10_mkt_definition b
on a.shape.STIntersects(b.shape) = 1
where b.mktname = 'Loop'
इस दृष्टिकोण के साथ समस्या यह है कि STIntersects
सभी बहुभुज या तो भीतर या बाहर का चयन करने और बड़े बहुभुज को छूने के लिए प्रकट होता है, न कि केवल उन सख्ती से भीतर। उदाहरण के लिए छवि देखें।
STContains
कर सकते हैंSTWithin
। वास्तव में एक अच्छा हैक नहीं है, लेकिन आपको मनचाहा परिणाम मिलेगा। दूसरा विकल्प यह होगा कि STIntersect को Intersection क्षेत्र और बहुभुज क्षेत्र की तुलना के साथ किया जाए।