【问题标题】:Finding shortest distance between two polygons(SqlGeography c# )查找两个多边形之间的最短距离(SqlGeography c#)
【发布时间】:2016-07-21 06:12:39
【问题描述】:

我想找到两个 SqlGeography 多边形之间的最短距离。我知道有一种方法 ShortestLineTo (https://msdn.microsoft.com/en-us/library/ff929252.aspx) 但这样做时会给出空字符串。 任何人都可以建议我一些替代方法吗?

【问题讨论】:

  • 你能发布你的代码示例吗?
  • 添加了示例。请看图。
  • 为您提供答案。

标签: c# sql sql-server spatial


【解决方案1】:

您应该按逆时针顺序定义GEOGRAPHY。如果你定义它 CW,它将是除了你定义的区域之外的所有世界:

DECLARE @G1 GEOGRAPHY = 'POLYGON ((1 1, 3 1, 3 3, 1 3, 1 1))';
DECLARE @G2 GEOGRAPHY = 'POLYGON ((45 45, 45 46, 44 46, 44 45, 45 45))';

//This is what you have defined
DECLARE @G3 GEOGRAPHY = 'POLYGON ((45 45, 44 45, 44 46, 45 46, 45 45))';

@G1:点顺序是CCW,所以@G1 是一个包含POINT(2,2)

的多边形

@G2:点顺序是CCW,所以@G2 是一个包含POINT(44.5,45.5)

的多边形

@G3:点顺序是CW,所以@G3 是一个包含整个世界 的多边形,除了@G2 多边形。它还包含@G1 多边形,所以@G1 和@G3 之间的最短距离没有任何意义。

在 CW 和 CCW 几何形状之间切换

使用ReorientObject() 方法,您可以在CW 和CCW 地理之间切换。所以如果你尝试:

SELECT @G3.ReorientObject().STDifference(@G2).STAsText();

结果将是GEOMETRYCOLLECTION EMPTY,因为它们包含相同的区域。因此它们相交,ShortestLineTo 的结果返回 LINESTRING EMPTY,因为它们彼此相交。

还有一点

您可以通过检查EnvelopeAngle 来检查多边形是否包含过大的区域,以便您了解错误定义的地理区域。

如图所示,EnvelopeAngle=180 表示多边形包含了世界的一个非常大的区域。

【讨论】:

  • @messi 很高兴能提供帮助:)
【解决方案2】:

使用 ShortestLineTo

两个地理时返回一个空的 LineString 实例 实例相互交叉。

【讨论】:

  • 问题是两个地理实例不相交。查看图片以获得清晰度。
  • @messi 他们确实相交,所以 LeMara 指出了正确的问题,但要获得更多解释,您可以查看我的答案。
猜你喜欢
  • 2018-03-01
  • 2020-02-15
  • 1970-01-01
  • 2010-09-10
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 2021-02-17
  • 1970-01-01
相关资源
最近更新 更多