Einfache Berechnungen für die Arbeit mit Lat / Lon und km Entfernung?

119

Gibt es eine einfache Berechnung, mit der ich km in einen Wert umwandeln kann, den ich 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 berechnen möchte, wie hoch der Lat 25 km östlich / westlich von diesem Punkt sein würde und wie hoch der Lon 25 km nördlich / südlich davon sein würde Punkt, was müsste ich tun, um die 25 km in eine Dezimalzahl umzuwandeln und die obigen Werte zu addieren?

Ich suche eine allgemeine Faustregel, dh: 1 km == +/- 0.XXX

Bearbeiten:

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

Wie berechnet man den Begrenzungsrahmen für einen bestimmten Lat / Lng-Standort?

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

Phillip B. Oldham
quelle

Antworten:

220

Die ungefähren Umrechnungen sind:

  • Breitengrad: 1 Grad = 110,574 km
  • Längengrad: 1 Grad = 111,320 * cos (Breitengrad) km

Dies korrigiert die polare Abflachung der Erde nicht vollständig - dafür möchten Sie wahrscheinlich eine kompliziertere Formel mit dem WGS84-Referenzellipsoid (dem für GPS verwendeten Modell). Aber der Fehler ist für Ihre Zwecke wahrscheinlich vernachlässigbar.

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

Achtung : Beachten Sie, dass Latlong-Koordinaten in Grad ausgedrückt werden, während die cosFunktion in den meisten (allen?) Sprachen normalerweise Bogenmaß akzeptiert. Daher ist eine Umrechnung von Grad in Bogenmaß erforderlich.

Jim Lewis
quelle
Meinen Sie cos (Längengrad) in der zweiten Formel?
Odys
1
Wie bist du darauf gekommen? Mir fehlt etwas. Können Sie bitte die Längengradberechnungen näher erläutern? Ty
Odys
5
@Odys: Wenn Sie zwei Punkte vergleichen, die auf derselben Längengradlinie (Nord / Süd) liegen, liegen sie auf einem großen Kreis und der Umrechnungsfaktor ist nur der polare Umfang der Erde geteilt durch 360 Grad. Bei Ost-West-Messungen ist dies jedoch anders, da Sie (mit Ausnahme des Äquators) nicht entlang eines "großen Kreises" messen, sodass der "Umfang" bei einem bestimmten Breitengrad kleiner ist. Und der Korrekturfaktor stellt sich als Kosinus des Breitengrads heraus.
Jim Lewis
17
Meine Erklärung: cos(0°) = 1=> Daher wird bei der Berechnung am Äquator kein Korrekturfaktor angewendet. Die Längen sind dort am breitesten. cos(90°) = 0=> An den Polen treffen sich die Längen in einem Punkt. Es ist keine Entfernung zu berechnen.
Jenny O'Reilly
4
@Stijn: Sie müssen von Grad in Bogenmaß konvertieren, bevor Sie Math.cos () aufrufen können.
Jim Lewis
5

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

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

Skaffman
quelle
Die Seite hat jetzt die Bibliothek.
Mittelfeld99
1
Die Verbindung ist unterbrochen!
Chatzich
Für PHP können Sie diese Gabelung verwenden: github.com/dvdoug/PHPCoord
dearsina
1

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);
Nikhil Dinesh
quelle
1

Interessant, dass ich keine Erwähnung von UTM-Koordinaten gesehen habe.

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

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

utm.from_latlon und utm.to_latlon.

Mircea
quelle
Danke für den Link zu utm. Schockierend, dass es überhaupt keine Dokumentation zu geben scheint.
Westworld vor
1

Vielen Dank an 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 Konvertieren der Entfernung verwende ich folgende Formeln:

latDistance / 110.574
longDistance / (111.320 * cos(lat / .pi / 180))
Serj Kultenko
quelle
Ich denke, es sollte "lat * pi / 180" sein
magamig
1

Warum nicht richtig formulierte Geodatenabfragen verwenden?

Hier ist die SQL Server-Referenzseite auf der STContains-Geodatenfunktion:

https://docs.microsoft.com/en-us/sql/t-sql/spatial-geography/stcontains-geography-data-type?view=sql-server-ver15

oder wenn Sie nicht auf die Box- und Radian-Konvertierung verzichten möchten, können Sie immer die Distanzfunktion verwenden, um die Punkte zu finden, die Sie benötigen:

DECLARE @CurrentLocation geography; 
SET @CurrentLocation  = geography::Point(12.822222, 80.222222, 4326)

SELECT * , Round (GeoLocation.STDistance(@CurrentLocation ),0) AS Distance FROM [Landmark]
WHERE GeoLocation.STDistance(@CurrentLocation )<= 2000 -- 2 Km

Es sollte ähnliche Funktionen für fast jede Datenbank geben.

Wenn Sie die Geodatenindizierung korrekt implementiert haben, sind Ihre Suchvorgänge viel schneller als der von Ihnen verwendete Ansatz

George Karadov
quelle
1
Bitte nehmen Sie sich einen Moment Zeit, um die Bearbeitungshilfe in der Hilfe durchzulesen . Die Formatierung beim Stapelüberlauf unterscheidet sich von anderen Websites.
Dharman