您应该按逆时针顺序定义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 表示多边形包含了世界的一个非常大的区域。