SQL Server 2008+:检测两个多边形是否重叠的最佳方法?

时间:2012-01-10 14:19:54

标签: sql sql-server-2008 sql-server-2008-r2 polygon polyline

我们有一个应用程序,其中包含一个多边形数据库(当前存储为点),.net应用程序将其拉出并检查它们是否重叠。

我想到,将这些点数组转换为数据库中的多边形/折线对象会更好,并使用sql来获得它们重叠或不重叠的天气。

我已经看到不同的方法建议这样做但是给出的例子并不符合我的需要。

我很乐意收到那些足以提供他们经验的意见。

其他:

回答问题:确实是2D。是的,两者的任何交叉都被认为是真的。多边形有n个点,可以是凹的。多边形将被保存为每行1个(在数据转换任务之后)作为多边形(即多边形类型......它可能被称为其他空间/ geom,我的记忆现在不在我身边)

3 个答案:

答案 0 :(得分:2)

您可以使用.STIntersection和.STAsText()来测试重叠多边形。 (我真的很讨厌微软使用的术语(或任何设置标准术语的人)。在我看来,“触摸”应该是对两个几何/地理形状是否重叠的测试,而不仅仅是共享边界。)

反正....

如果@RadiusGeom是表示点的半径的几何,则以下将返回任意两个多边形的列表,其中交点(表示两个几何重叠的区域的几何)不为空。

SELECT CT.ID AS CTID, CT.[Geom] AS CensusTractGeom
FROM CensusTracts CT
WHERE CT.[Geom].STIntersection(@RadiusGeom).STAsText() <> 'GEOMETRYCOLLECTION EMPTY'

如果您的几何体字段是空间索引的,则运行速度非常快。我在大约3秒内在66,000张美国CT记录上运行了这个。可能有更好的方法,但由于没有其他人有答案,这是我尝试为你答案。希望它有所帮助!

答案 1 :(得分:1)

计算并存储与该多边形相关联的行内的一组新字段中每个多边形的边界矩形。 (我假设您有一个;如果没有,请创建一个。)当您的dotnet应用程序具有多边形并且正在查找重叠多边形时,它可以使用相对简单的SQL SELECT语句从数据库中仅获取其边界矩形重叠的多边形。那些多边形应该相对较少,所以这将是有效的。然后,您的dotnet应用程序可以执行更精细的多边形重叠计算,以确定哪些真正重叠。

答案 2 :(得分:1)

好的,我有另一个想法,所以我发布它作为一个不同的答案。我认为我之前使用边界多边形的答案可能有一些优点,即使它是为了减少从数据库中提取的多边形数量的一小部分,但这个可能更好。

MSSQL支持从2005版本开始与CLR集成。这意味着您可以在程序集中定义自己的数据类型,使用MSSQL注册程序集,从那时起,MSSQL将接受您的用户定义数据类型作为列的有效类型,它将调用程序集以使用用户定义的数据类型执行操作。

CodeProject上此技术的示例文章:Creating User-Defined Data Types in SQL Server 2005

我从来没有使用过这种机制,所以我不知道它的细节,但我认为你应该能够在你的数据类型上定义一个新的操作,或者重载一些现有的操作,比如“less-than” ,以便您可以检查一个多边形是否与另一个多边形相交。这可能会加快速度。