2010-09-12 15 views
53

Ich versuche, diese Aufgabe zu lösen, und es ist zu viel Zeit:Berechnung der Entfernung zwischen zwei Punkten, mit Breitengrad Länge, was mache ich falsch?

Hier ist mein Versuch, es ist nur ein Ausschnitt aus meinem Code:

final double RADIUS = 6371.01; 
double temp = Math.cos(Math.toRadians(latA)) 
      * Math.cos(Math.toRadians(latB)) 
      * Math.cos(Math.toRadians((latB) - (latA))) 
      + Math.sin(Math.toRadians(latA)) 
      * Math.sin(Math.toRadians(latB)); 
    return temp * RADIUS * Math.PI/180; 

ich diese Formeln bin mit dem Breitengrad zu erhalten und Länge: x = Deg + (Min + Sec/60)/60)

Dank

Antwort

118

Der von Dommer oben angegebene Java-Code gibt leicht falsche Ergebnisse, aber die kleinen Fehler addieren sich, wenn Sie eine GPS-Spur verarbeiten. Hier ist eine Implementierung der Haversine-Methode in Java, die auch Höhenunterschiede zwischen zwei Punkten berücksichtigt.

/** 
* Calculate distance between two points in latitude and longitude taking 
* into account height difference. If you are not interested in height 
* difference pass 0.0. Uses Haversine method as its base. 
* 
* lat1, lon1 Start point lat2, lon2 End point el1 Start altitude in meters 
* el2 End altitude in meters 
* @returns Distance in Meters 
*/ 
public static double distance(double lat1, double lat2, double lon1, 
     double lon2, double el1, double el2) { 

    final int R = 6371; // Radius of the earth 

    double latDistance = Math.toRadians(lat2 - lat1); 
    double lonDistance = Math.toRadians(lon2 - lon1); 
    double a = Math.sin(latDistance/2) * Math.sin(latDistance/2) 
      + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) 
      * Math.sin(lonDistance/2) * Math.sin(lonDistance/2); 
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); 
    double distance = R * c * 1000; // convert to meters 

    double height = el1 - el2; 

    distance = Math.pow(distance, 2) + Math.pow(height, 2); 

    return Math.sqrt(distance); 
} 
+6

Warum nicht Math.toRadians() statt deg2rad()? Es wäre wirklich selbstenthaltend. –

+2

@DavidG: Was ist die Einheit der Ausgabe? –

+2

@Bala - Meine schlechte, ist es in den Kommentar auf den Code auf meinem Computer, aber hier fehlt. Entfernung in Metern. –

61

Hier ist ein Java function that calculates the distance between two lat/long points.

bearbeiten

fand ich another reference to the code.

Und, unten veröffentlicht, nur für den Fall, dass es wieder verschwindet.

private double distance(double lat1, double lon1, double lat2, double lon2, char unit) { 
     double theta = lon1 - lon2; 
     double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta)); 
     dist = Math.acos(dist); 
     dist = rad2deg(dist); 
     dist = dist * 60 * 1.1515; 
     if (unit == 'K') { 
     dist = dist * 1.609344; 
     } else if (unit == 'N') { 
     dist = dist * 0.8684; 
     } 
     return (dist); 
    } 

    /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ 
    /*:: This function converts decimal degrees to radians    :*/ 
    /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ 
    private double deg2rad(double deg) { 
     return (deg * Math.PI/180.0); 
    } 

    /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ 
    /*:: This function converts radians to decimal degrees    :*/ 
    /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ 
    private double rad2deg(double rad) { 
     return (rad * 180.0/Math.PI); 
    } 

    System.out.println(distance(32.9697, -96.80322, 29.46786, -98.53506, 'M') + " Miles\n"); 
    System.out.println(distance(32.9697, -96.80322, 29.46786, -98.53506, 'K') + " Kilometers\n"); 
    System.out.println(distance(32.9697, -96.80322, 29.46786, -98.53506, 'N') + " Nautical Miles\n"); 
+1

Leider - 404 Not – svenkapudija

+0

mit neuem Link und Code aktualisiert gefunden. – dommer

+3

funktioniert nur das Zitat für die Einheit zu beheben .. seine char so einfaches Zitat nicht double .. –

4

Hier ist eine Seite mit Javascript-Beispielen für verschiedene sphärische Berechnungen. Der allererste auf der Seite sollte Ihnen geben, was Sie brauchen.

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

Hier ist der Code Javascript

var R = 6371; // km 
var dLat = (lat2-lat1).toRad(); 
var dLon = (lon2-lon1).toRad(); 
var a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
     Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) * 
     Math.sin(dLon/2) * Math.sin(dLon/2); 
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
var d = R * c; 

Wo 'd' den Abstand halten wird.

+0

Kann "a" jemals negativ sein? –

0

Diese wikipedia article liefert die Formeln und ein Beispiel. Der Text ist in Deutsch, aber die Berechnungen sprechen für sich.

9

Hinweis: Diese Lösung funktioniert nur für kurze Entfernungen.

Ich habe versucht, domers Beitrag Formel für eine Anwendung zu verwenden und fand es gut für lange Strecken, aber in meinen Daten habe ich alle sehr kurze Distanzen verwendet, und domers Beitrag war sehr schlecht. Ich brauchte Geschwindigkeit, und die komplexeren Geo- kalden funktionierten gut, waren aber zu langsam. Also, wenn Sie Geschwindigkeit brauchen und alle Berechnungen, die Sie machen, sind kurz (vielleicht < 100m oder so). Ich fand diese kleine Annäherung großartig. Es nimmt an, dass die Welt flach ist. Beachte, dass du es nicht für lange Distanzen verwendest. Es funktioniert, indem du die Entfernung eines einzelnen Längen- und Breitengrads am gegebenen Breitengrad annähern und die Entfernung des Pythagoras in Metern zurückgeben kannst.

public class FlatEarthDist { 
    //returns distance in meters 
    public static double distance(double lat1, double lng1, 
             double lat2, double lng2){ 
    double a = (lat1-lat2)*FlatEarthDist.distPerLat(lat1); 
    double b = (lng1-lng2)*FlatEarthDist.distPerLng(lat1); 
    return Math.sqrt(a*a+b*b); 
    } 

    private static double distPerLng(double lat){ 
     return 0.0003121092*Math.pow(lat, 4) 
      +0.0101182384*Math.pow(lat, 3) 
       -17.2385140059*lat*lat 
      +5.5485277537*lat+111301.967182595; 
    } 

    private static double distPerLat(double lat){ 
      return -0.000000487305676*Math.pow(lat, 4) 
       -0.0033668574*Math.pow(lat, 3) 
       +0.4601181791*lat*lat 
       -1.4558127346*lat+110579.25662316; 
    } 
} 
1
package distanceAlgorithm; 

public class CalDistance { 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
    CalDistance obj=new CalDistance(); 
    /*obj.distance(38.898556, -77.037852, 38.897147, -77.043934);*/ 
     System.out.println(obj.distance(38.898556, -77.037852, 38.897147, -77.043934, "M") + " Miles\n"); 
     System.out.println(obj.distance(38.898556, -77.037852, 38.897147, -77.043934, "K") + " Kilometers\n"); 
     System.out.println(obj.distance(32.9697, -96.80322, 29.46786, -98.53506, "N") + " Nautical Miles\n");  
    } 
    public double distance(double lat1, double lon1, double lat2, double lon2, String sr) { 


      double theta = lon1 - lon2; 
      double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta)); 
      dist = Math.acos(dist); 
      dist = rad2deg(dist); 
      dist = dist * 60 * 1.1515; 
      if (sr.equals("K")) { 
      dist = dist * 1.609344; 
      } else if (sr.equals("N")) { 
      dist = dist * 0.8684; 
      } 
      return (dist); 
     } 
    public double deg2rad(double deg) { 
      return (deg * Math.PI/180.0); 
     } 
    public double rad2deg(double rad) { 
      return (rad * 180.0/Math.PI); 
     } 


    } 
Verwandte Themen