代码之家  ›  专栏  ›  技术社区  ›  James J

计算两个位置坐标之间的轴承

  •  38
  • James J  · 技术社区  · 14 年前

    非常“简单”的问题:给定两个坐标系,如何得到从第一个坐标系到第二个坐标系的方向角(弧度)?我对此做了很多研究,包括一般问题和Objective-C/Cocoa-Touch/iOS。

    - (float) getHeadingForDirectionFromCoordinate:(CLLocationCoordinate2D)fromLoc toCoordinate:(CLLocationCoordinate2D)toLoc
    {
        float fLat = fromLoc.latitude;
        float fLng = fromLoc.longitude;
        float tLat = toLoc.latitude;
        float tLng = toLoc.longitude;
    
        return atan2(sin(fLng-tLng)*cos(tLat), cos(fLat)*sin(tLat)-sin(fLat)*cos(tLat)*cos(fLng-tLng));         
    }
    

    从50.405018到8.437500

    至51.339802、12.403340

    我的方法返回:5.918441弧度

    应为1.18660576弧度

    (见 http://www.movable-type.co.uk/scripts/latlong.html http://www.movable-type.co.uk/scripts/latlong-map.html?lat1=50.405018&long1=8.437500&lat2=51.339802&long2=12.403340 )

    有什么想法吗?我的代码有问题吗?也许我误解了数学函数的工作原理?

    4 回复  |  直到 7 年前
        1
  •  31
  •   Oren Trutner    14 年前

    你的数学是正确的,但有以下例外:

    1. 一定要转换 , 特隆 在应用任何 罪恶() cos() 对他们来说。除以180.0,再乘以π。

    2. 输入之间的增量 fLng公司 作为 tLng法兰 ,而不是相反。请注意,此差异在表达式中出现两次。

    有了这些变化,我得到了1.18660677830947弧度与双精度数学和问题中的值。

        2
  •  53
  •   heinst    9 年前

    #define degreesToRadians(x) (M_PI * x / 180.0)
    #define radiansToDegrees(x) (x * 180.0 / M_PI)
    
    - (float)getHeadingForDirectionFromCoordinate:(CLLocationCoordinate2D)fromLoc toCoordinate:(CLLocationCoordinate2D)toLoc
    {
        float fLat = degreesToRadians(fromLoc.latitude);
        float fLng = degreesToRadians(fromLoc.longitude);
        float tLat = degreesToRadians(toLoc.latitude);
        float tLng = degreesToRadians(toLoc.longitude);
    
        float degree = radiansToDegrees(atan2(sin(tLng-fLng)*cos(tLat), cos(fLat)*sin(tLat)-sin(fLat)*cos(tLat)*cos(tLng-fLng)));
    
        if (degree >= 0) {
            return degree;
        } else {
            return 360+degree;
        }
    }
    
        3
  •  10
  •   Valeriy Van    7 年前

    extension CLLocationCoordinate2D {
        func bearing(to point: CLLocationCoordinate2D) -> Double {
            func degreesToRadians(_ degrees: Double) -> Double { return degrees * Double.pi / 180.0 }
            func radiansToDegrees(_ radians: Double) -> Double { return radians * 180.0 / Double.pi }
    
            let lat1 = degreesToRadians(latitude)
            let lon1 = degreesToRadians(longitude)
    
            let lat2 = degreesToRadians(point.latitude);
            let lon2 = degreesToRadians(point.longitude);
    
            let dLon = lon2 - lon1;
    
            let y = sin(dLon) * cos(lat2);
            let x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dLon);
            let radiansBearing = atan2(y, x);
    
            return radiansToDegrees(radiansBearing)
        }
    }
    
        4
  •  -1
  •   Trianto Kontri    12 年前

    你可以用我的密码。。在我的项目中,微控制器使用GPS获取数据。

    #define d2r ((22/7.0)/180.0)
    #define r2d (180.0/(22/7.0))
    
    double get_heading1(double lat1, double long1, double lat2, double long2)  
    {
        double diff_lat, diff_long;
        double degree;
    
        diff_long =(double) (((long2*1000000)-(long1*1000000))/1000000) * d2r;
        diff_lat = (double) (((lat2*1000000)-(lat1*1000000))/1000000) * d2r;     
    
        degree = r2d     (atan2(sin(diff_long)*cos(d2r*lat2),cos(d2r*lat1)*sin(d2r*lat2)-sin(d2r*lat1)*cos(d2r*lat2)    *cos(diff_long)));
    
        if (degree >= 0) {
            return degree;
        } else {
            return 360+degree;
        }                                                                 
    }