Bu, kutudan çıkmış bir çözüm olacağını düşündüğüm basit bir SQL Server geometri sorusu, ancak bir tane bulmakta şansım yok.
Amacım, bir tablodaki başka bir tablodan daha büyük bir çokgen içinde yuvalanmış (içerilen) çokgenleri olan tüm kayıtları seçmektir. Beklenen işlevler vardı STWithin
ve STContains
ihtiyacım olan çözümler olarak, ancak maalesef her ikisi de, daha büyük çokgenin sınırına değen iç içe çokgenleri değil, yalnızca daha büyük çokgenin içinde iç içe olan çokgenleri tanımlar. Örneğin resme bakın.
İhtiyacım için çalışan alternatif bir seçenekti STIntersection
. Ancak bu işlevin sorunu, yalnızca geometri sütununu döndürmesidir! Bunun yerine kayıt kimliğini almak istiyorum. Bunun nasıl yapılabileceğine dair bir önerisi olan var mı?
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'
Düzenle:
Bir öneri atlamak STIntersection
ve sadece STIntersects
aşağıdaki gibi kullanmaktı :
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'
Bu yaklaşımla ilgili sorun STIntersects
, sadece çok içeride değil, tüm poligonları içeride veya dışarıda ve daha büyük poligona dokunmak gibi görünüyor. Örneğin resme bakın.
STContains
veya öğelerinden birini kullanabilirsinizSTWithin
. Gerçekten güzel bir hack değil, ama size istediğiniz sonuçları alacak. Diğer seçenek STIntersects'i Kavşak alanı ve çokgenler alanı karşılaştırmasıyla yapmak olacaktır.