我在表格中有多个多边形(ImageId int, Quality float, Border geometry
)。
如何使用具有更高性能的T-SQL函数找到所有多边形的相交?是否有任何函数有助于在没有迭代的情况下找到交叉点,并且没有比较每个多边形与每个或任何样本如何做到这一点。任何人都可以帮助我吗?
答案 0 :(得分:4)
我不是现在可以测试它的地方,但如果空间聚合像其他聚合一样工作(即字符串+字符串),那么试试吧:
declare @intersection geometry;
select top 1 @intersection = border
from #polygons;
select @intersection = border.STIntersects(@intersection)
from #polygons;
select @intersection.STIsEmpty();
如果我正确地完成了我的工作,@ onterection应该包含表格中所有多边形的交集。
答案 1 :(得分:2)
除了将每个多边形与其他多边形进行比较之外,我认为你无法做到这一点。
select p1.id, p2.id, p1.border.STIntersects(p2.border)
from #polygons p1
inner join #polygons p2 on p1.id<p2.id
答案 2 :(得分:0)
通过使用podiluska的代码作为我的基本代码,我已经实现了您的目标。然而,它不是非常高效。我希望有人可以提供更快的查询。
select geometry::UnionAggregate(inter_geometry) as intersection_union
from
(
select p1.id as id1, p2.id as id2, p1.border.STIntersection(p2.border) as inter_geometry
from #polygons p1
inner join #polygons p2 on p1.id < p2.id
where p1.border.STIntersects(p2.border) = 1
) t
where t.inter_geometry.STArea() > 0 --for some cases STIntersects returns 1 but the area is 0
通过UnionAggregate的方式是SQL Server 2012的功能。