CC de la Presqu'île de Crozon

From OpenStreetMap Wiki
Jump to navigation Jump to search

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.