Rechercher : dans
Par :

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

Dernière réponse le 27 nov 2009 à 15:36:08 sp00m`, le 18 jui 2009 à 19:24:43 
 Signaler ce message aux modérateurs

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`
Configuration: Windows XP
Firefox 3.0.11

Meilleures réponses pour « [SQL] Régions départements villes de France » dans :
CCM et les bourses d'études VoirBourses d'études Beaucoup demandent des bourses d'études via ce site (CCM). Cet article a été créé pour leur répondre. CCM et les bourses d'études Bourses d'études en France Considérations générales Bourses du second degré et des premier...
Changer la région de son lecteur/graveur DVD VoirVous aurez peut être à changer la région de votre lecteur/graveur DVD pour quelconque raison. La région d'un lecteur permet de lire les DVD de la zone concernée. Exemple : Vous achetez un DVD au Costa Rica, alors que vous habitez en France...

1

imw, le 19 jui 2009 à 09:49:41

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 ...
Combien faut-il de développeurs chez µ$ pour faire un bon lo­giciel ?
Plus ... beaucoup plus !

Répondre à imw

2

sp00m`, le 19 jui 2009 à 15:06:02

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 ^^

Répondre à sp00m`

3

imw, le 19 jui 2009 à 16:09:52

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.

Répondre à imw

4

Zouaghi, le 18 sep 2009 à 18:16:24

Merci pour ton script!!

Répondre à Zouaghi

5

Knah Tsaeb, le 4 nov 2009 à 12:19:46

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.

Répondre à Knah Tsaeb

6

Knah Tsaeb, le 4 nov 2009 à 14:08:39

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.

Répondre à Knah Tsaeb

7

sp00m`, le 10 nov 2009 à 12:44:59

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);

Répondre à sp00m`

8

sp00m`, le 13 nov 2009 à 12:14:40

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 ^^

Répondre à sp00m`

9

Docteur Doc, le 23 nov 2009 à 23:35:17

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 : http://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.

Répondre à Docteur Doc

10

sp00m`, le 24 nov 2009 à 00:34:15

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 ^^

Répondre à sp00m`

12

 Docteur Doc, le 27 nov 2009 à 15:36:08

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

Répondre à Docteur Doc

11

sp00m`, le 24 nov 2009 à 23:10:43

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

Enjoy,

sp00m`

Répondre à sp00m`