查找两个多边形之间的最短距离(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
表示多边形包含世界上很大的一个区域。
我想找到两个 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
表示多边形包含世界上很大的一个区域。