Це, здавалося б, просте питання геометрії сервера 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 зі порівнянням області перетину та площі полігонів.