8791 sujets

Développement web côté serveur, CMS

Salut,

je suis en train de faire une appli qui, en rentrant un code postal, doit me retourner toutes les occurences d'une base de données dont le code postal correspond, mais également les codes postaux des villes à 10km à la ronde.

Connaissez vous une façon de faire ?

Merci !
Modifié par Ondskapt (20 Jun 2007 - 10:20)
bonjour ,

C'est pas l'algorithme du Facteur !?? Smiley cligne

J'ai pas de solution mais je te souhaite bien du courage pour tes base de données ...et les gestiions de tris .
Salut Smiley cligne ,

Pas très simple à automatiser ton problème Smiley murf car un code postal ne correspond pas forcément à une ville :

44000 : Nantes

mais

44590 : Derval
44590 : Lusanger
44590 : Mouais
44590 : Sion les mines
44590 : St vincent des landes

Le plus simple pour la restitution du résultat (mais aussi le plus fastidueux pour l'insertion dans la table) pourrait être :
[b]Table villes[/b]
CodPos   Ville		CodPosEnvironnants
44590    Derval         44570;44580
44590    Lusanger       44560;44570;44580
44590    etc…           etc…

[b]Requête[/b]
Select Ville From villes where CodPos = 44570 and CodPosEnvironnants like ‘%44570%’


A+
Ben apparement il existe une fonction mathématique qui utilise les longitudes/latitudes et qui croise ça avec une base de données contenant les codes postaux des communes ainsi que leurs coordonnées géographiques pour te resortir l'ensemble des communes correspondant a ton code postal + les 10KM (à définir) autour.

Le problème c'est que mon prédecesseur a trouvé ça, a fait fonctionner ça devant le client, mais est parti sans laissé de code ni de notes ...
Re'

ben effectivement c'était la solution qui m'était venue à l'esprit mais comme je disais, un code postal ne correspond pas forcément à une seule ville alors difficile de le faire correspondre à une longitude / latitude.

Mais peut-être que ce lien pourrait te dépanner si tu choisis cette solution (en attribuant une longitude / latitude à chaque code postal ? Smiley rolleyes )

A+
Ouais ça a l'air d'être ça. J'ai normalement à disposition un fichier ou une base de donnée qui contient les codes postaux et leurs coordonées.

Merci !
Heyoan a écrit :
Re'

Mais peut-être que ce lien pourrait te dépanner si tu choisis cette solution (en attribuant une longitude / latitude à chaque code postal ? Smiley rolleyes )

A+


Bonjour,

http://www.galichon.com/codesgeo/ . Dernier Fichier en bas. Smiley cligne
Je ne remercierai jamais assez l'auteur de ce site Smiley smile
Modifié par Lanza (19 Jun 2007 - 13:39)
Hum, j'ai quelques incompréhensions et comme les maths c'est pas trop mon truc, je ne sais pas trop d'où ça peut venir.

J'explique rapidement la situation : j'ai une base de données avec toutes les communes de France, leur code postal, code Insee, Latitude et Longitude. Le but de ma fonction est de trouver toutes les communes dans un rayon de 10km autour d'un point donné.

Je fais donc une requete avec le code postal pour obtenir les coordonnées de la commune. Je garde ces coordonnées dans un coin :


$latDepart = $contenu['Latitude'];
$longDepart = $contenu['Longitude'];


Je converti en angle mes 10km pour délimiter une zone de recherche


// Données fixes
$R = 6371; // rayon de la Terre
$kilometre = 10; // nb de kilometre qu'on veut parcourir
$angle = $kilometre/$R; //angle donné pour varier les latitudes et longitudes


Je détermine les latitudes et longitudes maximales et minimales


$latMin = $latDepart-$angle;
$latMax = $latDepart+$angle;
$longMin = $longDepart-$angle;
$longMax = $longDepart+$angle;


Je fais ensuite une autre requete qui va chercher toutes les communes dans cette zone


$requete = "select * from communes where Latitude>$latMin and Latitude<$latMax and Longitude<$longMax and Longitude>$longMin";


Ca, ça fonctionne. J'ai l'ensemble des communes dans une surface carée autour de mon point de départ. Mais un carré ce n'est pas un rond donc je calcule la distance entre mon point de départ et les coordonées pour vérifier qu'elle n'excède pas 10km. Pour ça j'utilise la fonction trouvée dans le lien donné plus haut :


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; 
			return $d; 
		}


Sauf que ... ça me donne des valeurs completement farfelues.

J'ai défini par défaut que Reims était mon point de départ


echo "Distance REIMS - ", $contenu['NomLocalite'] ," : ";
echo distance($latDepart,$longDepart,$contenu['Latitude'],$contenu['Longitude']);




Edit : j'ai compris, ma base de données exprimait les coordonées en radian et la fonction toute faite convertissait degré en radian, donc forcement, convertir un radian encore une fois en radian, c'était pas une bonnée idée Smiley lol
Modifié par Ondskapt (20 Jun 2007 - 10:50)