Ini adalah pertanyaan geometri SQL Server yang tampaknya sederhana yang saya pikir akan memiliki solusi out-of-the-box, tapi saya tidak beruntung menemukan satu.
Maksud saya adalah untuk memilih semua rekaman dalam satu tabel yang memiliki poligon yang bersarang (terkandung) dalam poligon yang lebih besar dari tabel lain. Saya memiliki fungsi yang diharapkan STWithin
dan STContains
sebagai solusi yang saya butuhkan, tetapi sayangnya, keduanya hanya mengidentifikasi poligon bagian dalam yang bersarang dalam poligon yang lebih besar, bukan poligon bersarang yang menyentuh batas poligon yang lebih besar. Lihat gambar misalnya.
Pilihan alternatif yang sesuai dengan kebutuhan saya adalah STIntersection
. Masalah dengan fungsi ini, bagaimanapun, adalah hanya mengembalikan kolom geometri! Saya ingin mendapatkan ID rekaman sebagai gantinya. Adakah yang punya saran tentang bagaimana ini bisa dilakukan?
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'
Edit:
Satu saran adalah untuk menghilangkan STIntersection
dan menggunakan hanya STIntersects
sebagai berikut:
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'
Masalah dengan pendekatan ini, adalah yang STIntersects
muncul untuk memilih semua poligon baik di dalam maupun di luar dan menyentuh poligon yang lebih besar, bukan hanya yang ketat di dalamnya. Lihat gambar misalnya.
sumber
STContains
atauSTWithin
. Bukan hack yang bagus, tetapi akan memberi Anda hasil yang Anda inginkan. Pilihan lain adalah melakukan STIntersect dengan perbandingan area titik-temu dan area poligon.Jawaban:
Secara teori pertanyaan yang telah Anda lakukan harus mengembalikan poligon yang Anda katakan belum dikembalikan. Itu membuat saya curiga bahwa Anda mungkin menghadapi masalah kesalahan floating point yang SQL Server miliki dengan itu tipe data spasial. Maka komentar saya tentang buffering poligon terikat dengan jumlah minimal.
Jadi sesuatu seperti yang berikut ini harus mendapatkan hasil yang Anda inginkan.
Berikut adalah contoh cepat perilaku yang diharapkan dari beberapa metode spasial.
Hasil
sumber
Kueri persimpangan akan terlihat seperti ini (dengan asumsi Anda ingin semua catatan kembali dari 'a'):
Jika Anda ingin hanya area a yang berpotongan b (mis. Kliping ke b), Anda kemudian menambahkan STIntersection
Tapi ini tidak membuatmu poligon yang ada dalam b dulu ...
Jenis polygon-in-polygon ini sangat testy dengan batas-batas dan keyakinannya - untuk menjadi 'Dalam', batas-batas a tidak dapat sesuai dengan batas-batas b - sama dengan 'Berisi'.
Dengan definisi ini, berapa banyak poligon Anda dalam yang benar-benar dalam b ...?
Jadi, apakah Anda ingin buffer b sebelum Anda memilih poligon di dalam yang ada? Atau apakah buffer negatif pada a?
Tidak yakin apa jawaban tepatnya di sini ...
sumber