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