it-swarm.com.de

Einfache Berechnungen für die Arbeit mit lat/lon + km Entfernung?

Gibt es eine einfache Berechnung, die ich ausführen kann, um km in einen Wert umzuwandeln, den ich zu einem lat oder lon float hinzufügen kann, um einen Begrenzungsrahmen für Suchvorgänge zu berechnen? Es muss nicht ganz genau sein.

Zum Beispiel: Wenn ich einen Lat/Lon für London, England (51.5001524, -0.1262362) bekommen würde, und ich wollte berechnen, welcher Lat von diesem Punkt aus 25 km östlich/westlich sein würde und welcher der 25 km nördlich/südlich davon liegen würde Was muss ich tun, um die 25 km in eine Dezimalzahl umzuwandeln, um sie zu den obigen Werten hinzuzufügen?

Ich suche nach einer allgemeinen Faustregel: 1km == +/- 0.XXX

Bearbeiten:

Meine ursprüngliche Suche nach "lat lon" hat dieses Ergebnis nicht ergeben:

Wie berechnet man den Begrenzungsrahmen für eine bestimmte Lat/Lng-Position?

Die akzeptierte Antwort scheint für meine Anforderungen angemessen zu sein.

105

Die ungefähren Umrechnungen sind:

  • Breite: 1 Grad = 110.574 km
  • Längengrad: 1 Grad = 111.320 * cos (Breitengrad) km

Für die polare Abflachung der Erde ist dies nicht völlig richtig - dafür sollten Sie wahrscheinlich eine kompliziertere Formel mit dem Referenz-Ellipsoid WGS84 (dem für GPS verwendeten Modell) verwenden. Der Fehler ist jedoch wahrscheinlich für Ihre Zwecke vernachlässigbar.

Quelle: http://en.wikipedia.org/wiki/Latitude

Caution: Beachten Sie, dass latlong-Koordinaten in Grad ausgedrückt werden, während die cos-Funktion in den meisten (allen?) Sprachen normalerweise Radiant akzeptiert. Daher ist eine Konvertierung von Grad in Radiant erforderlich.

188
Jim Lewis

Wenn Sie Java, Javascript oder PHP verwenden, gibt es eine Bibliothek, die genau diese Berechnungen durchführt und dabei eine amüsant komplizierte (aber dennoch schnelle) Trigonometrie verwendet:

http://www.jstott.me.uk/jcoord/

4
skaffman

http://www.jstott.me.uk/jcoord/ - Verwenden Sie diese Bibliothek

            LatLng lld1 = new LatLng(40.718119, -73.995667);
            LatLng lld2 = new LatLng(51.499981, -0.125313);
            Double distance = lld1.distance(lld2);
            Log.d(TAG, "Distance in kilometers " + distance);
1
Nikhil Dinesh

Interessant, dass ich keine UTM-Koordinaten erwähnt habe. 

https://en.wikipedia.org/wiki/Universal_Transverse_Mercator_coordinate_system .

Zumindest wenn Sie der gleichen Zone km hinzufügen möchten, sollte dies unkompliziert sein (in Python: https://pypi.org/project/utm/ )

utm.from_latlon und utm.to_latlon.

0
Mircea

Vielen Dank Jim Lewis für seine großartige Antwort und ich möchte diese Lösung durch meine Funktion in Swift veranschaulichen:

func getRandomLocation(forLocation location: CLLocation, withOffsetKM offset: Double) -> CLLocation {
        let latDistance = (Double(arc4random()) / Double(UInt32.max)) * offset * 2.0 - offset
        let longDistanceMax = sqrt(offset * offset - latDistance * latDistance)
        let longDistance = (Double(arc4random()) / Double(UInt32.max)) * longDistanceMax * 2.0 - longDistanceMax

        let lat: CLLocationDegrees = location.coordinate.latitude + latDistance / 110.574
        let lng: CLLocationDegrees = location.coordinate.longitude + longDistance / (111.320 * cos(lat / .pi / 180))
        return CLLocation(latitude: lat, longitude: lng)
    }

In dieser Funktion zum Umrechnen der Distanz verwende ich folgende Formeln:

latDistance / 110.574
longDistance / (111.320 * cos(lat / .pi / 180))
0
Serj Kultenko