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

时间:2010-09-09 23:12:16

标签: c# windows-phone-7 location

我正在编写一个需要识别位置的Windows Phone 7应用。具体来说,我想要一些(c#)代码在手机进入特定位置(例如0.5英里)的(固定)范围内时运行。我有内存中物理位置的所有lat / long数据。我将使用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;
    }

2 个答案:

答案 0 :(得分:5)

由于您使用的是GeoCoordinate,为什么要在该类已经存在时自己实现呢?

var distance = coordinateA.GetDistanceTo(coordinateB);

(其中coordinateA和B的类型为GeoCoordinate)

请参阅MDSN documentation

答案 1 :(得分: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,这是这两点之间的距离。