这是一个看似简单的SQL Server几何问题,我以为可以使用一种即用型的解决方案,但是我找不到运气。
我的目的是选择一个表中具有多边形的所有记录,这些记录嵌套(包含)在另一个表的较大多边形中。我有预期的功能STWithin,STContains也有需要提供的解决方案,但是不幸的是,它们都只识别嵌套在较大多边形中的内部多边形,而不识别那些接触较大多边形边界的嵌套多边形。例如参见图片。
满足我的需求的另一个选择是STIntersection。但是,此函数的问题在于它仅返回几何列!我想获取记录ID。有没有人对如何做到这一点有何建议?
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。