【问题标题】: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的距离,推荐且准确。
  • 我刚刚重读了这篇文章,你是对的,余弦球定律更简单。事实上,我实现了两者以查看它是如何完成的 - 我也会发布该代码。谢谢...

标签: c# windows-phone-7 location


【解决方案1】:

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

var distance = coordinateA.GetDistanceTo(coordinateB);

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

请参阅MDSN documentation

【讨论】:

  • 我不知道它在那里。我喜欢stackoverflow...谢谢!
  • 哇!我也不知道它在里面!
  • 在 .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#,以便其他人可以从中受益..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多