FR:OSM History Renderer/Utilisation fullhistory

From OpenStreetMap Wiki
Jump to navigation Jump to search

Memento pour l'utilisation statistique d'une base de données postgresql avec les données history d'openstreetmap

Merci à Ab_fab [[1]]

Installation

Il suffit de suivre les indications fournies par MaZderMind dans ce tutoriel : [2]

Installer les composants nécessaires de la rubrique "getting and building the tools"

Créer la base postgresql comme indiqué dans la rubrique "creating the database"

Import des données

Pour télécharger les extracts history, voir ce lien : History_Planet

Je ne désire "travailler" que sur la France : il faut "splitter" ce fichier avec osm-history-splitter

L'import se fait en utilisant osm-history-importer :

osm-history-importer -l france-osh.pbf

l'option -l pour ne pas faire de transformation de géometrie

Probleme de mémoire

Les fichiers pbf de moins de 300M ne posent aucun problème avec 16G de ram

performence/issue du programme

utilisation du paramètre nodestore

osm-history-importer --nodestore sparse france-osh.pbf

sept 2014 : 180G d'espace disque utilisés par la base postgresql. 11G de ram utilisés pendant l'import + 2.5G de fichier swap. 24H d'import, 383 millions de nodes, 22.8 millions de lines, 71 millions de polygones

le log de postgresql est rempli de message : consider increasing the configuration parameter "checkpoint_segments"

utiliser des fichiers plus petit

osm-history-splitter

osm-history-splitter [[3]] permet de générer en une fois plusieurs fichiers par région plus petite

le nom du fichier history doit obligatoirement avoir le mot "osh" dans son extension (myfile.osh.pbf par exemple) : c'est une limitation due à osmium

L'extraction de la France métropolitaine à partir du fichier history mondial dure à peu près 4h

filtrage des données

Si on ne désire pas découper en région, on peut utiliser osmconvert et osmfilter pour filtrer avec le critère voulu

Convertion du fichier history pour être utilisable par osmfilter (osmfilter ne gère pas les pbf)

osmconvert france.osh.pbf --out-osh -out-o5m>france.osh.o5m

Filtrer les données voulues

osmfilter france.osh.o5m --out-osh --keep="highway=" --drop-relations > france-way.osm

Temps de traitement

Fichier filtré des bâtiments par région en France : ~ 20 mn pour l'import et l'analyse sql du nombre de bâtiments

Fichier france.osh.pbf : 24h, ~ 30mn pour l'analyse sql du nombre de bâtiments ou du kilométrage de voirie

Structure des tables de la base postgres

Par défaut, la projection utilisée est 90093. l'import génère 3 tables : hist_line, hist_point, hist_polygon. Ci après les principales colonnes des tables

id id de l'objet osm
version version osm de l'objet
visible attribut visible d'osm. false = effacé (le champ tags est vide)
minor Pour les way : un way dont un node est modifié, n'est pas modifié en tant que way mais sa géométrie a changée. Le programme gère ces changements en attribuant un numéro de version minor.
valid_from timestamp de début de la version/minor de l'objet
valid_to timestamp de fin de la version/minor de l'objet
tags champs contenant tous les tags de l'objet

Analyses

comptabilisation du nombre voie et de km, par type de voie et par an

La base utilisée est hist_line. La projection étant en 90093, l'unité de longueur n'est pas le mètre, il est nécessaire de refaire une projection en lambert93.

select
 tt as annee,
 tags->'highway' as typedevoie,
 count(geom),
 round(sum(ST_Length(ST_Transform(geom,2154))) / 1000) as kilometers
from 
 hist_line,
(SELECT date '2007-01-01' + interval '1' year * s.a AS date
 FROM generate_series(0,7,1) AS s(a)) AS Checking (tt)
where
visible AND
 tags ? 'highway' AND
 tags->'highway'
        IN (
          ('motorway'),
          ('motorway_link'),
          ('trunk'),
          ('trunk_link'),
          ('primary'),
          ('primary_link'),
          ('secondary'),
          ('secondary_link'),
          ('tertiary'),
          ('tertiary_link'),
          ('unclassified'),
          ('residential'),
          ('living_street'),
          ('road'),
          ('service'),
          ('track'),
          ('path')
       ) 
 and
 tt::timestamptz BETWEEN valid_from AND COALESCE(valid_to, '9999-12-31')
group by tt, tags->'highway'
order by tt, tags->'highway';
  • date '2007-01-01' est le début de la période
  • On peut modifier la période : "interval '1' year" par '1' month
  • Le nombre de périodes voulues : modifier la valeur xx de generate_series(0,xx,1)

Nombre de bâtiments, par mois, sur 7 ans

Ici la base utilisée est hist_polygon

select
 tt as annee,
 count(geom)
from 
hist_polygon,
(SELECT date '2007-01-01' + interval '1' month * s.a AS date
 FROM generate_series(0,7*12,1) AS s(a)) AS Checking (tt)
where
 visible AND
 tags ? 'building' AND
 tt::timestamptz BETWEEN valid_from AND COALESCE(valid_to, '9999-12-31')
group by tt
order by tt

New import avec

disque plus rapide

1T velociraptor : nécessite de modifier fstab, postgresql.conf (data_directory)

le temps de l'import passe de 24h à 12h (avec 9 mois d'historique en plus)

nouveau poly de la France métropolitaine

le fichier par défaut (geofabrick) incluait les iles anglo-normandes

"split" du fichier history mondial : https://planet.openstreetmap.org/planet/experimental/history-2014-09-29.osm.pbf : 4h

ajout d'un champ à la base avec la geometry en lambert93

la géométrie par défaut était 90093. (le linéraire de la géometrie n'est pas en mètre : merci cquest)

ALTER TABLE hist_polygon ADD COLUMN geom93 geometry(Polygon,2154);
update hist_polygon set geom93=ST_Transform(geom,2154)
ALTER TABLE hist_line ADD COLUMN geom93 geometry(LineString,2154);
update hist_line set geom93=ST_Transform(geom,2154)

To Do

Trouver comment analyser les ways effacés (identifiable avec le champ "visible") car ils n'ont pas de tag

select 
   hist_polygon.id, hist_polygon.tags
from 
   hist_polygon
   inner join (select id from hist_polygon where not visible limit 500) as eff on eff.id=hist_polygon.id
where 
   hist_polygon.visible