Gladir.com - TCL - Calcul la distance entre deux coordonnées de Longitude et Latitude

Une des fonctions les plus communes de la géographie et des systèmes modernes, c'est le calcul de la distance géographique entre deux coordonnées de Longitude et de Latitude. Il n'y a aucune nécessité de grande connaissance en trigonométrie pour arriver à se genre de calcul dans le format qu'on le souhaite, Km, Miles ou Miles Nautiques. Ainsi, si vous savez les coordonnéss suivantes:
Ville Latitude Longitude
Montréal 45 31N 73 34O
Paris 48 50N 2 20E
A l'aide du code source TCL (Tool Command Language) suivant, vous trouvez la réponse que vous souhaitez:
#! /usr/bin/tclsh

proc CoordToDeltaKm {Q1Latitude Q1LatiDeg Q1LatiDirection Q1Longitude Q1LongDeg Q1LongDirection Q2Latitude Q2LatiDeg Q2LatiDirection Q2Longitude Q2LongDeg Q2LongDirection} {  
    set pi [expr {3.141592653589793}]
    set a1 [expr {($Q1Latitude+($Q1LatiDeg/60.0))*$pi/180.0}]
    if {$Q1LatiDirection eq "N"} { 
           set a1 [expr {-$a1}]
    } 
    set b1 [expr {($Q1Longitude+($Q1LongDeg/60.0))*$pi/180.0}]
    if {$Q1LongDirection eq "O"} { 
          set b1 [expr {-$b1}]
    } 
    set a2 [expr {($Q2Latitude+($Q2LatiDeg/60.0))*$pi/180.0}]
    if {$Q2LatiDirection eq "N"} { 
          set a2 [expr {-$a2}]
    } 
    set b2 [expr {($Q2Longitude+($Q2LongDeg/60.0))*$pi/180.0}]
    if {$Q2LongDirection eq "O"} { 
          set b2 [expr {-$b2}]
    } 
    set RawDelta [expr {acos(cos($a1)*cos($b1)*cos($a2)*cos($b2) + cos($a1)*sin($b1)*cos($a2)*sin($b2) + sin($a1)*sin($a2))}]
    return [expr {$RawDelta * 6378.0}]
}  

proc CoordToDeltaStatuteMiles {Q1Latitude Q1LatiDeg Q1LatiDirection Q1Longitude Q1LongDeg Q1LongDirection Q2Latitude Q2LatiDeg Q2LatiDirection Q2Longitude Q2LongDeg Q2LongDirection} {  
    set pi [expr {3.141592653589793}]
    set a1 [expr {($Q1Latitude+($Q1LatiDeg/60.0))*$pi/180.0}]
    if {$Q1LatiDirection eq "N"} { 
           set a1 [expr {-$a1}]
    } 
    set b1 [expr {($Q1Longitude+($Q1LongDeg/60.0))*$pi/180.0}]
    if {$Q1LongDirection eq "O"} { 
          set b1 [expr {-$b1}]
    } 
    set a2 [expr {($Q2Latitude+($Q2LatiDeg/60.0))*$pi/180.0}]
    if {$Q2LatiDirection eq "N"} { 
          set a2 [expr {-$a2}]
    } 
    set b2 [expr {($Q2Longitude+($Q2LongDeg/60.0))*$pi/180.0}]
    if {$Q2LongDirection eq "O"} { 
          set b2 [expr {-$b2}]
    } 
    set RawDelta [expr {acos(cos($a1)*cos($b1)*cos($a2)*cos($b2) + cos($a1)*sin($b1)*cos($a2)*sin($b2) + sin($a1)*sin($a2))}]
    return [expr {$RawDelta * 3963.1}]
}  

proc CoordToDeltaNauticalMiles {Q1Latitude Q1LatiDeg Q1LatiDirection Q1Longitude Q1LongDeg Q1LongDirection Q2Latitude Q2LatiDeg Q2LatiDirection Q2Longitude Q2LongDeg Q2LongDirection} {  
    set pi [expr {3.141592653589793}]
    set a1 [expr {($Q1Latitude+($Q1LatiDeg/60.0))*$pi/180.0}]
    if {$Q1LatiDirection eq "N"} { 
           set a1 [expr {-$a1}]
    } 
    set b1 [expr {($Q1Longitude+($Q1LongDeg/60.0))*$pi/180.0}]
    if {$Q1LongDirection eq "O"} { 
          set b1 [expr {-$b1}]
    } 
    set a2 [expr {($Q2Latitude+($Q2LatiDeg/60.0))*$pi/180.0}]
    if {$Q2LatiDirection eq "N"} { 
          set a2 [expr {-$a2}]
    } 
    set b2 [expr {($Q2Longitude+($Q2LongDeg/60.0))*$pi/180.0}]
    if {$Q2LongDirection eq "O"} { 
          set b2 [expr {-$b2}]
    } 
    set RawDelta [expr {acos(cos($a1)*cos($b1)*cos($a2)*cos($b2) + cos($a1)*sin($b1)*cos($a2)*sin($b2) + sin($a1)*sin($a2))}]
    return [expr {$RawDelta * 3443.9}]   
}

puts "Distance entre Montréal et Paris en Km: [CoordToDeltaKm 45.0 31.0 \"N\" 73.0 34.0 \"O\" 48.0 50.0 \"N\" 2.0 20.0 \"E\"]\n"
puts "Distance entre Montréal et Paris en Miles: [CoordToDeltaStatuteMiles 45.0 31.0 \"N\" 73.0 34.0 \"O\" 48.0 50.0 \"N\" 2.0 20.0 \"E\"]\n"
puts "Distance entre Montréal et Paris en Miles Nautique: [CoordToDeltaNauticalMiles 45.0 31.0 \"N\" 73.0 34.0 \"O\" 48.0 50.0 \"N\" 2.0 20.0 \"E\")]\n"
on obtiendra le résultat suivant:
Distance entre Montréal et Paris en Km: 5510.16761889
Distance entre Montréal et Paris en Miles: 3423.85470217
Distance entre Montréal et Paris en Miles Nautique: 2975.30044884


Dernière mise à jour: Mardi, le 7 février 2006