2

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

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

我已经看到建议使用不同的方法来执行此操作,但给出的示例中没有一个完全符合我的需求。

我很高兴收到那些愿意提供他们经验的人的意见。

额外的:

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

4

3 回答 3

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 记录运行了此程序。可能有更好的方法,但由于没有其他人有答案,这是我试图为你解答的问题。希望能帮助到你!

于 2012-06-14T02:38:22.413 回答
1

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

于 2012-01-10T14:30:42.267 回答
1

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

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

CodeProject 上有关此技术的示例文章:在 SQL Server 2005 中创建用户定义的数据类型

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

于 2012-01-10T19:50:48.960 回答