查找两个多边形之间的最短距离(SqlGeography c#) [英] Finding shortest distance between two polygons(SqlGeography c# )

查看:0
本文介绍了查找两个多边形之间的最短距离(SqlGeography c#)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想找出两个SqlGeography多边形之间的最短距离。我知道有一个方法ShortestLineTo(https://msdn.microsoft.com/en-us/library/ff929252.aspx),但它在这样做的时候会给出空字符串。 有谁能给我推荐一些替代方法吗?

推荐答案

应按逆时针顺序定义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:点顺序是逆时针,因此@g1是一个包含POINT(2,2)

的多边形

@g2:点顺序为逆时针,因此@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表示多边形包含世界上非常大的区域。

这篇关于查找两个多边形之间的最短距离(SqlGeography c#)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆