Esta é uma questão de geometria do SQL Server aparentemente simples que eu pensei que teria uma solução pronta para uso, mas não estou tendo sorte em encontrar uma.
Minha intenção é selecionar todos os registros em uma tabela que tenham polígonos aninhados (contidos) em um polígono maior de outra tabela. Eu esperava funções STWithin
e, STContains
como sendo as soluções necessárias, mas, infelizmente, ambas identificam apenas os polígonos internos dentro daqueles aninhados no polígono maior, não aqueles polígonos aninhados que estão tocando o limite do polígono maior. Veja a imagem por exemplo.
Uma opção alternativa que atendeu às minhas necessidades foi STIntersection
. O problema com esta função, no entanto, é que ela retorna apenas a coluna geométrica! Gostaria de obter o ID do registro. Alguém tem alguma sugestão de como isso pode ser feito?
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'
Editar:
Uma sugestão era omitir STIntersection
e usar apenas STIntersects
o seguinte:
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'
O problema dessa abordagem é que STIntersects
parece selecionar todos os polígonos dentro ou fora e tocando o polígono maior, não apenas aqueles estritamente internos. Veja a imagem por exemplo.
STContains
ou outroSTWithin
. Não é realmente um truque agradável, mas você obtém os resultados desejados. A outra opção seria fazer as conexões STI com uma comparação da área de interseção e da área de polígonos.