Rechercher des adresses dans Open Street Map

Un étudiant suisse m'a demandé de l'orienter dans sa recherche pour trouver des adresses dans Open Street Map.  Il avait chargé avec succès un fichier de données sources de la Suisse dans sa base de données Postgresql mais avait de la difficulté à trouver les adresses.

On ne trouve pas énormément d'adresses dans OSM car c'est une information très coûteuse à colliger, mais il y en a un peu.   Si vous utilisez l'utilitaire d'importation imposm,  pas de chance, les adresses ne sont pas récupérées par défaut.  Je n'ai jamais essayé, mais il faudrait probablement modifier le script python de paramétrage d'importation defaultmapping.py.   Ne vous en faire pas si vous trouvez la chose un peu compliquée à priori!  Ça l'est réellement et demande du temps pour assimiler l'ensemble des technicalités OSM!

Si vous utilisez l'utilitaire osm2pgsql, vous pouvez récupérer des adresses dans les buildings et les amenities, à condition d'avoir activé l'extension Hstore dans votre base de données, sans oublier de spécifier l'option --hstore dans votre ligne de commande osm2pgsql.  Cette option permet de charger dans la base de données tous les tags et pas seulement ceux spécifiés dans le fichier de style.  Comme j''aime avoir accès à TOUTES la base de données OSM, j'utilise toujours l'option --hstore.  J'ai regardé dans quelques villes en Suisse (dont Lausanne) et effectivement plusieurs bâtiments ont des adresses. Une fois les données chargées avec osm2pgsql et --hstore, voici le genre de requêtes SQL possibles

SELECT osm_id, name, building, shop, amenity,
     tags -> 'tourism'::text AS tourism,
     tags->'denomination' as denomination,
     tags->'religion' as religion,
     tags->'cuisine' as cuisine,
     CAST(tags->'addr:housenumber' as text)||' '||CAST(tags->'addr:street' as text) as address,
     tags->'addr:postcode' as postcode,
     tags->'addr:city' as city,
     tags->'building:levels' as building_levels,
     CASE WHEN ST_IsValid(way) = 'f' THEN           
ST_Buffer(ST_MakeValid(way),0) ELSE way END AS geometry
FROM osm_polygon
WHERE building IS NOT NULL;
Et dans la classe des amenities:
SELECT osm_id, name, amenity, '' as building, shop,
     tags -> 'tourism'::text AS tourism,
     tags->'denomination' as denomination,
     tags->'religion' as religion,
     tags->'cuisine' as cuisine,
     CAST(tags->'addr:housenumber' as text)||' '||CAST(tags->'addr:street' as text) as address,
     tags->'addr:postcode' as postcode,
     tags->'addr:city' as city,
     tags->'building:levels' as building_levels
FROM osm_point
WHERE amenity is not null
OR shop is not null ;
L'autre solution serait d'utiliser l'API Nominatim. Je n'ai pas encore fait d'essais sérieux avec ce service, ici au Canada, ce n'est pas fameux parce que le base de données OSM n'est pas assez complète  Pour terminer il y a aussi le projet OSRM qui pourrait aider à trouver une méthode d'extraction d'adresses.

imposm and PostGIS 2.0

I recently load OSM planet in PostGIS 2.0.  It works but you have to created manually your database:
 sudo su postgres
 createdb -E utf8 -O postgres osmplanet
 psql -d osmplanet -c "CREATE EXTENSION postgis;"
 createuser --no-superuser --no-createrole --createdb osm
 psql -d osmplanet -c "ALTER USER osm WITH PASSWORD 'osm';"
 psql -d osmplanet -f /usr/local/lib64/python2.7/site-packages/imposm/900913.sql
 psql -d osmplanet -c "ALTER TABLE geometry_columns OWNER TO osm;”
 psql -d osmplanet -c "ALTER TABLE spatial_ref_sys OWNER TO osm;"
 sudo vim /var/lib/pgsql/data/pg_hba.conf
 -->add this line "host osmplanet osm  127.0.0.1/32 md5"

 sudo virtualenv venv
 source venv/bin/activate
 venv/bin/pip install imposm
I use multiprocessing option with "imposm" in one line command read/write
 sudo imposm -c 8 --overwrite-cache --read --write --database osmplanet planet-latest.osm.bz2
Final database is 66 GB at this moment
postgres@osm:/home/smercier> psql -c "SELECT pg_size_pretty(pg_tablespace_size('pg_default'));" osm
 pg_size_pretty
----------------
 66 GB
(1 row)