Esta es una pregunta de geometría de SQL Server aparentemente simple que pensé que tendría una solución lista para usar, pero no tengo suerte para encontrarla.
Mi intención es seleccionar todos los registros dentro de una tabla que tengan polígonos anidados (contenidos) dentro de un polígono más grande de otra tabla. Esperaba funciones STWithin
y STContains
como las soluciones que necesitaba, pero desafortunadamente, ambas identifican solo los polígonos internos dentro de los anidados en el polígono más grande, no aquellos polígonos anidados que están tocando el límite del polígono más grande. Ver imagen por ejemplo.
Una opción alternativa que funcionó para mis necesidades fue STIntersection
. Sin embargo, el problema con esta función es que solo devuelve la columna de geometría. Me gustaría obtener el ID de registro en su lugar. ¿Alguien tiene una sugerencia sobre cómo se puede hacer esto?
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:
Una sugerencia fue omitir STIntersection
y usar únicamente de la STIntersects
siguiente manera:
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'
El problema con este enfoque es que STIntersects
parece seleccionar todos los polígonos dentro o fuera y tocar el polígono más grande, no solo los estrictamente dentro. Ver imagen por ejemplo.
STContains
oSTWithin
. Realmente no es un buen truco, pero obtendrá los resultados que desea. La otra opción sería hacer las intersecciones STI con una comparación del área de intersección y el área de polígonos.