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】:看来你可以通过STArea
的STIntersection
得到你想要的:
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 2008 地理列中