User:Guillaume Audirac/extraction communes

From OpenStreetMap Wiki
Jump to navigation Jump to search

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