我正在编写一个需要识别位置的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;
}
答案 0 :(得分:5)
由于您使用的是GeoCoordinate,为什么要在该类已经存在时自己实现呢?
var distance = coordinateA.GetDistanceTo(coordinateB);
(其中coordinateA和B的类型为GeoCoordinate)
答案 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
,这是这两点之间的距离。