JeuWeb - Crée ton jeu par navigateur
Calcul de proximité (latitude/longitude) - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Calcul de proximité (latitude/longitude) (/showthread.php?tid=3335)



Calcul de proximité (latitude/longitude) - Studio Gamboo - 25-11-2008

Bonsoir à tous Smile

Je teste quelques petits truc ce soir et l'un d'entre eux me pose problème, pas vraiment technique mais plutôt d'ordre mathématique disons et j'aimerai obtenir quelques conseils Smile

J'ai une table, qui contient de nombreuses villes de France, avec leur latitude et longitudes correspondantes.
Ex :
'Hampigny', '10500', 9.999999, 4.590779
'Saint-Germain', '07170', 9.999999, 4.450382
'Watigny', '02830', 9.999999, 4.197226
...

Le truc est que j'aimerais pouvoir faire une requête sur la base, pour récupérer par exemple toutes les villes présentes à moins de 20km de chez moi. Comment puis formuler cette requête faire ça ?!

Merci d'avance à ceux qui répondront.


RE: Calcul de proximité (latitude/longitude) - Melimelo - 25-11-2008

Code PHP :
<?php

function Distance($latitude_A, $longitude_A, $latitude_B, $longitude_B)
{
if(
$latitude_A == $latitude_B && $longitude_A == $longitude_B)
{
return
0;
}
else
{
$var = pi() / 180;

$latitude1 = $latitude_A * $var;
$latitude2 = $latitude_B * $var;

$longitude1 = $longitude_A * $var;
$longitude2 = $longitude_B * $var;

$X1 = sin($latitude1) * sin($latitude2);
$X2 = cos($latitude1) * cos($latitude2);
$X3 = cos($longitude1 - $longitude2);

$X4 = $X2 * $X3;
$X5 = $X1 + $X4;

$Distance_radians = atan(-$X5/sqrt(-$X5*$X5 + 1)) + 2 * atan(1);

return (
$Distance_radians * 6366.8329383716631328393804536);
}
}

print
Distance(9.999999, 4.450382, 9.999999, 4.590779);
?>


Voilà une fonction permettant de calculer la distance en km entre deux coordonées. Celle-ci est honteusement pompé du net et traduite du javascript (pas envie de réfléchir).


Après faut l'intégrer dans ta requête sql et ca doit le faire.


ps: vous noterez que je sais pas si la fonction donne les valeurs exactes, mais je l'espère Tongue, fin ca à l'air.


Cordialement Melimelo


RE: Calcul de proximité (latitude/longitude) - keke - 25-11-2008

Hum Mathématiquement la formule d'un cercle est :

Y² = X²

Sous SQL il faut faire une fonction qui calcul la distance X et Y en fonction de l'altitude et de la longitude. Ca serait pas si complexe si on considérait la terre sur un espace plat ... le problème vient du rayon de courbure induit par la rondité de la terre ;-). Si tu cherches à faire un calcul exact, il faut que tu passe des paramètres tels que le rayon de la terre, l'aplatissement des pôles ...
Si tu te cantonne à la France, tout petit pays par rapport au monde, tu peux aussi supposer qu'à quelques détails près, la terre est plate. Dans ce cas les calculs gagnent en simplification (et le résultat resteront cohérents car l'angle que ferait 20km par rapport aux 40 000 kms de circonférences est vraiment insignifiant).

Code :
SELECT code_postal from Tatable where (SQUARE ( (Latitude - $lat_ville_ref) * $Const ) + SQUARE ( (Longitude - $long_ville_ref ) * $Const ) ) < 400
où $Const = (2 pi() * 40 000 ) / 360

D'un autre côté, j'ai pas testé car je n'ai pas d'environnement de tests sous la main.

Bon courage ^^ !

Kéké