C# 计算一个坐标是否在另一个坐标的范围内

C# 计算一个坐标是否在另一个坐标的范围内,c#,windows-phone-7,location,C#,Windows Phone 7,Location,我正在编写一个Windows Phone 7应用程序,它需要具有位置感知功能。具体地说,我希望在手机到达某个特定位置的(固定)范围内(比如0.5英里)时运行一些(c#)代码。我在内存中有物理位置的所有lat/long数据。我将使用获取设备的当前坐标。现在唯一的技巧是计算用户是否在任何位置的范围内 谢谢 更新:正如承诺的那样,这里有一个小C#函数,它使用计算距离的方法。希望它能帮助别人。注意:我正在编写一个WindowsPhone7应用程序,因此使用了GeoLocation类。如果使用的是“常规”

我正在编写一个Windows Phone 7应用程序,它需要具有位置感知功能。具体地说,我希望在手机到达某个特定位置的(固定)范围内(比如0.5英里)时运行一些(c#)代码。我在内存中有物理位置的所有lat/long数据。我将使用获取设备的当前坐标。现在唯一的技巧是计算用户是否在任何位置的范围内

谢谢

更新:正如承诺的那样,这里有一个小C#函数,它使用计算距离的方法。希望它能帮助别人。注意:我正在编写一个WindowsPhone7应用程序,因此使用了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;
    }
内部常数双接地Radiusinkilometers=6371;
/// 
///余弦公式的简单球面定律
///将条件良好的结果降低到
///距离小到1米左右。
/// 
///“乌鸦飞”点之间的距离(以公里为单位)
/// 
专用静态双SpericalLawOfCosines(地理坐标从,地理坐标到)
{
return(Math.Acos)(
Math.Sin(从.纬度)*Math.Sin(到.纬度)+
Math.Cos(从纬度)*Math.Cos(到纬度)*
Math.Cos(to.Longitude-from.Longitude)
)*EarthsRadiusInKilometers)
.ToRadians();
}
/// 
///双弧度
/// 
公共静态双环面(此双d)
{
返回值(Math.PI/180)*d;
}
一个快速搜索提出了一个计算地球上两点之间距离的公式。直接从链接页面引用:

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).

只需插入当前位置和另一个位置的lat/long值,就可以得到
d
,这是这两个点之间的距离(以km为单位)。

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

var distance = coordinateA.GetDistanceTo(coordinateB);
(其中坐标A和B为地理坐标类型)


请参阅。

此方法是可靠的,请务必了解其局限性。无论如何,这并不准确,如果你在山区,那么剧烈的海拔变化也会起作用。不过,在大多数情况下,这应该很好。谢谢大家。忽略高程问题一分钟,关于精度的限制是什么?你是说我想要的颗粒越细,精确度就越低?i、 50英里的范围是相当精确的,但50米的范围不是很精确?这是一个大圆圈计算。计算本身没有错误,您的估计位置有错误。你的GPS接收器知道你在哪里+/-一定数量(取决于接收器、卫星数量等)。比方说,它是+/-25米。好吧,如果你说的是50英里的距离,那么按百分比计算,这并不遥远。如果你说的距离是50米,那么这是一个非常大的数字。非常感谢你的澄清。一旦我翻译了上面的内容,我会试着发布c#,这样其他人就可以从中受益。出于好奇,你为什么不使用haversine的java源代码所在的同一页上介绍的更简单(更快)的特殊余弦定律呢?作者指出,对于大于1米的距离,这是推荐的,也是精确的。我刚刚重新阅读了这篇文章,你是对的,余弦球面定律更简单。事实上,我实现了这两个功能,以了解它是如何实现的——我也将发布该代码。谢谢…我不知道这里有这个。我爱你。。。谢谢哇!我也不知道里面有这个!