计算两个纬度和经度地理坐标之间的距离

我正在计算两个GeoCoordinates之间的距离。我正在针对其他3-4个应用测试我的应用。当我计算距离时,我计算得到的平均值为3.3英里,而其他应用程序的距离为3.5英里。这与我正在尝试执行的计算有很大不同。有没有好的类库来计算距离?我在C#中计算它是这样的:


public static double Calculate(double sLatitude,double sLongitude, double eLatitude, 

                               double eLongitude)

{

    var radiansOverDegrees = (Math.PI / 180.0);


    var sLatitudeRadians = sLatitude * radiansOverDegrees;

    var sLongitudeRadians = sLongitude * radiansOverDegrees;

    var eLatitudeRadians = eLatitude * radiansOverDegrees;

    var eLongitudeRadians = eLongitude * radiansOverDegrees;


    var dLongitude = eLongitudeRadians - sLongitudeRadians;

    var dLatitude = eLatitudeRadians - sLatitudeRadians;


    var result1 = Math.Pow(Math.Sin(dLatitude / 2.0), 2.0) + 

                  Math.Cos(sLatitudeRadians) * Math.Cos(eLatitudeRadians) * 

                  Math.Pow(Math.Sin(dLongitude / 2.0), 2.0);


    // Using 3956 as the number of miles around the earth

    var result2 = 3956.0 * 2.0 * 

                  Math.Atan2(Math.Sqrt(result1), Math.Sqrt(1.0 - result1));


    return result2;

}

我能做错什么?我应该先以km为单位计算,然后转换为里程?


慕的地6264312
浏览 589回答 3
3回答

喵喔喔

该会有地理座标类(.NET框架4和更高)已经有GetDistanceTo方法。var sCoord = new GeoCoordinate(sLatitude, sLongitude);var eCoord = new GeoCoordinate(eLatitude, eLongitude);return sCoord.GetDistanceTo(eCoord);距离以米为单位。您需要引用System.Device。

牧羊人nacy

GetDistance是最好的解决方案,但在很多情况下我们无法使用此方法(例如通用应用程序)用于计算 coorindates之间距离的算法的伪代码:public static double DistanceTo(double lat1, double lon1, double lat2, double lon2, char unit = 'K'){    double rlat1 = Math.PI*lat1/180;    double rlat2 = Math.PI*lat2/180;    double theta = lon1 - lon2;    double rtheta = Math.PI*theta/180;    double dist =        Math.Sin(rlat1)*Math.Sin(rlat2) + Math.Cos(rlat1)*        Math.Cos(rlat2)*Math.Cos(rtheta);    dist = Math.Acos(dist);    dist = dist*180/Math.PI;    dist = dist*60*1.1515;    switch (unit)    {        case 'K': //Kilometers -> default            return dist*1.609344;        case 'N': //Nautical Miles             return dist*0.8684;        case 'M': //Miles            return dist;    }    return dist;}真实世界C#实现,它使用扩展方法用法:var distance = new Coordinates(48.672309, 15.695585)                .DistanceTo(                    new Coordinates(48.237867, 16.389477),                    UnitOfLength.Kilometers                );执行:public class Coordinates{    public double Latitude { get; private set; }    public double Longitude { get; private set; }    public Coordinates(double latitude, double longitude)    {        Latitude = latitude;        Longitude = longitude;    }}public static class CoordinatesDistanceExtensions{    public static double DistanceTo(this Coordinates baseCoordinates, Coordinates targetCoordinates)    {        return DistanceTo(baseCoordinates, targetCoordinates, UnitOfLength.Kilometers);    }    public static double DistanceTo(this Coordinates baseCoordinates, Coordinates targetCoordinates, UnitOfLength unitOfLength)    {        var baseRad = Math.PI * baseCoordinates.Latitude / 180;        var targetRad = Math.PI * targetCoordinates.Latitude/ 180;        var theta = baseCoordinates.Longitude - targetCoordinates.Longitude;        var thetaRad = Math.PI * theta / 180;        double dist =            Math.Sin(baseRad) * Math.Sin(targetRad) + Math.Cos(baseRad) *            Math.Cos(targetRad) * Math.Cos(thetaRad);        dist = Math.Acos(dist);        dist = dist * 180 / Math.PI;        dist = dist * 60 * 1.1515;        return unitOfLength.ConvertFromMiles(dist);    }}public class UnitOfLength{    public static UnitOfLength Kilometers = new UnitOfLength(1.609344);    public static UnitOfLength NauticalMiles = new UnitOfLength(0.8684);    public static UnitOfLength Miles = new UnitOfLength(1);    private readonly double _fromMilesFactor;    private UnitOfLength(double fromMilesFactor)    {        _fromMilesFactor = fromMilesFactor;    }    public double ConvertFromMiles(double input)    {        return input*_fromMilesFactor;    }} 

忽然笑

这是JavaScript版本的男人和女孩function distanceTo(lat1, lon1, lat2, lon2, unit) {      var rlat1 = Math.PI * lat1/180      var rlat2 = Math.PI * lat2/180      var rlon1 = Math.PI * lon1/180      var rlon2 = Math.PI * lon2/180      var theta = lon1-lon2      var rtheta = Math.PI * theta/180      var dist = Math.sin(rlat1) * Math.sin(rlat2) + Math.cos(rlat1) * Math.cos(rlat2) * Math.cos(rtheta);      dist = Math.acos(dist)      dist = dist * 180/Math.PI      dist = dist * 60 * 1.1515      if (unit=="K") { dist = dist * 1.609344 }      if (unit=="N") { dist = dist * 0.8684 }      return dist}
打开App,查看更多内容
随时随地看视频慕课网APP