Geospatial Koordinaten und Entfernung in Kilometern

Dies ist eine Fortsetzung vondiese Frag.

Ich scheine daran festzuhalten. Grundsätzlich muss ich in der Lage sein, hin und her zu konvertieren, um auf Koordinaten zu verweisen, entweder im Standardgradsystem ODER indem ich eine Entfernung nördlich vom Südpol entlang der internationalen Datumslinie und dann eine Entfernung östlich beginnend von diesem Punkt am Datum messe Linie. Zu diesem Zweck (und zu einigen allgemeineren Abstandsmessungen) habe ich eine Methode zum Bestimmen des Abstands zwischen zwei Lat- / Lon-Punkten und eine andere Methode, die einen Lat- / Lon-Punkt, eine Überschrift und einen Abstand verwendet und zurückgibt Der Lat / Lon-Punkt am Ende dieses Kurses.

Hier sind die beiden statischen Methoden, die ich definiert habe:

/* Takes two lon/lat pairs and returns the distance between them in kilometers.
*/
public static double distance (double lat1, double lon1, double lat2, double lon2) {
    double theta = toRadians(lon1-lon2);
    lat1 = toRadians(lat1);
    lon1 = toRadians(lon1);
    lat2 = toRadians(lat2);
    lon2 = toRadians(lon2);

    double dist = sin(lat1)*sin(lat2) + cos(lat1)*cos(lat2)*cos(theta);
    dist = toDegrees(acos(dist)) * 60 * 1.1515 * 1.609344 * 1000;

    return dist;
}

/* endOfCourse takes a lat/lon pair, a heading (in degrees clockwise from north), and a distance (in kilometers), and returns
 * the lat/lon pair that would be reached by traveling that distance in that direction from the given point.
 */
public static double[] endOfCourse (double lat1, double lon1, double tc, double dist) {
    double pi = Math.PI;
    lat1 = toRadians(lat1);
    lon1 = toRadians(lon1);
    tc = toRadians(tc);
    double dist_radians = toRadians(dist / (60 * 1.1515 * 1.609344 * 1000));
    double lat = asin(sin(lat1) * cos(dist_radians) + cos(lat1) * sin(dist_radians) * cos(tc));
    double dlon = atan2(sin(tc) * sin(dist_radians) * cos(lat1), cos(dist_radians) - sin(lat1) * sin(lat));
    double lon = ((lon1-dlon + pi) % (2*pi)) - pi;
    double[] endPoint = new double[2];
    endPoint[0] = lat; endPoint[1] = lon;
    return endPoint;
}

Und hier ist die Funktion, mit der ich es teste:

public static void main(String args[]) throws java.io.IOException, java.io.FileNotFoundException {
    double distNorth = distance(0.0, 0.0, 72.0, 0.0);
    double distEast = distance(72.0, 0.0, 72.0, 31.5);
    double lat1 = endOfCourse(0.0, 0.0, 0.0, distNorth)[0];
    double lon1 = endOfCourse(lat1, 0.0, 90.0, distEast)[1];
    System.out.println("end at: " + lat1 + " / " + lon1);
    return;
}

Die "End at" -Werte sollten ungefähr sein. 72,0 / 31,5. Stattdessen erhalte ich ungefähr 1,25 / 0,021.

Ich nehme an, ich muss etwas Dummes vermissen, vergesse irgendwo Einheiten umzurechnen oder so ... Jede Hilfe wäre sehr dankbar!

UPDATE 1:

Ich hatte (richtig) die Entfernungsfunktion geschrieben, um Meter zurückzugeben, schrieb aber versehentlich Kilometer in die Kommentare ... was mich natürlich verwirrte, als ich heute darauf zurückkam. Wie auch immer, das ist jetzt behoben, und ich habe den Faktorisierungsfehler in der endOfCourse-Methode behoben, und mir wurde auch klar, dass ich vergessen hatte, auch in dieser Methode vom Bogenmaß in Grad umzurechnen. Wie auch immer: Während es so aussieht, als würde ich jetzt die richtige Breitengradnummer (71,99 ...) erhalten, ist die Längengradnummer weit entfernt (ich erhalte 3,54 statt 11,5).

UPDATE 2: Ich hatte einen Tippfehler im Test, wie unten erwähnt. Es ist jetzt im Code festgelegt. Die Längengradzahl ist jedoch immer noch falsch: Ich erhalte jetzt -11,34 anstelle von 11,5. Ich denke, dass mit diesen Zeilen etwas nicht stimmt:

double dlon = atan2(sin(tc) * sin(dist_radians) * cos(lat1), cos(dist_radians) - sin(lat1) * sin(lat));
double lon = ((lon1-dlon + pi) % (2*pi)) - pi;

Antworten auf die Frage(10)

Ihre Antwort auf die Frage