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

Finding shortest distance between two polygons(SqlGeography c# )

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

使用 ShortestLineTo

An empty LineString instance is returned when the two geography instances intersect each other.

您应该按逆时针顺序定义一个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是一个包含整个世界[=59的多边形=] 除了@G2 多边形。它还包含@G1多边形,所以@G1和@G3之间的最短距离没有任何意义。

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

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

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

结果将是 GEOMETRYCOLLECTION EMPTY,因为它们包含相同的区域。所以它们相交并且 ShortestLineTo returns 的结果是 LINESTRING EMPTY 因为它们彼此相交。

再加一分

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

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