2012-01-10 91 views
2

我们有一个应用程序,它有一个数据库,里面充满了.net应用程序抽出的多边形(当前存储为点)并检查它们是否重叠。SQL Server 2008+:检测两个多边形是否重叠的最佳方法?

我想到了将这些点数组转换为数据库中的多边形/折线对象并使用sql来获取他们重叠或不重叠的天气是一件好事。

我看到了不同的方法建议做到这一点,但没有给出的例子与我的需求非常符合。

我很乐意从那些足以提供他们的经验的人那里获得输入。

附加:

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

+1

您能更具体地了解多边形的数据存储吗? *(每个多边形3点,或每个多边形的'n'点?每点一行或每多边形一行?)*带有示例数据的表格定义会很好。 – MatBailie 2012-01-10 14:21:24

+0

哦,如果一个多边形完全在另一个多边形内,我*认为*你认为这是一个重叠? – MatBailie 2012-01-10 14:24:01

+0

问题已更新 - 谢谢 – Nick 2012-01-10 15:16:44

回答

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记录上跑了这个。可能有更好的办法,但由于没有其他人有答案,这是我为你的答案的尝试。希望能帮助到你!

+0

谢谢杰森这是伟大的:o) – Nick 2012-06-25 14:08:31

1

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

+0

描述假设只有两个维度,但可以推断为三个... – MatBailie 2012-01-10 14:31:38

+0

OP包含单词'折线',这暗示了2-D而不是3-D。没有? – 2012-01-10 14:38:59

+0

'完整的多边形数据库','将这些点阵转换为多边形/多段线对象'。甚至一条线可以存在于三维空间中。 – MatBailie 2012-01-10 14:43:30

1

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

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

有关CodeProject上这种技术的一个例子文章:Creating User-Defined Data Types in SQL Server 2005

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

相关问题