Partage
  • Partager sur Facebook
  • Partager sur Twitter

calcul distance entre 2 points latitude longitude

1 octobre 2015 à 11:49:48

Bonjour à tous,

J'ai 2 tables dans ma base de donnée. Chaque table possède 2 attributs: latitude et longitude.

J'aimerais à partir de ces latitudes et longitudes, calculer une distance à vol d'oiseau entre ces 2 points.

Comment faire pour créer cette fonction ?

Merci d'avance !

  • Partager sur Facebook
  • Partager sur Twitter
1 octobre 2015 à 12:00:52

  • Partager sur Facebook
  • Partager sur Twitter
Ce n'est pas parce que vous ne savez pas vous servir d'un marteau qu'il faut planter des clous au tournevis.
1 octobre 2015 à 12:47:13

Les principes sont simples.

Pour deux points distants (Paris-New-York par exemple)

Soit A et B les deux points, O le centre de la terre.
Le produit scalaire de vecteurs unitaires portés par OA et OB donne le cosinius et donc l'angle des vecteurs en radians. Il suffit alors de multiplier cet angle par le rayon de la terre (40 000 km/2.PI d'après la définition initiale du mètre).

Les vecteurs unitaires sont donnés par xA=cos(latA)*cos(lngA), yA= cos(latA)*sin(lngA) et zA=sin(latA) (avec un préfixe Math en javascript). Le produit scalaire : xA*xB+xB*yB+zA*zB.
L'angle alpha multiplié par le rayon donne la distance d'où :
Distance = Math.acos( xA.xB+xB.yB+zA.zB)*20000/Math.PI

Pour deux points plus proches (Paris-Marseille)

Il est alors possible de raisonner sur une carte plane en remarquant qu'une différence de 1 minute de latitude correspond à 1852 mètres. En effet, le mètre ayant été, encore une fois, définit comme la 40 000 millième partie du méridien terrestre, 1 degré d'angle correspond à 40 000 / 360 soit 111,111 km et une minute à 111,111 /60 ce qui donne 1852 mètres (c'est la définition du Mille marin).

Pour les différences de longitudes, il faut appliquer une coefficient réducteur égal au cosinus de la latitude moyenne (car nous ne sommes plus sur un grand cercle mais sur un cercle dont le rayon est réduit).

Ayant calculé les distances sur les deux axes de la carte, l'application du théorème de Pythagore donne la distance. 

Autrement dit : DeltaY = latA-latB et deltaX = (lngA-lngB).Math.cos((latA+latB)/2).
Distance= Mat.sqrt(DeltaX*DeltaX+DeltaY*DelatY)

On vérifie que la première formule reste applicable au second cas, même pour des angles quasi nuls.  

-
Edité par 007julien 1 octobre 2015 à 12:51:30

  • Partager sur Facebook
  • Partager sur Twitter
1 octobre 2015 à 13:26:45

Merci beaucoup !

Je ne suis pas très bon en maths mais j'ai trouvé ça sur le net. Est ce que la formule est correcte ?

function distance($lat1, $lon1, $lat2, $lon2, $alt1, $alt2)
    {
        //rayon de la terre
        $r = 6366;
        $lat1 = deg2rad($lat1);
        $lat2 = deg2rad($lat2);
        $lon1 = deg2rad($lon1);
        $lon2 = deg2rad($lon2);
 
        //recuperation altitude en km
        $alt1 = $alt1/1000;
        $alt2 = $alt2/1000;
 
        //calcul précis
        $dp= 2 * asin(sqrt(pow (sin(($lat1-$lat2)/2) , 2) + cos($lat1)*cos($lat2)* pow( sin(($lon1-$lon2)/2) , 2)));
 
        //sortie en km
        $d = $dp * $r;

Merci d'avance!

  • Partager sur Facebook
  • Partager sur Twitter
1 octobre 2015 à 14:46:33

J'aimerais savoir ou est ce qu'il faut mettre cette fonction dans Symfony ?

Je crée une nouvelle fonction dans le controller ? Mais à quel moment je fais appel à cette fonction ?

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
1 octobre 2015 à 18:09:16

La théoreme de Pythagore permet de calculer la distance, il suffit ensuite de prendre en compte les propriétées sphériques de la terre.

(Sauf si c'est déjà pris en compte dans la latitute et la longitude)

-
Edité par Anonyme 1 octobre 2015 à 18:09:29

  • Partager sur Facebook
  • Partager sur Twitter
1 octobre 2015 à 18:28:32

L'altitude est le plus souvent négligeable (au pire 8,4 km sur 6366 km, soit 1,3 millième - encore que la distance dite «à vol d'oiseau» ne puisse théoriquement s'en affranchir), elle ne figure d'ailleurs pas dans la formule proposée.

Quant à la seconde formule, elle provient non pas d'un produit scalaire (scalaire égal au produit des modules par le cosinus de l'angle des deux vecteurs), mais d'un produit vectoriel (vecteur dont le module est égal au produit des modules par le sinus de l'angle des deux vecteurs) effectué après un changement de repère prenant l'un des vecteurs comme vecteur unitaire. D'où l'arcsinus du module de ce produit vectoriel faisant intervenir des différences de longitudes et latitudes...

Quant à Symphonie, s'agissant d'un outil de création de site web. Il parait d'aucune utilité particulière pour insérer un script dans une page...

Edit. Un premier script affichant la distance Paris -New York dans la console (F12 ou outils de développements).:

<script type="text/javascript">
// Constructeur de Vecteurs en 3D
function Vct(x,y,z){this.x=x; this.y=y; this.z=z}
// Fonctions de clonage, multiplication par un scalaire, addition d'un ou plusieurs vecteurs
// produit scalaire, vectoriel, norme et facilité d'affichage.
with({o:Vct.prototype}){
	o.cln=function(){return new Vct(this.x,this.y,this.z)}
	o.mlt=function(k){return new Vct(k*this.x,k*this.y,k*this.z)}
	o.add=function(){var a=arguments,x=this.x,y=this.y,z=this.z,r;
	   for (i=0; i<a.length; i++) {x+= a[i].x; y+= a[i].y,z+= a[i].z}
		return new Vct(x,y,z)}
	o.scl=function(v){return this.x*v.x + this.y*v.y + this.z*v.z}
	o.prd=function(v){return new Vct(this.y*v.z-v.y*this.z,this.z*v.x-v.z*this.x,this.x*v.y-v.x*this.y)}
	o.nrm=function(){var t=Math.sqrt(this.scl(this));return new Vct(this.x/t,this.y/t,this.z/t)}
	o.toString=function(){return JSON.stringify(this)}
}
// Coordonnées d'un point défini par latitude et longitudes en degré décimaux
function pllToVct(pt){
	var lt=pt.lat*Math.PI/180,ln=pt.lng*Math.PI/180;
	return new Vct(Math.cos(lt)*Math.cos(ln),Math.cos(lt)*Math.sin(ln),Math.sin(lt))}

// Distance entre deux points par leurs latitude et longitude {lat:value,lng:value}
function dist(a,b){
	return Math.round(Math.acos(pllToVct(a).scl(pllToVct(b)))*20000/Math.PI);
}
// Coordonnées (approximatives car lues sur Google Maps)
var Paris={lat:48.8614,lng:2.339574}
var New_York={lat:40.7033127,lng:-73.97968}

if (window.console) console.log ('Distance Paris New York : '+dist(Paris,New_York));// =>5831 km

</script>



-
Edité par 007julien 2 octobre 2015 à 9:03:38

  • Partager sur Facebook
  • Partager sur Twitter
24 mars 2018 à 9:59:30

bonjour 
j'ai besoin d'un code en java qui prennent entre deux coordonnées GPS sous forme degrés, minutes, seconde et calcul la distance entre. Merci
  • Partager sur Facebook
  • Partager sur Twitter
24 mars 2018 à 14:37:37

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster, demandez-vous si ce que vous allez dire apporte quelque chose au sujet. Si votre message n'apporte rien, vous ferez perdre du temps à tout le monde et le sujet pourrait dévier ou devenir difficile à suivre.

Aussi, vérifiez la date du topic. Le déterrage de topic nuit au bon fonctionnement du forum et est interdit. Utilisez les boutons pouce en haut pour dire merci. Si le topic date de plus de deux mois sans réponses, mieux vaut ne pas répondre. Si vous avez une question similaire, créez plutôt votre propre sujet en détaillant votre contexte

Je ferme ce sujet. Me contacter par MP si besoin.

  • Partager sur Facebook
  • Partager sur Twitter

Pas d'aide concernant le code par MP, le forum est là pour ça :)