[PYTHON] Geometrie> 2017-03-31: Ermitteln Sie den Abstand zwischen zwei Breiten- und Längengraden.> Verwenden Sie die Haversine-Formel | 2019-01-08 Vincenty-Methode

Betriebsumgebung


Xeon E5-2620 v4 (8 Kerne) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 und seine-devel
mpich.x86_64 3.1-5.el6 und seine-devel
gcc version 4.4.7 (Und Gfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.Verwende 1.
Python 3.6.0 on virtualenv

Nachtrag (08.01.2019)

Wie in *** @ knoguchis Kommentar beschrieben, unterscheidet sich die Haversine-Formelmethode geringfügig vom gemessenen Wert der GPS-Uhr. Es scheint zu geben. Siehe den Kommentar für genauere Berechnungen. *** ***

Informationen und v0.1

Verwandte Prüfung erforderlich> Geometrie> Verständnis der Formel zur Berechnung des Abstands von Breite und Länge> Orthogonale Koordinatenumwandlung von Polarkoordinaten / Zenitwinkel / Azimutwinkel

Berechnen Sie die Entfernung von Breite und Länge (unter Berücksichtigung der Rundheit der Erde). Ich habe den Code in die Haversine-Formelversion geändert.

Referenz Nach Standort sortieren nach Haversine-Formel Referenz https://en.wikipedia.org/wiki/Haversine_formula

calc_distance_170331a.py


from math import sin, cos, radians, sqrt, asin
EARTH_RADIUS_km = 6378.137


def dist_on_sphere(pos0, pos1, radius=EARTH_RADIUS_km):
    '''
    distance based on Haversine formula
    Ref: https://en.wikipedia.org/wiki/Haversine_formula
    '''
    latang1, lngang1 = pos0
    latang2, lngang2 = pos1
    phi1, phi2 = radians(latang1), radians(latang2)
    lam1, lam2 = radians(lngang1), radians(lngang2)
    term1 = sin((phi2 - phi1) / 2.0) ** 2
    term2 = sin((lam2 - lam1) / 2.0) ** 2
    term2 = cos(phi1) * cos(phi2) * term2
    wrk = sqrt(term1 + term2)
    wrk = 2.0 * radius * asin(wrk)
    return wrk

Osaka = 34.702113, 135.494807
Tokyo = 35.681541, 139.767103
London = 51.476853, 0.0

print(dist_on_sphere.__doc__)

print("%.2f km" % dist_on_sphere(Osaka, Tokyo))  # 403.63km
print("%.2f km" % dist_on_sphere(London, Tokyo))  # 9571.22km

Lauf


$ python calc_distance_170331a.py 

    distance based on Haversine formula
    Ref: https://en.wikipedia.org/wiki/Haversine_formula
    
403.63 km
9571.22 km

v0.2

Die Definition des Radius wurde in die Funktion verschoben. Sie können den Radius ändern, indem Sie ihn mit einem Schlüsselwortargument angeben.

Verwandte Da veränderbare Objekte (z. B. Liste) nicht in Python> defualt argument / bei der Definition initialisiert werden

calc_distance_170331a.py


from math import sin, cos, radians, sqrt, asin


def dist_on_sphere(pos0, pos1, radius=None):
    '''
    distance based on Haversine formula
    Ref: https://en.wikipedia.org/wiki/Haversine_formula
    '''
    if radius is None:
        radius = 6378.137  # km (Earth's radius)
    latang1, lngang1 = pos0
    latang2, lngang2 = pos1
    phi1, phi2 = radians(latang1), radians(latang2)
    lam1, lam2 = radians(lngang1), radians(lngang2)
    term1 = sin((phi2 - phi1) / 2.0) ** 2
    term2 = sin((lam2 - lam1) / 2.0) ** 2
    term2 = cos(phi1) * cos(phi2) * term2
    wrk = sqrt(term1 + term2)
    wrk = 2.0 * radius * asin(wrk)
    return wrk

Osaka = 34.702113, 135.494807
Tokyo = 35.681541, 139.767103
London = 51.476853, 0.0

print(dist_on_sphere.__doc__)

print("%.2f km" % dist_on_sphere(Osaka, Tokyo))  # 403.63km
print("%.2f km" % dist_on_sphere(London, Tokyo))  # 9571.22km

Recommended Posts

Geometrie> 2017-03-31: Ermitteln Sie den Abstand zwischen zwei Breiten- und Längengraden.> Verwenden Sie die Haversine-Formel | 2019-01-08 Vincenty-Methode
[Python] Finde Koordinaten aus zwei Winkeln und Entfernungen
Finden Sie die Entfernung von Breite und Länge (unter Berücksichtigung der Rundheit der Erde).