User:Guillaume Audirac/extraction communes
Extraction des communes à partir de Wikipédia
Voici deux scripts. Le premier extrait les données de Wikipédia et les convertit dans un fichier .osm (script gentiment fourni par mat). Merci mat ;) Le second extrait de Wikipédia la liste des communes d'un département et utilise le premier script pour extraire tous les fichiers.
Attention: certaines différences dans les pages de Wikipédia peuvent conduire à une extraction erronée. Merci de m'en informer.
Avertissement: il est impératif de déplacer chaque commune dans JOSM lors de l'édition car les coordonnées de latitude/longitude de Wikipédia ont une origine douteuse (Google Maps ? lien ?). Les points seront généralement placés près du centre historique de la ville/du village (église/mairie).
Exemple de contenu de fichier .osm généré
<osm version="0.6" generator="mat"> <node id="-1" lat="49.1463888889" lon="-1.12861111111"> <tag k="code_departement" v="50" /> <tag k="place" v="village" /> <tag k="population" v="219" /> <tag k="census" v="2006" /> <tag k="addr:postcode" v="50000" /> <tag k="ref:INSEE" v="50423" /> <tag k="name" v="Rampan" /> <tag k="source" v="http://fr.wikipedia.org/wiki/Rampan" /> <tag k="wikipedia:fr" v="Rampan" /> </node> <relation id="-1"> <member type="node" ref="-1" role="admin_centre" /> <tag k="admin_level" v="8"/> <tag k="boundary" v="administrative"/> <tag k="name" v="Rampan"/> <tag k="type" v="boundary"/> <tag k="addr:postcode" v="50000" /> <tag k="ref:INSEE" v="50423" /> <tag k="source" v="http://fr.wikipedia.org/wiki/Rampan" /> </relation> </osm>
Script d'extraction d'une commune
Script fourni par mat.
Utilisation: ./import_commune.sh "Nom de la page dans Wikipédia"
Exemple: ./import_commune.sh "Acqueville (Manche)"
#!/bin/sh # import_commune.sh # Script initial de mat export LANG=C if [ $# -ne "1" ]; then echo -e "Utilisation:\t$(basename $0) \"Titre de la page dans Wikipédia\"" echo -e "Exemple:\t$(basename $0) \"Acqueville (Manche)\"" exit 1 else echo "$1" fi commune="`echo $1 | sed -e 's/ /_/g'`" curl --compressed -s "http://fr.wikipedia.org`curl --compressed -Ls http://fr.wikipedia.org/wiki/Special:Recherche?search="$commune" | sed -n -e '/rel="edit"/s/.*href="\(.*\)" \/>/\1/p' | sed -e 's/&/\&/g'`" | sed -e '/sansdoublescomptes/d' | awk -F = '$1 ~ /\| *nomcommune/ {com=$2; sub(/^ */, "", com); sub(/ *$/, "", com)} $1 ~ /wgPageName/ {pagename=$2;sub(/ *\"/, "", pagename);sub(/\"[,;]/, "", pagename);gsub(/\\/, "", pagename)} $1 ~ /wgTitle/ {title=$2;sub(/ *\"/, "", title);sub(/\"[,;]/, "", title);gsub(/\\/, "", title)} $1 ~ /\| *latitude/ {lat=$2;} $1 ~ /\| *longitude/ {lon=$2} $1 ~ /\| *insee/ {insee=$2; gsub(/ /, "", insee);} $1 ~ /\| *cp/ {cp=$2; gsub(/ /, "", cp);} $1 ~ /\| *sans/ {sans=$2; gsub(/ /, "", sans);} $1 ~ /\| *date-sans/ {date=$2; gsub(/ /, "", date);gsub(/\[/, "", date); gsub(/\]/, "", date); gsub(/ /, "", date)} END { if (int(sans) < 10000) { type = "village"; } else { if (int(sans) < 100000) { type = "town"; } else { type = "city"; } } print "<osm version=\"0.6\" generator=\"mat\">" print " <node id=\"-1\" lat=\"" lat "\" lon=\"" lon "\">" print " <tag k=\"code_departement\" v=\""substr(insee, 1, 2)"\" />" print " <tag k=\"place\" v=\""type"\" />" print " <tag k=\"population\" v=\""sans"\" />" print " <tag k=\"census\" v=\""date"\" />" print " <tag k=\"addr:postcode\" v=\""cp"\" />" print " <tag k=\"ref:INSEE\" v=\""insee"\" />" print " <tag k=\"name\" v=\""com"\" />" print " <tag k=\"source\" v=\"http://fr.wikipedia.org/wiki/"pagename"\" />" print " <tag k=\"wikipedia:fr\" v=\""title"\" />" print " </node>" print " <relation id=\"-1\">" print " <member type=\"node\" ref=\"-1\" role=\"admin_centre\" />" print " <tag k=\"admin_level\" v=\"8\"/>" print " <tag k=\"boundary\" v=\"administrative\"/>" print " <tag k=\"name\" v=\""com"\"/>" print " <tag k=\"type\" v=\"boundary\"/>" print " <tag k=\"addr:postcode\" v=\""cp"\" />" print " <tag k=\"ref:INSEE\" v=\""insee"\" />" print " <tag k=\"source\" v=\"http://fr.wikipedia.org/wiki/"pagename"\" />" print " </relation>" print "</osm>" }' | tee "$1".osm
Script d'extraction de toutes les communes d'un département
Script à placer dans le même dosser que le script d'extraction d'une commune.
Utilisation: ./import_departement.sh "Nom de la page dans Wikipédia"
Exemple: ./import_departement.sh "Liste des communes de la Manche"
Note: comme le script de mat utilise le mode d'édition de Wikipédia, j'ai noté un ralentissement dans le chargement des pages après plusieurs dizaines. Des éditions toutes les 2 sec sont probablement détectées par le serveur. Il est aussi possible d'adapter le script pour ne charger qu'une sélection de communes.
#!/bin/bash # import_departement.sh # Guillaume Audirac, février 2010 export LANG=C set -u # Convertit les caractères Unicode web (%xx%yy) vers le caractère accentué function convertir_unicode() { local conv=$(echo -n $1 | echo -e $(sed -e 's/%/\\x/g')) echo "$conv" } if [ $# -ne "1" ]; then echo -e "Utilisation:\t$(basename $0) \"Titre de la page dans Wikipédia\"" echo -e "Exemple:\t$(basename $0) \"Liste des communes de la Manche\"" echo -e "Pour la liste des communes françaises, voir http://fr.wikipedia.org/wiki/Listes_des_communes_de_France" exit 1 else echo "$1" fi # Page Wikipedia pour extraction des communes d'un département DEP="$(echo $1 | sed -e 's/ /_/g')" # Création du répertoire pour la commune if [ ! -e $DEP ]; then echo "Création du répertoire $DEP" mkdir $DEP elif [ ! -d $DEP ]; then echo "$DEP n'est pas un répertoire" exit 1 fi cd $DEP # Chargement de la page Wikipédia et création d'un fichier de communes curl --compressed "http://fr.wikipedia.org/wiki/$DEP" | \ sed -n '/<table/,/<\/table>/p' | \ sed -e '/<td>[0-9]*<\/td>/d' | \ sed -n '/href.*wiki/p' | \ sed -e '/Communauté/d' | \ sed -e 's/.*\(<a href.*>\)/\1/' | \ cut -f 2 -d '"' | \ cut -f 3 -d '/' | \ sed -e '/^ *$/d' | \ sort -u | \ sed '/[cC][oO][dD][eE].[iI][nN][sS][eE][eE]/d' | \ sed '/[cC][oO][dD][eE].[pP][oO][sS][tT][aA][lL]/d' \ > $DEP.txt # Chargement des fichiers .osm pour chaque commune for commune in $(cat $DEP.txt); do commune_unic="$(convertir_unicode "$commune")" echo echo "** Import de $commune_unic **" ../import_commune.sh "$commune_unic" sleep 3s done