[SQL] Régions-départements-villes de France

Résolu/Fermé
sp00m` - 18 juil. 2009 à 19:24
 Chlie22 - 20 oct. 2015 à 14:30
Bonjour,

Je mets à votre disposition un script SQL qui lie les régions, les départements et les villes Françaises.

Téléchargez-le ici : www.christophemaillard.cmoi.cc (lien vers le script sur la page d'accueil).

Servez-vous ! Ça peut avoir différentes utilités, par exemple vérifier le code postal-ville lors d'une inscription, ou encore calculer la distance (vol d'oiseau) entre deux villes (coordonnées latitude-longitude).

table regions
     id
     region
     filtre

table departements
     id
     id_region
     numero
     departement
     filtre

table ville
     id
     id_departement
     departement
     filtre
     cp
     lat
     lon


A plus,

sp00m`
A voir également:

19 réponses

Le champ filtre sert à comparer plus rapidement les données à l'inscription (cp + ville) avec celles de la base de données (insensible à la casse et aux accents, etc. - "SELECT filtre, cp FROM ville" plutôt que "SELECT ville, cp FROM ville").

Après, je n'ai pas vu l'utilité du code INSEE mais ça peut se rajouter assez facilement.

Et pour ce qui est de la distance, son calcul se fait assez facilement aussi juste avec les coordonnées latitude-longitude. Mais je veux bien que tu m'expliques comment tu fais aussi avec les coordonnées Lambert 2 étendu ^^
2
imw Messages postés 233 Date d'inscription vendredi 17 juillet 2009 Statut Membre Dernière intervention 8 septembre 2011 42
19 juil. 2009 à 16:09
Pour ce qui est de l'insée, je m'en sers pour localiser les clients !
Le soucis étant qu'en leur demandant un code postal, je peux avoir plusieurs réponse, je leur donne donc le choix de la ville et ensuite, je me sers de l'insée pour tout le reste des procédures. Je pourrai aussi utiliser l'id de ma table, mais ce n'est pas très explicite (dans les urls, dans les mails ...) ... m'enfin chacun ses gouts.

Pour ce qui est des Lambert 2 étendus ils donnent une valeur en mètres X et Y sur toute la France par rapport à un point d'origine.
En gros, tu place la carte un repère orthonormé sur la carte de France, et tu as les valeur X,Y des toutes les villes :
http://seig.ensg.eu/IMAGES/FP28/FP28_2.gif
Donc un simple sqtr((x1-x2)²+(y1-y2)²) te donne la distance entre 2 points (en mètre).
C'est aussi super pratique pour positionner les villes sur une carte (suffit de définir les coordonnées de la carte par rapport aux coordonnées globales et hop...)

J'ai récupérer l'intégralité de ces données ...

J'ai aussi dans ma table les altitudes min et max des communes, la superficie, et il faut que j'y rajoute la population (j'ai déjà les données, faut juste que je les croisent avec la table).

La population peut être intéressante pour sortir les plus grandes villes par exemple.
0
Merci pour ton script!!
0
Salut merci pour cette superbe base, mais je pense que tu as un problème avec les département dans ta table "ville" à partir de la ligne 7047 à la ville Aghione. Les départements ne correspondent plus avec les codes postaux.

Ville CP Numéro de département
Aghione 20270 21

Autre petite coquille la dernière ville Wy-dit-Joly-Village s'écrit avec un i dans joli.

Voilà c'est juste pour éviter que d'autre ne se fasse avoir.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Juste pour info, la base à été mise à jour avec les modifications dont Docteur Doc parlait.

Enjoy,

sp00m`
0
Bon juste pour info il y a un web service mondial (plus ou moins à jours mais plutôt plus) qui permet d'avoir en permanence des données à jours...

une requête HTTP avec paramètre = une réponse XML du site...

Je m'en sers pour presque tout dès qu'il s'git de géographie et d'adresse postale

Just enjoy by clicking there www.geonames.org
0
Crisu Messages postés 83 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 30 mars 2011 40
17 déc. 2009 à 22:25
Slt Spoom,
Arf ... ton script m'interesse mais ton lien est "down" :( ...
Te serai t il possible de le mettre sur un serveur ou une Url qui fonctionne ?

Merci en tt cas :)
0
Salut a tous
Moi aussi ton script m'intéresse il a l'air vraiment bien foutu..
Quelqu'un l'a gardé et pourrait le remettre a disposition ce serait sympa.

Merci
0
Crisu Messages postés 83 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 30 mars 2011 40
14 janv. 2010 à 10:00
Slt Squeezy,

comme toi ca m'intéresse mais pas de réponse à mon précédent Post.
Du coups après avoir cherché un peu je suis tombé sur ca :

https://www.paperblog.fr/1371087/liste-des-villes-de-france-avec-coordonees-gps-et-les-departements-et-carte-dynamique-en-flash-v3/

Je crois que tout y est ;)

C you :]~
0
En effet, je m'étais basé sur la BDD que tu proposes pour réaliser la mienne. L'inconvénient de celle que tu cites (d'après mes souvenirs), c'est que les villes et dept n'étaient pas liés (en gros, la base n'était pas orientée utilisation WEB).

Je remet mon script d'ici peu en ligne.

sp00m``
0
Crisu Messages postés 83 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 30 mars 2011 40 > sp00m`
15 janv. 2010 à 08:41
Slt sp00m,

l'ayant utilisé il y a peu je confirme que les villes sont correctement liées et donc orienté Web.
Il me semble qu'il existe plusieurs version de ce script, et que le lien envoyé est la version 3, peut être celles d'avant étaient différentes ...


Have a nice day ^^
0
Salut,

Je suis désolé, mon site est down, l'hébergeur gratuit chez lequel j'étais n'a pas supporté les intempéries... ^^

Je le mettrais temporairement en ligne sur un autre site, je vous donne l'URL demain.

sp00m`
0
Ok Merci j'attends ca avec impatience...
0
Etrangement, mon hébergeur a repris vie ^^ Le script est donc à nouveau disponible sur :

www.christophemaillard.cmoi.cc (accueil -> actualité au 18/07/2009)

Enjoy,

sp00m`
0
Merci fiston c'est cool.
0
sp00m` > Squeezy F
15 janv. 2010 à 20:04
Y'a pas d'quoi, p'pa!
0
il semblerait que le site n'existe plus ???
0
En effet, l'hébergeur a arrêté ses services gratuits. Contacte-moi par email (christophe.maillard.1989@gmail.com) pour avoir le script.
0
Juste pour info, le script est de nouveau disponible à cette adresse :

http://isabellemaillard.iceheberg.fr/upload/france.sql
0
florence06785
6 sept. 2010 à 09:30
Bonjour sp00m,

Pouvez expliquer clairement ou vous avez eu cette base ainsi que le script servant à calculer les positions ?

En êtes vous l'auteur ?
0
L'INSEE met à dispo une base qui recense toutes les villes de France, avec leur CP, code INSEE, lat, long, et autres données je crois. Je n'ai gardé que le nom des villes, le CP, et les coordonnées lat-long. En suite, j'ai créé le champ filtre (utile pour vérifier un formulaire par exemple). Et enfin, j'ai créé les tables region et departement, en prenant soin de bien lier les indices (id region, id departement, id ville).

Donc non, je n'en suis pas l'auteur, je me suis inspiré de ce que proposait l'INSEE et l'ai "arrangé" selon mon utilité.

Voici un script permettant de calculer la distance à vol d'oiseau entre 2 villes (non-optimisé, mais fonctionnel) :

class Misc
{

	public static function getDistance($_idVille1, $_idVille2)
	{
		$result = mysql_query("SELECT lat, lon FROM ville WHERE id = $_idVille1 OR id = $_idVille2");
		$i = 0;
		while($data = mysql_fetch_array($result))
		{
			if($i == 0)
			{
				$rlo1 = deg2rad($data['lon']);
				$rla1 = deg2rad($data['lat']);
			}
			elseif($i == 1)
			{
				$rlo2 = deg2rad($data['lon']);
				$rla2 = deg2rad($data['lat']);
			}
			$i++;
		}
		$earthRadius = 6367000;
		$dlo = ($rlo2 - $rlo1) / 2;
		$dla = ($rla2 - $rla1) / 2;
		$a = (sin($dla) * sin($dla)) + cos($rla1) * cos($rla2) * (sin($dlo) * sin($dlo));
		$d = 2 * atan2(sqrt($a), sqrt(1 - $a));
		$distance = $earthRadius * $d;
		return ceil($distance / 1000);
	}

}


L'appel se fait ainsi :

Imaginons que nous voulions la distance entre Lyon (id dans la table : 27534) et Dunkerque (id dans la table : 22379) :

$distance = Misc::getDistance(27534, 22379);
0
Merci beaucoup, sp00m'
je teste de suite, ça semble correspondre à ce que je cherchais.
Quand on voit que certains sites proposent la même chose en payant, on ne peut que te féliciter!
0
Attention quand même...Après quelques tests, je renonce à l'utiliser en production: En effet, il manque des communes (essayez par exemple de trouver saint Julien, 83560, pourtant ça existe, j'y habite ;))
Et les arrondissements des grandes villes sont fantaisistes
Merci quand même pour le boulot sp00m', mais c'est pas encore au top
0
kitsuo Messages postés 24 Date d'inscription dimanche 8 janvier 2012 Statut Membre Dernière intervention 13 mars 2017
Modifié par kitsuo le 5/05/2014 à 11:25
Bonjour !
Quelqu'un aurait le fichier dont il est question dans le premier post svp ? Le site donné ne fonctionne plus et j'aurais grande utilité de ce fichier :D !
Merci par avance !

--
0
Le lien ne marche plus, pas de fichier
0
imw Messages postés 233 Date d'inscription vendredi 17 juillet 2009 Statut Membre Dernière intervention 8 septembre 2011 42
19 juil. 2009 à 09:49
intéressant ... je me suis déjà fait à peu près la même chose ....

a quoi te sers le champ filtre ?
il serait intéressant de rajouter le code insée des villes et pourquoi pas les coordonnées en Lambert 2 étendu qui permet de calculer très facilement la distance entre 2 villes ...
-1
Une petite fonction codé à l'arrache pour corrigé le problème.
function correcBDD()
  {
    $sql = "SELECT id, cp FROM bdd_ville";
    $res = queryDB($sql);
    while($data = mysql_fetch_assoc($res))
      {
   			$newDep = substr($data['cp'], 0,2);
				$sql2 = "UPDATE bdd_ville SET id_departement='$newDep' WHERE id='$data[id]'";
				$res2 = queryDB($sql2);
      }
			echo 'terminer';
  }
correcBDD();

Remplacer bdd_ville par le nom de votre table.
-1
Ben en fait, c'est la Corse qui m'a posé pas mal de problème (comme toujours ^^) parce qu'elle est divisée en 2 départements : 2A et 2B sauf que les codes postaux commencent tous par 20***. Si on exécute ton script, je ne pense pas que ça résolve le problème... Si tu l'as fait est que ça fonctionne quand même, dis moi !

Pour info, voilà un objet qui calcule la distance à vole d'oiseau entre 2 villes en donnant les ids des villes :

class Misc
{
	
	public static function getDistance($_idVille1, $_idVille2)
	{
		$result = mysql_query("SELECT lat, lon FROM ville WHERE id = $_idVille1 OR id = $_idVille2");
		$i = 0;
		while($data = mysql_fetch_array($result))
		{
			if($i == 0)
			{
				$rlo1 = deg2rad($data['lon']);
				$rla1 = deg2rad($data['lat']);
			}
			elseif($i == 1)
			{
				$rlo2 = deg2rad($data['lon']);
				$rla2 = deg2rad($data['lat']);
			}
			$i++;
		}
		$earthRadius = 6367000;
		$dlo = ($rlo2 - $rlo1) / 2;
		$dla = ($rla2 - $rla1) / 2;
		$a = (sin($dla) * sin($dla)) + cos($rla1) * cos($rla2) * (sin($dlo) * sin($dlo));
		$d = 2 * atan2(sqrt($a), sqrt(1 - $a));
		$distance = $earthRadius * $d;
		return ceil($distance / 1000);
	}

}


Appel principal :

$distance = Misc::getDistance($idVille1, $idVille2);
0
Petit correction, je me souviens de la manière dont j'avais traité le problème.
Dans la table departement, il faut différencier id et numero :
Puisque la corse est divisée en 2 départements (2A et 2B) mais que les codes postaux commencent tous par 20***, on a donc le département 2A qui a pour id 20 et le département 2B qui a pour id 21. C'est pour cela qu'on peut croire qu'il y a un décalage (par exemple: la Vienne a pour numéro 86 mais pour id 87).

Pour les requêtes, il faut faire comme cela :
SELECT departement FROM departement WHERE id = (SELECT id_departement FROM ville WHERE filtre LIKE 'aghione')

Le résultat donnera bien Haute Corse, la relation est donc bien vérifiée.

Désolé pour la précision un peu tardive ^^
0
Docteur Doc
23 nov. 2009 à 23:35
Juste une petite précision : le département d'une ville ne correspond pas à tous les coups aux deux premiers chiffres du code postal, donc ta fonction de correction est erronée.

Source : https://fr.wikipedia.org/wiki/Code_postal_en_France#Les_deux_premiers_chiffres

Les deux premiers chiffres du code correspondent au numéro du département dans lequel est situé le bureau distributeur du courrier de la commune : il existe quelques cas rares de communes dont le courrier est distribué par un bureau qui ne se trouve pas dans le même département (cas de villages limitrophes). Par exemple Laveyrune a pour code postal 48250 (48 étant le code de la Lozère), alors qu'elle est située dans l'Ardèche (07).

Tu pourras le vérifier en téléchargeant le fichier contenant la liste simplifiée des communes (intitulé comsimp2009) sur le site de l'INSEE et en le croisant avec ta table des codes postaux.

Cordialement,
Docteur Doc.
0
sp00m` > Docteur Doc
24 nov. 2009 à 00:34
Wow, merci, je n'aurais jamais su ça tout seul ! Je vais faire les modifs et remettre à jour. Merci l'organisation de la poste française ^^
0
Docteur Doc > sp00m`
27 nov. 2009 à 15:36
De rien sp00m`, je traite des données géographiques depuis un petit bout de temps pour un usage professionnel.

Sur le plan personnel, je me suis lancé dans la géolocalisation et le croisement des données de l'INSEE, à titre expérimentale. J'ai une base MySQL qui commence à être bien solide (extensible à la plupart des organisations des autres pays) et associée à une classe PHP qui permet de la manipuler. Je penserai à la partager dès qu'elle sera un peu plus aboutie et en faire part sur ce topic.

En attendant, bonne continuation.
Docteur Doc
0