gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:21:29 25 4
gpt4 key购买 nike

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

最佳答案

您应该按逆时针顺序定义一个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 来检查多边形是否包含太大的区域,以便您了解错误定义的地理区域。

Envelope angle demonstration screenshot

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

关于c# - 查找两个多边形之间的最短距离(SqlGeography c#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30357147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com