User:NicolasDumoulin/Historique
Méthode publiée par Bruno Cortial
Ancienne méthode abandonnée
Préparation des données
Construction du polygone de la region d'étude
Construction du polygone de délimitation de la région Auvergne :
# fichier de transformation qui nettoyera le fichier de données pour le script de création du polygone echo """<?xml version="1.0"?> <translations> <translation> <name>Delete tags</name> <description></description> <match mode="or"> <tag k=".*" v=".*"/> </match> <output> <copy-unmatched/> </output> </translation> </translations>""" > tagtransform_delalltags.xml # Téléchargement des données wget -O auvergneRel.osm http://api.openstreetmap.org/api/0.6/relation/8638/full && \ # nettoyage des données osmosis --rx file=auvergneRel.osm --tag-transform file=tagtransform_delalltags.xml --wx file=auvergneRel_withoutTags.osm
Mais le polygone peut être composé de plusieurs chemins, il faut donc les fusionner. Pour cette tâche, je n'ai pas trouvé de moyen automatique, il faut donc utiliser josm, sélectionner tous les chemins (rechercher le motif "type:way") et les fusionner (raccourci clavier "C" par défaut). Puis on utilise le script perl pour générer le fichier polygone.
# création du fichier polygone perl osm2poly.pl auvergneRel_withoutTags.osm > auvergne.poly
Extraction des données
La solution retenue est de télécharger des planet.osm à diverses dates, par exemple sur ce miroir.
Script d'extraction des données selon le polygone construit pour des données en 0.5 :
DATE=$( echo ${FICHIER} |sed -e 's/planet-\(.*\).osm.bz2/\1/') && \ time osmosis-0.35 --read-xml-0.5 file="${FICHIER}" --migrate --bp file=auvergne.poly completeWays=yes --used-node --write-xml file="auvergne-$DATE.osm.bz2"
Script d'extraction des données selon le polygone construit pour des données en 0.6 :
DATE=$( echo ${FICHIER} |sed -e 's/planet-\(.*\).osm.bz2/\1/') && \ time osmosis --rx file="${FICHIER}" --bp file=auvergne.poly completeWays=yes --used-node --write-xml file="auvergne-$DATE.osm.bz2"
Pour les données plus anciennes, dans un format 0.3 ou 0.4, cf cette discussion qui indique d'utiliser ce script.
Création de la base et chargement des données
Après avoir installé postgis dans une machine virtuelle, on peut charger les données extraites :
DATE=$( echo ${FICHIER} |sed -e 's/auvergne-\(.*\).osm.bz2/\1/') && \ # Création de la base ssh -p 2222 postgres@localhost "sh createdb4OSM.sh historic${DATE}" && \ # chargement des données osm2pgsql -S default.style --slim -u -U mapnik -H 127.0.0.1 -P 5434 -C 1024 -d historic$DATE ${FICHIER}
On charge aussi la relation utilisé dans une base séparée pour avoir toujours la même limite au cours du temps (en l'occurence, la limite de l'Auvergne n'existait pas au début) :
ssh -p 2222 postgres@localhost "sh createdb4OSM.sh relAuvergne && \ osm2pgsql -S default.style --slim -u -U mapnik -H 127.0.0.1 -P 5434 -C 1024 -d relAuvergne auvergneRel.osm
Rendu
Voici un script python qui fait un rendu des données à plusieurs dates :
#!/usr/bin/python # -*- coding: utf-8 -*- import mapnik import sys, os def addLayer(m, name, dbname, table, symbolizer): # création du style s = mapnik.Style() r = mapnik.Rule() r.symbols.append(symbolizer) s.rules.append(r) m.append_style(name,s) # création de la couche layer = mapnik.Layer(name, "+proj=latlong +datum=WGS84") layer.datasource = mapnik.PostGIS(host='localhost',port='5434',user='mapnik',password='mapnik',dbname=dbname,table=table) layer.styles.append(name) m.layers.append(layer) return layer def drawMap(date): # Création de la carte m = mapnik.Map(1000,1500) m.background = mapnik.Color('white') projection = "+proj=latlong +datum=WGS84" # Ajout de la couche de données addLayer(m, name='data', dbname='historic'+date,table='(select way from planet_osm_line) as roads',symbolizer=mapnik.LineSymbolizer(mapnik.Color('rgb(0,0,0)'),2)) # Ajout de la couche pour la limite de zone boundary = addLayer(m, name='boundary', dbname='relAuvergne',table='(select way from planet_osm_polygon) as roads',symbolizer=mapnik.LineSymbolizer(mapnik.Color('rgb(200,0,0)'),5)) # zoom et rendu m.zoom_to_box(boundary.envelope()) mapnik.render_to_file(m,'historic'+date+'.png', 'png') if __name__ == "__main__": drawMap('080102') drawMap('090319')
Piste pour la production d'une animation sur Party_render.