【问题标题】: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() 返回一些值时,它应该返回一些值。

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

【问题讨论】:

标签: sql sql-server geometry geography


【解决方案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 中绘制的)没有重叠的接触实际上有一小部分共同点。就像比较浮点数一样,您可能希望对面积测试有一些容忍度,而不是简单地“为零”/“不为零”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      • 2014-06-11
      • 2015-04-03
      • 2020-06-15
      • 2012-07-10
      • 2011-04-19
      相关资源
      最近更新 更多