我在一个表中有多个多边形 ( ImageId int, Quality float, Border geometry
)。
如何使用性能更高的 T-SQL 函数找到多边形的所有交点?是否有任何功能可以帮助查找交叉点而无需迭代并且无需将每个多边形与每个多边形或任何样本进行比较如何做到这一点。谁能帮我?
我在一个表中有多个多边形 ( ImageId int, Quality float, Border geometry
)。
如何使用性能更高的 T-SQL 函数找到多边形的所有交点?是否有任何功能可以帮助查找交叉点而无需迭代并且无需将每个多边形与每个多边形或任何样本进行比较如何做到这一点。谁能帮我?
我现在无法测试这个,但如果空间聚合像其他聚合(即字符串 + 字符串)一样工作,让我们试试这个:
declare @intersection geometry;
select top 1 @intersection = border
from #polygons;
select @intersection = border.STIntersects(@intersection)
from #polygons;
select @intersection.STIsEmpty();
如果我的工作正确,@intersection 应该包含表中所有多边形的交集。
除了将每个多边形与其他多边形进行比较之外,我认为您无法做到这一点。
select p1.id, p2.id, p1.border.STIntersects(p2.border)
from #polygons p1
inner join #polygons p2 on p1.id<p2.id
通过使用 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 的函数。