Mehr

So berechnen Sie den Abstand zwischen einer Linie und einem Punkt (mit Hilfe von Breiten-/Längenkoordinaten)

So berechnen Sie den Abstand zwischen einer Linie und einem Punkt (mit Hilfe von Breiten-/Längenkoordinaten)


In meiner Android-App muss ich die Entfernung von einem Punkt (der Position des Geräts, die eine Breiten-/Längenkoordinate ist) zu einer Linie (definiert durch zwei Breiten-/Längenkoordinaten) berechnen und das Ergebnis in Metern erhalten.

Ich habe mir diese Seite und den dortigen Java-Code angeschaut, aber mir ist klar, dass ich diesen Code nicht verwenden kann (zumindest nicht mit den Lat/Lon-Koordinaten), da er mir die Entfernung/Differenz in Grad dazwischen anzeigt der Punkt und die Linie, und nicht in Metern, und wenn ich richtig vermute, ist es nicht möglich, die Differenz in Grad in Meter umzuwandeln, oder?

Daher frage ich mich, wie ich das auf andere Weise machen kann, um die Entfernung in Metern zwischen a Linie und ein Punkt, beide definiert mit lat/lon-Werten.

BEARBEITEN: Ich habe das Problem anders angegangen. Jetzt habe ich stattdessen eine Methode, die den Punkt auf der Linie findet, der dem Gerätestandort am nächsten liegt.
Diese Formel funktioniert jedoch nicht genau wie beabsichtigt, wenn sie mit Lat / Lon-Korinaten gefüttert wird. Wenn sich die Geräteposition auf der Linie befindet, zeigt sie nach rechts, aber wenn sich das Gerät von der Linie entfernt, wird der Fehler immer größer, bis er am Ende der Linie stoppt.

Hier ist die Funktion (basierend auf dem Code in der ersten Alternative dieser Antwort):

/** * Ermittelt den nächsten Punkt auf einer Linie. * * @param a Der erste Punkt der Linie. * @param b Der zweite Punkt der Linie. * @param p Der Startpunkt. * * @return Der Punkt auf der Linie a->b, der dem Punkt p am nächsten liegt. */ public static Location nextPointOnLine(Location a, Location b, Location p) { // Speichere den Vektor a->p Vector a_to_p = new Vector(a, p); // Speichere den Vektor a->b Vector a_to_b = new Vector(a, b); // Bestimme die Quadratgröße von a->b double squareMagnitude = square(a_to_b.x) + square(a_to_b.y); // Berechne das Skalarprodukt von a->p und a->b double atp_dot_atb = a_to_p.x * a_to_b.x + a_to_p.y * a_to_b.y; // Berechnen Sie den normalisierten Abstand von a zum nächsten Punkt double t = clip(atp_dot_atb / squareMagnitude, 0d, 1d); // Erstellen Sie einen neuen Standort zum Speichern der Ergebniswerte in Standort location = new Location(LocationManager.PASSIVE_PROVIDER); // Setze die Ergebniskoordinatenwerte location.setLatitude(a.getLatitude() + a_to_b.x * t); location.setLongitude(a.getLongitude() + a_to_b.y * t); // Den Standort zurückgeben return location; }

DasVektorKlasse ist nur eine Klasse, die zwei enthältdoppeltWerte und stellen einen Vektor dar.
DasKlemme (doppelt v, doppelt min, doppelt max)Methode klemmt einen Wert (v) zwischen einem Minimum (Mindest) und maximal (max) Wert, in diesem Fall 0 und 1.
DasQuadrat (doppelt v)Methode berechnet das Quadrat eines Wertes (einfachv * v).

Ich würde mich freuen, wenn mir jemand helfen könnte, diesen Code ein wenig zu ändern, um einen korrekten Punkt für WGS84 / Lat-Lon-Koordinaten zurückzugeben, oder eine andere Vorgehensweise vorzuschlagen.
Der Ergebnispunkt sollte so genau wie möglich sein, sagen wir weniger als 5 Meter Fehler.


Sie können Entfernungen in Grad nicht wirklich in Meter umrechnen, da die Größe eines Grades variiert, wenn Sie sich den Polen nähern. Konvertieren Sie Ihre Standorte in ein projiziertes Koordinatensystem und berechnen Sie dann Ihre Entfernungen.


Ich konnte das Problem lösen, indem ich alle in der Formel enthaltenen Koordinaten in SWEREF99TM umwandelte, bevor ich den nächstgelegenen Punkt berechnete. Dann habe ich den nächstgelegenen Punkt, der mit der Formel gefunden wurde, zurück in WGS84 umgewandelt.

Ich habe SWEREF99TM verwendet, da es sich um ein Rastersystem handelt, sodass die Formel korrekt funktioniert.
Beachten Sie, dass dies außerhalb von Schweden wahrscheinlich nicht funktioniert, da das Koordinatensystem SWEREF99TM verwendet wird, das meiner Meinung nach nur in Schweden funktioniert.
Wenn die Berechnung nur in einem bestimmten Land funktionieren soll, besteht der Schlüssel zur Lösung dieses Problems darin, ein Rastersystem für dieses Land zu finden und die Koordinaten in dieses System umzuwandeln, bevor die Formel verwendet wird.