SQL Server:检查两个地理/几何的边界是不是相互交汇

Posted

技术标签:

【中文标题】SQL Server:检查两个地理/几何的边界是不是相互交汇【英文标题】:SQL Server : check if the boundaries of two geographies/geometries meet each otherSQL Server:检查两个地理/几何的边界是否相互交汇 【发布时间】:2021-03-30 11:57:06 【问题描述】:

我想检查两个地理/几何的边界是否相互相遇/连接/接触。

在下图中:

对于案例 1 - 使用 STContains() 检查 B 在 A 内 对于案例 2 - 使用 STOverlaps() 检查 B 和 A 重叠/相交 对于案例 3 - 字符串 STDiatance() 但当 STOverlaps() 导致 0 时它似乎给出 0 这是不正确的。当STOverlaps() 返回一些值时,它应该返回一些值。

如何确认两个边界是否相互接触?

【问题讨论】:

我想你想要的是STIntersects():docs.microsoft.com/en-us/sql/t-sql/spatial-geometry/…。 @GordonLinoff 早些时候我使用过 STIntersects 但即使只有边界接触,它也总是给出 1。我想在边界接触时忽略并只取适当的相交记录 【参考方案1】:

您似乎对重叠有一个非常具体的定义。你想做的事情从STIntersection()开始。

然后您必须检查结果是否是您想要的。我不确定那是什么:

也许维度是 1(或更大)。 也许不止一点。 也许路口的长度大于某个阈值。

【讨论】:

【参考方案2】:

看来你可以通过STAreaSTIntersection 得到你想要的:

declare @circle1 geometry =  geometry::STGeomFromText('POINT (0 0)', 0).STBuffer(1);

declare @leftHalfPlane geometry = geometry::STGeomFromText('POLYGON ((0 100, -100 100, -100 -100, 0 -100, 0 100))', 0);

declare @leftcircle1 geometry = @circle1.STIntersection(@leftHalfPlane);
declare @rightCircle1 geometry = @circle1.STDifference(@leftHalfPlane);

declare @inter geometry = @leftcircle1.STIntersection(@rightcircle1);

select @inter
select @inter.STArea();

select @leftcircle1.STIntersects(@rightCircle1);

这里我们定义一个左右半圆,看到它们相交的STArea 为零,虽然STIntersects 说它们相交。

但是,如果您有任何类型的真实数据,您几乎肯定会发现出现的不规则区域(例如您在案例 3 中绘制的)没有重叠的接触实际上有一小部分共同点。就像比较浮点数一样,您可能希望对面积测试有一些容忍度,而不是简单地“为零”/“不为零”。

【讨论】:

以上是关于SQL Server:检查两个地理/几何的边界是不是相互交汇的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server Spatial:是几何类型还是地理类型的变量?

几何列上的 SQL Server 平面世界地图

检查地理位置是不是在边界内

将有效的几何形状保存到 Sql Server 2008 地理列中

SQL Server 地理测试点是不是在范围内 - STWithin() 做啥?

在Spark SQL作业中使用地理空间函数