テーブルに複数のポリゴンがあります(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 関数です。