CC de la Presqu'île de Crozon
Communauté de Communes de la Presqu'île de Crozon
En mai 2010, la communauté de communes offre un shapefile contenant son réseau routier au projet OSM.
Licence et paternité
Origine de la donnée : la digitalisation sur fond cadastral a été sous-traitée par la CC. Chaque commune a vérifié son territoire. Accord du Président de la CC pour versement dans OSM sous les termes de la licence OSM (CC BY-SA / ODbL).
Accord écrit : http://lists.openstreetmap.org/pipermail/talk-fr/2010-May/022075.html
Etude des données
$ ogrinfo -so -al Voies_CCPC.shp INFO: Open of `Voies_CCPC.shp' using driver `ESRI Shapefile' successful. Layer name: Voies_CCPC Geometry: Line String Feature Count: 3396 Extent: (-4.622452, 48.170647) - (-4.245651, 48.340269) Layer SRS WKT: GEOGCS["GCS_WGS_1984", DATUM["WGS_1984", SPHEROID["WGS_1984",6378137.0,298.257223563]], PRIMEM["Greenwich",0.0], UNIT["Degree",0.0174532925199433]] CODE_INSEE: String (5.0) CODRU: String (4.0) NSEGM: String (3.0) LIBRU: String (200.0) TYPRU: String (30.0) NDEBG: String (5.0) NDEBD: String (5.0) NFING: String (5.0) NFIND: String (5.0) LEVEL: String (2.0) URBA: String (3.0) SHAPE_LENG: Real (19.11) CLASS_ADMI: String (50.0) DEPCOG: String (5.0) DEPCOD: String (5.0) NOM_COMM: String (50.0)
Attributs conservés lors de l'import, et correspondance avec tags OSM :
- LIBRU -> tag name si différent de NULL
- CLASS_ADMI -> tag highway selon la correspondance :
- Autre -> highway=road
- Voie privée -> highway=unclassified + access="private"
- Chemin rural -> highway=track
- Communale && URBA -> highway=residential
- Communale && !URBA -> highway=unclassified
- Intercommunale -> highway=tertiary
- Départementale -> highway=secondary
Processus
Sur le modèle de BMO :
Téléchargement des voies les plus récentes sur la zone concernée :
wget http://www.informationfreeway.org/api/0.6/way[highway=*][bbox=-4.622452,48.170647,-4.245651, 48.340269] -O osm_ways.osm
Création d'une base postgres/postgis :
sudo su postgres createdb -E UTF-8 osm createlang plpgsql osm psql -d osm -f /usr/share/postgresql/8.4/contrib/postgis-1.5/postgis.sql psql -d osm -f /usr/share/postgresql/8.4/contrib/postgis-1.5/spatial_ref_sys.sql
Import des données OSM dans la base :
osm2pgsql -d osm -l osm_ways.osm
Import des données de la Communauté de communes dans la base :
shp2pgsql -I -s 4326 -g geom Voies_CCPC.shp voies_ccpc > voies_ccpc.sql psql -d osm -f voies_ccpc.sql
Création d'une table contenant la géométrie des voies OSM "bufferisées"
CREATE TABLE osm_ways_buffered ( id integer NOT NULL, CONSTRAINT osm_ways_buffered_pkey PRIMARY KEY (id) ) WITH (OIDS=FALSE); SELECT AddGeometryColumn('','osm_ways_buffered','buffer','4326','GEOMETRY',2);
Calcul du buffer :
INSERT INTO osm_ways_buffered(id, buffer) SELECT c.osm_id, buffer(c.way,0.00018) FROM planet_osm_line AS c;
Creation d'une table pour stocker le ratio entre la longueur des voies dans le buffer et la longueur totale de chaque voie :
CREATE TABLE ways_ratio ( gid integer NOT NULL, ratio float, CONSTRAINT ways_ratio_pkey PRIMARY KEY (gid) ) WITH (OIDS=FALSE);
Calcul du ratio :
INSERT INTO ways_ratio (gid, ratio) (SELECT DISTINCT v.gid, MAX(ST_LENGTH(ST_Intersection(b.buffer, v.geom)) *100 / ST_LENGTH(v.geom)) FROM osm_ways_buffered AS b INNER JOIN voies_ccpc AS v ON (b.buffer && v.geom AND ST_intersects(b.buffer, v.geom) = true) WHERE v.geom IS NOT NULL GROUP BY v.gid);
Export en shapefile des données à importer :
pgsql2shp -f /tmp/to_import.shp -g geom osm "SELECT v.gid, v.libru, v.class_admi, v.urba, v.geom FROM voies_ccpc v LEFT JOIN ways_ratio r ON v.gid=r.gid WHERE r.ratio < 50 OR (r.ratio between 50 and 85 AND st_length(v.geom) < 3*0.00018) UNION SELECT v.gid, v.libru, v.class_admi, v.urba, v.geom FROM voies_ccpc v WHERE NOT EXISTS(SELECT 1 FROM ways_ratio WHERE ways_ratio.gid=v.gid) "
Conversion au format OSM et Import
Téléchargement de la dernière version de ogr2osm :
svn co http://svn.openstreetmap.org/applications/utils/import/ogr2osm/
Fichier de correspondance entre champs du shapefile et tags (translations/ccpc.py) -- attention: conserver les tabulations, et respecter l'indentation :
def translateAttributes(attrs): if not attrs: return tags = {} tags.update({'FIXME':'Reconnecter aux voies existantes, verifier les doublons et supprimer ce tag ensuite'.decode('utf-8')}) tags.update({'source':"Communauté de Communes de la PresquIle de Crozon, mai 2010".decode('utf-8')}) if attrs['LIBRU'] != '': tags.update({'name':attrs['LIBRU'].decode('utf-8')}) if attrs['CLASS_ADMI'] == 'Autre': tags.update({'highway':'road'}) elif attrs['CLASS_ADMI'] == 'Voie privée': tags.update({'highway':'unclassified'}) tags.update({'access':'private'}) elif attrs['CLASS_ADMI'] == 'Chemin rural': tags.update({'highway':'track'}) elif attrs['CLASS_ADMI'] == 'Intercommunale': tags.update({'highway':'tertiary'}) elif attrs['CLASS_ADMI'] == 'Départementale': tags.update({'highway':'secondary'}) elif attrs['CLASS_ADMI'] == 'Communale': if 'URBA' in attrs: if attrs['URBA'] == 'Oui': tags.update({'highway':'residential'}) elif attrs['URBA'] == 'Non': tags.update({'highway':'unclassified'}) else: tags.update({'highway':'unclassified'}) return tags
Conversion shapefile en fichier OSM :
python ogr2osm.py -e 4326 -t ccpc ../data/to_import.shp
Le fichier to_import.osm généré n'est pas très volumineux (2.3Mo pour 19948 objets) : l'import est réalisé avec JOSM.
Le changeset résultant est le 4849069
Corrections Post-Import
Une couche WMS sur le serveur de BMO a été mise en place pour faciliter les corrections manuelles et le report d'attributs, en utilisant JOSM et le plugin WMS.
L'url à utiliser pour référencer cette couche, est la suivante : http://bmo.openstreetmap.fr/wms?LAYERS=voies_ccpc&FORMAT=image/png&SERVICE=WMS&VERSION=1.1.1&styles=&REQUEST=GetMap&transparent=true&
Pour repérer les zones nécessitant correction, il est possible d'utiliser l'interface en ligne à l'adresse http://bmo.openstreetmap.fr/. Le lien "Editer cette zone dans JOSM" en bas à gauche permet, si le plugin Remote Control de JOSM est installé, de charger directement la zone en vue dans JOSM.