计算一个坐标是不是在另一个坐标范围内

Posted

技术标签:

【中文标题】计算一个坐标是不是在另一个坐标范围内【英文标题】:Calculate whether one coordinate is within range of another计算一个坐标是否在另一个坐标范围内 【发布时间】:2011-04-10 12:31:51 【问题描述】:

我正在编写一个需要感知位置的 Windows Phone 7 应用。具体来说,我希望在手机进入特定位置的(固定)范围内(例如 0.5 英里)时运行一些(c#)代码。我拥有内存中物理位置的所有纬度/经度数据。我将使用Geo Coordinate Watcher class 来获取设备的当前坐标。现在唯一的技巧是计算用户是否在任何位置的范围内。

谢谢!

更新:正如所承诺的,这里是使用Spherical Law of Cosines 计算距离方法的小C# 函数。希望它可以帮助别人。注意:我正在编写一个 Windows Phone 7 应用程序,因此使用了 GeoLocation 类。如果您使用的是“常规”c#,那么您可以更改函数以接受函数所需的两个坐标对。

    internal const double EarthsRadiusInKilometers = 6371;

    /// <summary>
    /// The simple spherical law of cosines formula 
    /// gives well-conditioned results down to 
    /// distances as small as around 1 metre. 
    /// </summary>
    /// <returns>Distance between points "as the crow flies" in kilometers</returns>
    /// <see cref="http://www.movable-type.co.uk/scripts/latlong.html"/>
    private static double SpericalLawOfCosines(GeoCoordinate from, GeoCoordinate to)
    
        return ( Math.Acos (
                Math.Sin(from.Latitude) * Math.Sin(to.Latitude) +
                Math.Cos(from.Latitude) * Math.Cos(to.Latitude) *
                Math.Cos(to.Longitude - from.Longitude)
            ) * EarthsRadiusInKilometers)
            .ToRadians();
    

    /// <summary>
    /// To a radian double 
    /// </summary>
    public static double ToRadians(this double d)
    
        return (Math.PI / 180) * d;
    

【问题讨论】:

出于好奇,您为什么不使用更简单(更快)的余弦空间定律,在您访问haversine 的Java 源代码的同一页面上提供?作者指出,对于> 1m的距离,推荐且准确。 我刚刚重读了这篇文章,你是对的,余弦球定律更简单。事实上,我实现了两者以查看它是如何完成的 - 我也会发布该代码。谢谢... 【参考方案1】:

既然您使用的是 GeoCoordinate,为什么当它已经存在于该类中时自己实现它?

var distance = coordinateA.GetDistanceTo(coordinateB);

(其中坐标A和B的类型为地理坐标)

请参阅MDSN documentation。

【讨论】:

我不知道它在那里。我喜欢***...谢谢! 哇!我也不知道它在里面! 在 .NET Core 中不存在。然而。【参考方案2】:

通过快速搜索找到this page,其中包含计算地球上两点之间距离的公式。直接从链接页面引用:

Haversine formula:

R = earth’s radius (mean radius = 6,371km)
Δlat = lat2− lat1
Δlong = long2− long1
a = sin²(Δlat/2) + cos(lat1).cos(lat2).sin²(Δlong/2)
c = 2.atan2(√a, √(1−a))
d = R.c

(Note that angles need to be in radians to pass to trig functions).

只需插入您当前位置和另一个位置的纬度/经度值,您应该会得到d,即这两点之间的距离(以公里为单位)。

【讨论】:

这种方法是可靠的,只是一定要了解它的局限性。这无论如何都不准确,如果你在山区,那么剧烈的海拔变化也会发挥作用。不过,对于大多数用途来说,这应该没问题。 谢谢大家。暂时不考虑海拔问题,关于准确性的限制是什么?你是说我想走的越细粒度越不准确?即 50 英里的范围相当准确,但 50 米的范围不是很准确? 这是一个很棒的圆计算。计算本身没有错误,你估计的位置。您的 GPS 接收器知道您在哪里 +/- 一些量(取决于接收器、卫星数量等)。比方说,例如,它是 +/-25m。好吧,如果您说的是 50 英里的距离,那么按百分比计算,它并没有那么远。如果你说的是 50m 的距离,那么这是一个非常大的距离。 非常感谢您的澄清。翻译完上述内容后,我将尝试发布 c#,以便其他人可以从中受益..

以上是关于计算一个坐标是不是在另一个坐标范围内的主要内容,如果未能解决你的问题,请参考以下文章

MySQL选择范围内的坐标

计算半径内的 100 英里

“我当前的地理位置”和其他坐标之间的计算

计算vtkRender的屏幕坐标范围和物理坐标范围

如何检查坐标是不是在以公里为单位的半径范围内?

二维计算几何基础