gpt4 book ai didi

performance - SQL Server 2008 空间查询。如果它们彼此相交,如何对多边形进行分组?

转载 作者:行者123 更新时间:2023-12-04 02:33:28 25 4
gpt4 key购买 nike

在我的表格中有一个存储多边形的几何字段。

彼此相交的多边形必须连接并形成一个多边形(见下文)

Image
(来源:location-world.com)

结果无法计算,但必须在飞行中执行。我已经用游标完成了,但是它花费了太多时间。

有没有办法不使用游标来执行任务?我正在使用 SQL Server 2008 R2。

我附上了使用游标的源代码。

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

最佳答案

如果没有模式和数据来测试,很难为此创建一个可行的解决方案,但这里有一些提示。
在这个问题中,他们对空间数据进行分组,但包含而不是相交:How can I group SQL Server geometry data by STWithin?
在这个问题中,他们在几何列上使用了 STUnion:Union all geometry in a SQL Server table like GeomUnion in Postgres
如果将这些方法结合起来,您可能会想出一些有用的方法。

但是:我还没有测试性能,我的海报确实在前面的链接中警告过......

希望至少能有所启发。

关于performance - SQL Server 2008 空间查询。如果它们彼此相交,如何对多边形进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13573515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com