User:NicolasDumoulin/Historique

From OpenStreetMap Wiki
Jump to navigation Jump to search

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.