找到两个多边形之间的最短距离(SqlGeography c#)

时间:2015-05-20 18:01:28

标签: c# sql sql-server spatial

我想找到两个SqlGeography多边形之间的最短距离。我知道有一个方法ShortestLineTohttps://msdn.microsoft.com/en-us/library/ff929252.aspx),但它在执行此操作时会给出空字符串。 任何人都可以建议我这样做的另一种方法吗? enter image description here

2 个答案:

答案 0 :(得分:2)

使用ShortestLineTo

  

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

答案 1 :(得分:2)

您应该以逆时针顺序定义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来检查多边形是否包含太大的区域,以便您了解错误定义的地理位置。

Envelope angle demonstration screenshot

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