这是一个看似简单的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。