微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 计算给定距离,轴承,起点的端点

我试图找到目的地点,给定起点lat / long,轴承&距离.下面这个网站的计算器给了我所需的结果.

http://www.movable-type.co.uk/scripts/latlong.html

当我尝试通过代码实现相同的时候,我没有得到正确的结果.

以下是我的代码

private  GLatLng poinTradialdistance(double lat1,double lon1,double radianbearing,double radialdistance)
    {
        double rEarth = 6371.01;
        lat1 = DegreetoRadian(lat1);
        lon1 = DegreetoRadian(lon1);
        radianbearing = DegreetoRadian(radianbearing);
        radialdistance = radialdistance / rEarth;
        double lat = Math.Asin(Math.Sin(lat1) * Math.Cos(radialdistance) + Math.Cos(lat1)
                        * Math.Sin(radialdistance) * Math.Cos(radianbearing));
        double lon;
        if (Math.Cos(lat) == 0)
        {  // Endpoint a pole 
            lon = lon1;
        }
        else
        {
            lon = ((lon1 - Math.Asin(Math.Sin(radianbearing) * Math.Sin(radialdistance) / Math.Cos(lat))
                            + Math.PI) % (2 * Math.PI)) - Math.PI;
        }
        lat = RadianToDegree(lat);
        lon = RadianToDegree(lon);
        GLatLng newLatLng = new GLatLng(lat,lon);
        return newLatLng;
    }

    public  double bearing(double lat1,double long1,double lat2,double long2)
    {
        //Convert input values to radians   
        lat1 = DegreetoRadian(lat1);
        long1 = DegreetoRadian(long1);
        lat2 = DegreetoRadian(lat2);
        long2 = DegreetoRadian(long2);

        double deltaLong = long2 - long1;

        double y = Math.Sin(deltaLong) * Math.Cos(lat2);
        double x = Math.Cos(lat1) * Math.Sin(lat2) -
                Math.Sin(lat1) * Math.Cos(lat2) * Math.Cos(deltaLong);
        double bearing = Math.atan2(y,x);
        return bearing;
    }   

   public double DegreetoRadian(double angle)
    {
    return Math.PI * angle / 180.0;
    }

    public double RadianToDegree(double angle)
    {
        return 180.0 * angle / Math.PI;
    }

从主程序,我调用子程序如下 –

double bearing = bearing(-41.294444,174.814444,-40.90521,175.6604);
GLatLng endLatLng = poinTradialdistance(-41.294444,bearing,80);

我得到以下结果 –

bearing=1.02749621782165
endLatLng=-40.5751022737927,174.797458881699

我期望的答案是-40.939722,175.646389(从上面的网站链接).

任何人都可以建议我在代码中出现什么错误

解决方法

这是一些实现你想要做代码.
public static GeoLocation FindPointAtdistanceFrom(GeoLocation startPoint,double initialbearingradians,double distanceKilometres)
{
    const double radiusEarthKilometres = 6371.01;
    var distRatio = distanceKilometres / radiusEarthKilometres;
    var distRatioSine = Math.Sin(distRatio);
    var distRatioCosine = Math.Cos(distRatio);

    var startLaTrad = degreesToradians(startPoint.Latitude);
    var startLonRad = degreesToradians(startPoint.Longitude);

    var startLatCos = Math.Cos(startLaTrad);
    var startLatSin = Math.Sin(startLaTrad);

    var endLaTrads = Math.Asin((startLatSin * distRatioCosine) + (startLatCos * distRatioSine * Math.Cos(initialbearingradians)));

    var endLonRads = startLonRad
        + Math.atan2(
            Math.Sin(initialbearingradians) * distRatioSine * startLatCos,distRatioCosine - startLatSin * Math.Sin(endLaTrads));

    return new GeoLocation
    {
        Latitude = radiansTodegrees(endLaTrads),Longitude = radiansTodegrees(endLonRads)
    };
}

public struct GeoLocation
{
    public double Latitude { get; set; }
    public double Longitude { get; set; }
}

public static double degreesToradians(double degrees)
{
    const double degToRadFactor = Math.PI / 180;
    return degrees * degToRadFactor;
}

public static double radiansTodegrees(double radians)
{
    const double radToDegFactor = 180 / Math.PI;
    return radians * radToDegFactor;
}

原文地址:https://www.jb51.cc/csharp/94353.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐