Questa è una domanda apparentemente semplice sulla geometria di SQL Server che pensavo potesse avere una soluzione pronta all'uso, ma non ho avuto fortuna a trovarne una.
Il mio intento è selezionare tutti i record all'interno di una tabella con poligoni nidificati (contenuti) all'interno di un poligono più grande di un'altra tabella. Avevo previsto funzioni STWithin
e STContains
come soluzioni di cui avevo bisogno, ma sfortunatamente, entrambi identificano solo i poligoni interni all'interno di quelli nidificati nel poligono più grande, non quei poligoni nidificati che toccano il confine del poligono più grande. Vedi l'immagine per esempio.
Un'opzione alternativa che ha funzionato alle mie esigenze era STIntersection
. Il problema con questa funzione, tuttavia, è che restituisce solo la colonna geometrica! Vorrei invece ottenere l'ID record. Qualcuno ha un suggerimento su come questo può essere fatto?
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'
Modificare:
Un suggerimento era di omettere STIntersection
e utilizzare esclusivamente STIntersects
come segue:
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'
Il problema con questo approccio è che STIntersects
sembra selezionare tutti i poligoni all'interno o all'esterno e toccare il poligono più grande, non solo quelli strettamente all'interno. Vedi l'immagine per esempio.
STContains
oSTWithin
. Non è proprio un bel trucco, ma ti darà i risultati che desideri. L'altra opzione sarebbe quella di eseguire gli STIntersects con un confronto tra l'area di intersezione e l'area dei poligoni.