Calculate bearing between two locations (lat, long)

后端 未结 7 1550
不知归路
不知归路 2020-12-13 20:35

I\'m trying to develop my own augmented reality engine.

Searching on internet, I\'ve found this useful tutorial. Reading it I see that the important thing is bearing

相关标签:
7条回答
  • 2020-12-13 20:42

    /* Kirit vaghela answer has been modified.. Math.sin gives the radian value so to get degree value we need to pass Math.toRadians(value) inside Math.sin() or Math.cos() */

        double lat1 = 39.099912;
        double lat2 = 38.627089;
        double lng1 = -94.581213;
        double lng2 = -90.200203;
    
        double dLon = (lng2-lng1);
        double x = Math.sin(Math.toRadians(dLon)) * Math.cos(Math.toRadians(lat2));
        double y = Math.cos(Math.toRadians(lat1))*Math.sin(Math.toRadians(lat2)) - Math.sin(Math.toRadians(lat1))*Math.cos(Math.toRadians(lat2))*Math.cos(Math.toRadians(dLon));
        double bearing = Math.toDegrees((Math.atan2(x, y)));
        System.out.println("BearingAngle : "+bearing);
    
    0 讨论(0)
  • 2020-12-13 20:44

    In the formula

    float possibleAzimuth = (M_PI * .5f) - atan(latitudinalDifference / longitudinalDifference);

    the term (M_PI * .5f) means π/2 which is 90°. That means that it is the same formula that you stated at first, because regarding to the figure above it holds

    β = arctan (a/b) = 90° - arctan(b/a).

    So both formulas are similar if a refers to the difference in longitude and b in the difference in latitude. The last formula calculates again the same using the first part of my equation.

    0 讨论(0)
  • 2020-12-13 20:46

    I know this question is old, but here is an easier solution:

    float bearing = loc1.bearingTo(loc2);

    0 讨论(0)
  • 2020-12-13 20:49

    If you want you can take a look at the code used in mixare augmented reality engine, it's on github and there's an iPhone version as well: github.com/mixare

    0 讨论(0)
  • 2020-12-13 20:51

    Try this for accurate result:

    private static double degreeToRadians(double latLong) {
        return (Math.PI * latLong / 180.0);
    }
    
    private static double radiansToDegree(double latLong) {
        return (latLong * 180.0 / Math.PI);
    }
    
    public static double getBearing() {
    
    //Source
    JSONObject source = step.getJSONObject("start_location");
    double lat1 = Double.parseDouble(source.getString("lat"));
    double lng1 = Double.parseDouble(source.getString("lng"));
    
    // destination
    JSONObject destination = step.getJSONObject("end_location");
    double lat2 = Double.parseDouble(destination.getString("lat"));
    double lng2 = Double.parseDouble(destination.getString("lng"));
    
        double fLat = degreeToRadians(lat1);
        double fLong = degreeToRadians(lng1);
        double tLat = degreeToRadians(lat2);
        double tLong = degreeToRadians(lng2);
    
        double dLon = (tLong - fLong);
    
        double degree = radiansToDegree(Math.atan2(sin(dLon) * cos(tLat),
                cos(fLat) * sin(tLat) - sin(fLat) * cos(tLat) * cos(dLon)));
    
        if (degree >= 0) {
            return degree;
        } else {
            return 360 + degree;
        }
    }
    

    You can test bearing result on http://www.sunearthtools.com/tools/distance.php .

    0 讨论(0)
  • 2020-12-13 20:54

    Calculate bearing

    //Source
    JSONObject source = step.getJSONObject("start_location");
    double lat1 = Double.parseDouble(source.getString("lat"));
    double lng1 = Double.parseDouble(source.getString("lng"));
    
    // destination
    JSONObject destination = step.getJSONObject("end_location");
    double lat2 = Double.parseDouble(destination.getString("lat"));
    double lng2 = Double.parseDouble(destination.getString("lng"));
    
    double dLon = (lng2-lng1);
    double y = Math.sin(dLon) * Math.cos(lat2);
    double x = Math.cos(lat1)*Math.sin(lat2) - Math.sin(lat1)*Math.cos(lat2)*Math.cos(dLon);
    double brng = Math.toDegrees((Math.atan2(y, x)));
    brng = (360 - ((brng + 360) % 360));
    

    Convert Degrees into Radians

    Radians = Degrees * PI / 180
    

    Convert Radians into Degrees

    Degrees = Radians * 180 / PI
    
    0 讨论(0)
提交回复
热议问题