[PYTHON] geometry> 2017-03-31: Trouver la distance entre deux latitudes et longitudes> Utiliser la formule Haversine | 2019-01-08 Méthode Vincenty

Environnement d'exploitation


Xeon E5-2620 v4 (8 noyaux) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 et ses-devel
mpich.x86_64 3.1-5.el6 et ses-devel
gcc version 4.4.7 (Et gfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.Utilisez 1.
Python 3.6.0 on virtualenv

Post-scriptum (08/01/2019)

Comme décrit dans [Comment] de *** @ knoguchi (https://qiita.com/7of9/items/4ea7356a8806eaa08d5e/#comment-8b584fc3d15249477719), la méthode de formule Haversine est légèrement différente de la valeur mesurée de la montre GPS. Il semble y avoir. Voir le commentaire pour des calculs plus précis. *** ***

Information et v0.1

Connexes Examen requis> géométrie> Comprendre la formule de calcul de la distance entre la latitude et la longitude> Conversion de coordonnées orthogonales à partir des coordonnées polaires / angle zénithal / angle azimutal

Calculez la distance entre la latitude et la longitude (en tenant compte de la rondeur de la terre). J'ai changé le code pour la version de formule Haversine.

Référence Trier en fonction de l'emplacement à l'aide de la formule Haversine Référence 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

Courir


$ 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

Déplacement de la définition du rayon dans la fonction. Vous pouvez modifier le rayon en le spécifiant avec un argument de mot-clé.

Related Parce que les objets mutables (par exemple, la liste) ne sont pas initialisés en Python> argument defualt / sont initialisés à la définition

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

geometry> 2017-03-31: Trouver la distance entre deux latitudes et longitudes> Utiliser la formule Haversine | 2019-01-08 Méthode Vincenty
[Python] Trouver des coordonnées sous deux angles et une distance
Trouvez la distance (en tenant compte de la rondeur de la terre) de la latitude et de la longitude.