এটি একটি আপাতদৃষ্টিতে সহজ এসকিউএল সার্ভার জ্যামিতি প্রশ্ন যা আমি ভেবেছিলাম একটি বাক্সের বাইরে সমাধান হবে তবে আমার ভাগ্য ভাল নয় finding
আমার উদ্দেশ্য হ'ল এক টেবিলের মধ্যে এমন সমস্ত রেকর্ড নির্বাচন করা উচিত যা অন্য টেবিল থেকে বৃহত্তর বহুভুজের মধ্যে নীস্টে থাকা (অন্তর্ভুক্ত) বহুভুজ রয়েছে। আমার কার্যকারিতা প্রত্যাশা ছিল 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 করা।