我想找到两个SqlGeography多边形之间的最短距离。我知道有一个方法ShortestLineTo
(https://msdn.microsoft.com/en-us/library/ff929252.aspx),但它在执行此操作时会给出空字符串。
任何人都可以建议我这样做的另一种方法吗?
答案 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之间的最短距离没有任何意义。
使用ReorientObject()
方法,您可以在CW和CCW地理位置之间切换。所以,如果你尝试:
SELECT @G3.ReorientObject().STDifference(@G2).STAsText();
结果将是GEOMETRYCOLLECTION EMPTY
,因为它们包含相同的区域。因此它们相交,ShortestLineTo
的结果返回LINESTRING EMPTY
,因为它们相互交叉。
您可以通过查看EnvelopeAngle
来检查多边形是否包含太大的区域,以便您了解错误定义的地理位置。
如图所示,EnvelopeAngle=180
表示多边形包含世界上非常大的区域。