Calcul des coordonnées GPS dans un rayon de x km

Nouveau WRInaute
Bonjour à tous,
Je géolocalise des données d'un site selon le code postal du lieu où elles se trouvent.
J'ai en parallèle une table avec les villes corrspondantes ainsi que leurs coordonnées GPS...

Je voudrais pouvoir effectuer une recherche sur ces données en spécifiant un code postal ainsi qu'un rayon.
Je pense que pour simplifier et pour pouvoir le faire d'une requête SQL, il faudra que je restreigne en fait au carré donc le cercle est inscrit dedans (lattitudes et longitudes comprises entre 2 bornes).
Mon problème c'est pour trouver ces valeurs de bornes!

J'ai bien le calcul suivant qui me donne la distance entre 2 points. Mais moi j'ai un point et un rayon et je ne m'en sors pas... :(

Code:
d = R * (pi/2 - asin ( sin x1 * sin x2 + cos ( y1 - y2 ) * cos x1 * cos x2 ))

avec
d distance entre les 2 points
R rayon de la Terre
x1 lattitude en radians du 1er point
x1 lattitude en radians du 2eme point
y1 longitude en radians du 1er point
y1 longitude en radians du 2eme point
 
WRInaute passionné
Latitude : 1°=+-111 km

Longitude, ça dépend de la latitude :
à nice 1°=+-82 km
à Lille 1°=+-71 km

Tu peux prendre 76 km de moyenne pour la france, ce sera plus simple

et donc, pour un carré de coté 2d centré sur ton point, il faudra chercher les LAT et LONG telles que :
LATpt - d/111 < LAT < LATpt + d/111
LONGpt - d/76 < LONG < LONGpt + d/76

avec :

d distance en km
LATpt, LONGpt coordonnées de ton point en décimal.

J'ai mis en place ça pas plus tard que la semaine dernière. ici : http://www.vttour.fr/topos/recherche.php (avec une intégration qui peut te donner des idées)

a+
 
Nouveau WRInaute
Super, donc j'en déduis que la solution du carré 2D centré sur le point est le plus simple d'un point de vue requêtage SQL?

Sinon tu connais la formule permettant de calculer à quoi correspond 1° de longitude à un point donné de manière précise?
 
WRInaute passionné
D'un point de vue SQL, beaucoup plus simple de faire un carré, et ça consomme beaucoup moins de ressources.

latitude: circonférence de la terre=40000 km=360° d'angle > 1°=111 km

Longitude :
1° : 111km à l'équateur et 0km au pôle avec une rep sinusoidale

distance_longitude=111*cos(LAT)

avec
distance_longitude en km
LAT en radians




:wink:
 
Nouveau WRInaute
Merci beaucoup! Je l'ai mis en place, avec à chaque fois calcul du pas de la longitude en fonction du point central. Ca marche impecc'! Merci :D
 
Nouveau WRInaute
Bonjour,

Je me sers actuellement de vos explications, mais je rencontre un problème au niveau de ma requete sql et je voulais savoir comment vous procédiez pour vos requetes.

Voilà comment j'écris ma requete :

Cette requete fonctionne parfaitement :
select * from `spip_communes` where (`lat` between 46.9 and 47.1) and (`long` between 0.47 and 0.49)

Alors que la suivante ne fonctionne pas du tout (lorsque je dis ne fonctionne pas, elle ne me propose aucun résultat alors qu'il devrait proposé quelques réponses) :
select * from `spip_communes` where (`lat` between 46.9 and 47.1) and (`long` between -0.47 and -0.49)

Je crois que le soucis provient des valeurs négative qui se trouve dans la requete. Pouvez vous m'aider s'il vous plait!

Merci d'avance pour votre réponse.
 
WRInaute passionné
essaie peut être
1/ de mettre des quote pour les valeurs : '-0.47'
2/ d'inverser les valeurs, car en négatif le plus 'petit' c'est 0.49 : between -0.49 and -0.47
 
Nouveau WRInaute
jeroen a dit:
essaie peut être
1/ de mettre des quote pour les valeurs : '-0.47'
2/ d'inverser les valeurs, car en négatif le plus 'petit' c'est 0.49 : between -0.49 and -0.47

Merci d'avoir répondu rapidement, il s'agit de la deuxième solution.
C'était tout simple :oops:

Merci pour le conseil :wink:
 
Discussions similaires
Haut