3

私のテーブルには、ポリゴンを格納するジオメトリフィールドがあります。

互いに交差するポリゴンは、単一のポリゴンにアタッチして形成する必要があります(以下を参照)。

画像
(出典:location-world.com

結果を計算することはできませんが、飛行中に実行する必要があります。カーソルでやりましたが、時間がかかりすぎます。

カーソルを使用せずにタスクを実行する方法はありますか?SQL Server2008R2を使用しています。

カーソルを使ったソースコードを添付しました。

DECLARE @Results TABLE (ResultId INT, Shape GEOMETRY)
DECLARE @ExistingIds TABLE (Id VARCHAR(50))
DECLARE @Id VARCHAR(50), @Shape GEOMETRY

DECLARE ViasCursor CURSOR FOR
SELECT ID, shape
FROM [dbo].[layer.2502]

OPEN ViasCursor
FETCH ViasCursor INTO @Id, @Shape
DECLARE @ResultId INT = 0
WHILE ( @@FETCH_STATUS = 0 ) 
    BEGIN
        IF NOT EXISTS ( SELECT Id FROM @ExistingIds WHERE Id = @Id )
            BEGIN
                DECLARE @Geo GEOMETRY = NULL

                SELECT  @Geo = COALESCE(@Geo.STUnion(Shape), Shape)
                WHERE   [Shape].STIntersects(@Shape) = 1

                INSERT  INTO @ExistingIds ( Id )
                SELECT  [Id]
                FROM    [dbo].[layer.2502]
                WHERE   [Shape].STIntersects(@Shape) = 1

                DECLARE @ExistingId INT = NULL
                SELECT @ExistingId = [ResultId] 
                FROM @Results
                WHERE Shape.STIntersects(@Geo) = 1

                IF @ExistingId IS NOT NULL
                    UPDATE @Results SET [Shape] = [Shape].STUnion(@Geo) 
                    WHERE ResultId = @ExistingId
                ELSE
                    BEGIN
                        INSERT INTO @Results ( [ResultId], [Shape] ) 
                        VALUES  ( @ResultId, @Geo )
                        SET @ResultId = @ResultId + 1
                    END
            END
        FETCH ViasCursor INTO @Id, @Shape
    END 
CLOSE ViasCursor
DEALLOCATE ViasCursor
SELECT * FROM @Results
4

1 に答える 1

3

テスト用のスキーマとデータがなければ、これに対応する実用的なソリューションを作成するのは困難ですが、ここにいくつかのヒントを示します。
この質問では、彼らは空間データをグループ化していますが、交差する代わりに含む: SQL Server ジオメトリ データを STWithin でグループ化するにはどうすればよいですか?
そして、この質問では、彼らはジオメトリ列で STUnion を使用しています: Postgres の GeomUnion のような SQL Server テーブルのすべてのジオメトリ
を結合します。

ただし、私はパフォーマンスをテストしていません。また、前のリンクでポスターが警告していました...

少しでもきっかけになれば幸いです。

于 2012-11-27T15:16:24.957 に答える