นี่เป็นคำถามเชิงเรขาคณิตของ SQL Server ที่ดูเหมือนง่ายที่ฉันคิดว่าน่าจะมีโซลูชันนอกกรอบ แต่ฉันไม่มีโชคในการค้นหา
ความตั้งใจของฉันคือการเลือกระเบียนทั้งหมดภายในหนึ่งตารางที่มีรูปหลายเหลี่ยมที่ซ้อนกัน (มีอยู่) ภายในรูปหลายเหลี่ยมที่มีขนาดใหญ่กว่าจากตารางอื่น ฉันคาดหวังการทำงาน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
ไม่ใช่แฮ็คที่ดีจริงๆ แต่จะให้ผลลัพธ์ที่คุณต้องการ ตัวเลือกอื่นจะทำ STIntersects ด้วยการเปรียบเทียบพื้นที่ Intersection และพื้นที่รูปหลายเหลี่ยม