2010-06-11 6 views
7

ich eine Funktion benötigen, die GPS-Positionen abbildet x/y-Werte wie folgt aus:Länge Breite in Metern verwandeln

getXYpos(GeoPoint relativeNullPoint, GeoPoint p){ 
    deltaLatitude=p.latitude-relativeNullPoint.latitude; 
    deltaLongitude=p.longitude-relativeNullPoint.longitude; 
    ... 
    resultX=latitude (or west to east) distance in meters from p to relativeNullPoint 
    resultY=longitude (or south to north) distance in meters from p to relativeNullPoint 
} 

ich einige Implementierungen von „Abstand zweier geoPoints“ gesehen haben, aber sie alle nur die Luft berechnen -Linienabstand. Ich denke, die DeltaLongitude kann direkt in Meter umgewandelt werden, aber die DeltaLatitude hängt von der Länge ab. Weiß jemand, wie dieses Problem gelöst werden kann?

Antwort

13

mit zu beginnen, ich glaube, Sie haben Ihre latitude und longitude umgekehrt. Der Längengrad misst X, und der Breitengrad misst Y.

Der Breitengrad lässt sich leicht in eine Nord-Süd-Entfernung umwandeln. Wir wissen, dass 360 Grad ein vollständiger Kreis um die Erde durch die Pole ist, und that distance is 40008000 meters. Solange Sie die Fehler nicht berücksichtigen müssen, weil die Erde nicht perfekt kugelförmig ist, lautet die Formel deltaLatitude * 40008000/360.

Der schwierige Teil ist die Umwandlung der Länge in X, wie Sie vermutet haben. Da es von der Breite abhängt, die Sie benötigen, um zu entscheiden, welchen Breitengrad Sie verwenden möchten, können Sie den Breitengrad Ihres Ursprungs, den Breitengrad Ihres Ziels oder einen beliebigen Punkt dazwischen wählen. Der Umfang am Äquator (Breite 0) beträgt 40075160 Meter. Der Umfang eines Kreises bei einem gegebenen Breitengrad ist proportional zum Kosinus, so dass die Formel deltaLongitude * 40075160 * cos(latitude)/360 lautet.

Bearbeiten: Ihr Kommentar zeigt an, dass Sie Probleme mit der Längengradformel hatten; Sie könnten Grad anstelle von Radiant im Aufruf zu cos verwendet haben, das ist ein häufiger Anfängerfehler. Um sicherzugehen, dass es keine Zweideutigkeiten gibt, hier ist der Arbeitscode in Python.

def asRadians(degrees): 
    return degrees * pi/180 

def getXYpos(relativeNullPoint, p): 
    """ Calculates X and Y distances in meters. 
    """ 
    deltaLatitude = p.latitude - relativeNullPoint.latitude 
    deltaLongitude = p.longitude - relativeNullPoint.longitude 
    latitudeCircumference = 40075160 * cos(asRadians(relativeNullPoint.latitude)) 
    resultX = deltaLongitude * latitudeCircumference/360 
    resultY = deltaLatitude * 40008000/360 
    return resultX, resultY 

Ich entschied mich für den relativenNullPoint-Breitengrad für die X-Berechnung. Dies hat den Vorteil, dass wenn Sie mehrere Punkte mit der gleichen Länge konvertieren, sie das gleiche X haben; Nord-Süd-Linien werden vertikal sein.

Nochmals bearbeiten: Ich hätte darauf hingewiesen, dass dies eine sehr einfache Formel ist und Sie sollten ihre Grenzen kennen. Offensichtlich ist die Erde nicht flach, so dass jeder Versuch, sie auf XY-Koordinaten abzubilden, einige Kompromisse mit sich bringt. Die oben abgeleitete Formel I funktioniert am besten, wenn die Fläche, die Sie konvertieren, klein genug ist, um flach zu sein, und die leichte Krümmung und Nichtparallelität von Nord-Süd-Linien ignoriert werden kann. Es gibt eine ganze Wissenschaft, um Projektionen zu kartografieren; Wenn Sie einige Möglichkeiten sehen möchten, wäre ein guter Ort zum Starten Wikipedia. Diese spezifische Projektion ist bekannt als the Equirectangular projection, mit etwas zusätzlicher Skalierung.

+0

ok ich habe das versucht, und die Breitengradberechnung ist sehr genau :) aber die Längenmeterwerte sind immer den Faktor 1,3 zu groß für den Breitengrad im Test. Ich denke, es ist nicht eine gute Idee, nur durch diesen Faktor zu teilen, weil es wahrscheinlich für verschiedene Breitengrade unterschiedlich sein wird, vielleicht muss der Erdumfang in Bezug auf den aktuellen Breitengrad berechnet werden? –

+0

@Sponge, überprüfen Sie das Update. –

+0

vielen dank! funktioniert gut :) –

1

Es gibt Bibliotheken auf jstott.me.uk gefunden haben, z.B.

var lld1 = new LatLng(40.718119, -73.995667); // New York 
document.write("New York Lat/Long: " + lld1.toString() + "<br />"); 
var lld2 = new LatLng(51.499981, -0.125313); // London 
document.write("London Lat/Long: " + lld2.toString() + "<br />"); 
var d = lld1.distance(lld2); 
document.write("Surface Distance between New York and London: " + d + "km");