Lors du calcul de la distance de la latitude et de la longitude, il n'est pas difficile de prendre en compte la rondeur de la terre et de la rapprocher de la vraie sphère.
from math import sin, cos, acos, radians
earth_rad = 6378.137
def latlng_to_xyz(lat, lng):
rlat, rlng = radians(lat), radians(lng)
coslat = cos(rlat)
return coslat*cos(rlng), coslat*sin(rlng), sin(rlat)
def dist_on_sphere(pos0, pos1, radius=earth_rad):
xyz0, xyz1 = latlng_to_xyz(*pos0), latlng_to_xyz(*pos1)
return acos(sum(x * y for x, y in zip(xyz0, xyz1)))*radius
Osaka = 34.702113, 135.494807
Tokyo = 35.681541, 139.767103
London = 51.476853, 0.0
print(dist_on_sphere(Osaka, Tokyo)) # 403.63km
print(dist_on_sphere(London, Tokyo)) # 9571.22km
Si vous voulez calculer plus précisément, vous devez l'approcher avec une ellipse rotative, et il y a place pour des améliorations telles que l'erreur ou grande au voisinage de 1 pour la fonction ʻacos`, mais à des fins occasionnelles, cela suffit.
Bref, ce n'est pas si compliqué même si l'on considère la rondeur. Pour référence lorsque les API et les bibliothèques ne peuvent pas être utilisées.
Recommended Posts