Système de recherche par code postal + rayon de x kms

WRInaute passionné
Bonjour à tous,

Comment mettre en place, pour un site d'annonces auto par exemple, un système permettant d'englober dans sa recherche, les codes postaux des villes proches de x kilomètres par rapport à la ville choisie pour effectuer sa recherche?

Un exemple : http://www.autoscout24.fr/fre/home.asp
On peut par exemple faire une recherche pour le code postal 75010 en incluant les villes dans un rayon de 10 kms.

Sébastien.
 
WRInaute accro
Tu veux dire comment faire pour ne pas avoir à se pastiller la construction de la base de données en indiquant à la main quels sont les CP proches ?...

Moi je dirais : récupérer une liste existante de CP mais où ?...

edit : plutôt que x kms, ne peux-tu pas procéder par cantons par exemple ? une liste ici
 
WRInaute accro
dd32 a dit:
Tu veux dire comment faire pour ne pas avoir à se pastiller la construction de la base de données en indiquant à la main quels sont les CP proches ?...

Moi je dirais : récupérer une liste existante de CP mais où ?...

edit : plutôt que x kms, ne peux-tu pas procéder par cantons par exemple ? une liste ici

En Belgique, je l'ai fait avec des coordonnées de Lambert ou longitude / latitude. Après, c'est facile à calculer la proximité avec un seuil.

Moins précis, tu peux aussi jouer sur les départements, par exemple (lien CP / département, de mémoire).
 
WRInaute passionné
ecocentric a dit:
Moins précis, tu peux aussi jouer sur les départements, par exemple (lien CP / département, de mémoire).

Oui en effet, c'est une solution.
Mais je ne suis pas sure que les numéro de CP numériquement proches soient forcément géographiquement proches également.
 
WRInaute discret
Nouveau WRInaute
Re: ville + département + région + pays

PoT_de_NuTeLLa² a dit:
Bonjour ci joint le lien pour les tables ville (avec GPS), département, région, pays.
http://on-irc.com/ville_region_departement_pays.sql

Si quelqu'un connait la formule par contre pour qu'avec les valeur GPS on puisse sélectionner les villes au alentours ca m'intéresse grandement

Y a un pb dans cette base dans la correspondance entre ville et départements.
La clé étrangère de la table ville qui pointe vers les départements à été construite automatiquement en prenant les 2 premiers caractères du code postal :!: .
Ca marche pour tous les départements sur 2 chiffres, mais pas avec les département 01,02,03,04,05,06,07,08,09.

Par exemple Privas : Code postal 7000 et Département Ariège (07)
Dans la base le lien vers le département a été donc construit a partir du Code Postal -> et donc Département = 70 , cad HAUTE-SAONE... (ce qui est totalement faux bien sur, Privas c'est bien dans l'ariège).

Pour corriger, il faut regénérer le code du département : on divise par 1000 le Code postal (avec un arrondi correct), tout en tenant compte de la particularité de la Corse (2A et 2B). A ce propos, il faut aussi modifier la table Département dans lequels les 2 départements sont regroupés dans un seul enregistrement...
 
WRInaute passionné
Pour ma part j'ai laissé la Corse en un bloc vu que je ne vais pas m'amuser à trier chacune des villes...

Pour les départements, j'ai fait une simple requête :
UPDATE `ville_table` SET `departement_id` = floor(cp_vi/1000) WHERE 1

Je souhaite créer une carte de France et via php créer une image indiquant l'emplacement de certaines villes grâce aux coordonnées.
Avez-vous des cartes à l'échelle et une formule permettant de s'y repérer ?

Merci.
 
WRInaute passionné
J'avance petit à petit.

Sur ma carte, j'ai déterminé la localisation de Paris pour ensuite placer les autres villes en fonction d'elle.

J'arrive à calculer la distance qui les sépare mais il me manque la formule pour calculer le "cap", l'angle.

Le site http://www.ephemeride.com/atlas/distance/27/ indique les km et le cap mais je ne trouve nul part comment le calculer...
Si vous avez la solution, merci d'avance.
 
WRInaute passionné
J'ai trouvé une formule pour calculer le cap

//Distance en km entre deux villes
function distance($lat1, $lon1, $lat2, $lon2)
{
$lat1 = deg2rad($lat1);
$lat2 = deg2rad($lat2);
$lon1 = deg2rad($lon1);
$lon2 = deg2rad($lon2);

$R = 6371;
$dLat = $lat2 - $lat1;
$dLong = $lon2 - $lon1;
$var1= $dLong/2;
$var2= $dLat/2;
$a= pow(sin($dLat/2), 2) + cos($lat1) * cos($lat2) * pow(sin($dLong/2), 2);
$c= 2 * atan2(sqrt($a),sqrt(1-$a));
$d= $R * $c;

//CALCUL DE L'ANGLE
$H = asin(sin($lon1)*sin($lon2) + cos($lon1)*cos($lon2)*cos($lat2-$lat1));
$A = acos((sin($lon2)-sin($lon1)*sin($H))/(cos($lon1)*cos($H)));

$val[0] = $d; //distance
$val[1] = $A; //angle (cap)
return $val;
}

$A est l'angle trouvé.

Cependant, la précision n'y est pas...
Par endroit, il manque 7-8 degrés, à d'autres c'est 7-8 degrés de trop... l'angle est bon assez rarement.

Il existe diverses formules avec une précision plus ou moins bonne, il faut trouver celle adaptée...

Edit : en bidouillant un peu et en prenant comme point de repère Brest, j'ai amélioré la précision et les décalages ne dépassent pas 2 degrés. (qq millimetres sur la carte)
 
WRInaute passionné
La base de données n'est pas top, il manque quelques villes/villages...

Il y a des ptits bleds de 500 habitants présents dans la base alors que des villages de 2000 habitants n'y figurent pas...
 
Discussions similaires
Réponses
3
Affichages
3K
mathieukassovitz
M
Haut