Comme je travail en ce moment beaucoup sur les déplacements vélo j’ai voulu réaliser une carte orientée cyclisme, qui mettent en avant les équipements cyclable (” la cyclabilité des voies “) et le relief (même faible). Et comme beaucoup de choses autour de cette question se font actuellement (cf appel d’offre de la région ile de france, arrivé du fond de carte google maps “A vélo”,…), j’ai voulu voir ce qu’on pouvait faire avec des outils open sources, des données ouvertes ou en tout cas auxquelles j’avais accès et un peu de bonne volonté. Le résultat actuel de mes tests est accessible ici.

carte vélo ile de france

Les différents équipements cyclables : piste cyclable, bande cyclable, zone 30, couloir de bus, … sont représentés avec une légende de type carte routière les équipements les mieux adaptés en couleurs + sombre et + large et le relief est rendu grâce à un ombrage. Les choix fait pourrait sans doute être améliorés mais c’est un premier jet.

Je laisse quelques notes techniques sur ce travail de manière à garder une trace et pouvoir m’y retrouver lorsque je réutiliserai ou modifierai ce fond de carte. J’ai utilisé les données OSM et des données de relief de l’IGN (la BD ALTI). J’ai combiné ces deux sources à l’aide de quelques outils, s’articulant autour de TilleMill :

  • imposm : pour importer les données OSM dans une base de données pgsql
  • TileMill : pour créer les tuiles de la carte en appliquant des feuilles de style carto-css
  • gdal : pour créer des images ratser à partir de données d’élévation (pour rendre le relief)

Voici quelques éléments sur la méthode utilisée pour obtenir ce résultat et quelques liens glanés au cours de cette expérimentation.

Prise en main de TileMill

Pour commencer, j’ai créer un projet Tillemill relié à des données open street map en suivant le guide fourni par mapbox. Celui-ci permet de mettre en place un projet TilleMill connecté à une base de données pgsql contenant les données OSM importée (via imposm). Le projet TilleMill contient un ensemble de requêtes sql définissant des calques et un ensemble de feuilles de style carto-css définissant la représentation de chacun de ces calques, c’est à dire comment ceux-ci sont représentés sous forme de lignes, de surfaces ou de points. Le fonctionnement est donc assez intuitif : vous gérer vos calques, leur ordres et leurs représentation grâce à un language de type css dans une interface plutôt ergonomique. Un élément simple peut ainsi être définis en quelques lignes :

#countries {
  polygon-fill: #fff;
  polygon-opacity: 0.75;
}

Créer ses propres calques et les mettre en formes

J’ai ensuite modifié l’importation des données dans la base pgsql pour récupérer les informations sur les équipements cyclables qui m’intéressaient en rajoutant dans le fichier python utilisé par imposm (imposm-mapping.py) une nouvelle table pour les équipements cyclables.

cyclelanes = LineStrings(
    name = 'cyclelanes',
    mapping = { 'cycleway': (
            'lane',    
            'track',    
            'opposite_lane',   
            'opposite_track',  
            'opposite',
            'shared',
            'share_busway',
            'shared_lane',
            'sharrow',
            ),
        },
        fields = (
            ('tunnel', Bool()),
            ('bridge', Bool()),
            ('oneway', Direction()),
            ('ref', String()),
            ('layer', Integer()),
            ('z_order', WayZOrder()),
            ('access', String()),
            ('highway', String()),
        ),
)

Cela m’a permis de rajouter un nouveau calque pour les infos qu’il manquait dans TilleMill à partir des données de cette table. Ce nouveau calque est simplement défini en utilisant une requêtes du type :

( SELECT geometry, type, name, tunnel, bridge, oneway, ref, layer, z_order, access, highway
    FROM osm_cyclelanes
) AS data

J’ai ensuite mis en forme ce calque grâce aux possibilités de TilleMill suivant le niveau de zoom le type d’équipement …, j’ai également modifié le style des routes de bases de manière à rendre la carte un peu plus lisible. A titre d’exemple voici quelques extrait du code carto-css utilisé pour visualiser les équipements cyclables.

#cyclelanes::outline {
  line-width:5;
  line-cap: round;
  line-join: round;
  line-color:@cycle_case4;
  [type='share_busway']{
  line-color:@cycle_case3;
  }
  [type='opposite']{
  line-color:@cycle_case2;
  }
  [type='lane']{
  line-color:@cycle_case1;
  }
      /* -- widths -- */
  [zoom=11] {
    [type='lane'] { line-width: @rdz11_med + 1.6; }
    [type='share_busway']{ line-width: 0.2 + 1.6; }
    [type='opposite']  { line-width: 0.2 + 1.6; }
  }

.....

  [zoom>=18] {
    line-width: @rdz13_min / 3 + 4;
    [type='lane']   { line-width: @rdz18_med + 4; }
    [type='share_busway']{ line-width: @rdz18_min + 4; }
    [type='opposite']   { line-width: @rdz18_min / 2 + 4 ; }
  }
 
 
}
#cyclelanes {
 
  line-cap: round;
  line-join: round;
  line-color:@cycle_fill4;
  [type='lane']{
  line-color:@cycle_fill2;
  }
  [type='share_busway']{
  line-color:@cycle_fill3;
  }
  [type='opposite'],[type='opposite_lane']{
  line-color:@cycle_fill4;
  }
    /* -- widths -- */
  [zoom=11] {
    line-width:0.2;
    [type='lane'] { line-width: @rdz11_med; }
    [type='share_busway']{ line-width: 0.2; }
    [type='opposite']  { line-width: 0.2; }
  }

 ...

  [zoom>=18] {
    line-width: @rdz18_min / 4;
    [type='lane']   { line-width: @rdz18_med; }
    [type='share_busway']{ line-width: @rdz18_min; }
    [type='opposite']   { line-width: @rdz18_min / 2; }
  }
}

Générer un raster pour le relief et l’inclure dans TilleMill

Pour finir j’ai joué avec gdal pour créer des raster rendant le relief. Je me suis inspiré du tutoriel proposé par mapbox en le modifiant pour exagérer le relief. J’ai en particulier modifié l’ombrage des pentes de manières à ce que même les pentes faibles < 10% soient visibles. Celles sont en effet intéressantes pour le cycliste. J'ai pour ce faire re-projeter les données IGN avec gdalwrap et construit un raster d'ombrage avec hillshade :

gdaldem hillshade -co compress=lzw  -z 3 bdalti-iledefrance-3785.tif hillshade-iledefrance-z3-3785.tif

puis calculer la pente avec gdal slope:

gdaldem slope  bdalti-iledefrance-3785.tif slope-iledefrance-3785.tif

afin de produire un autre raster d’ombrage, en utilisant une rampe de valeur personnalisées :

gdaldem color-relief -co compress=lzw slope-iledefrance-3785.tif sloperamp.txt slopeshade-iledefrance-3785.tif

Finalement, j’ai importé ces deux raster dans des nouveaux calques TilleMill et je les ai combinés avec la carte construite à partir des données OSM en utilisant l’opération de combinaison par multiplication offerte par le mode raster de TilleMill (Ces deux calques étant placé en haut de la pile de calques).

#slope-shade,
#hill-shade {
    raster-scaling: bilinear;
    // note: in TileMill 0.9.x and earlier this is called raster-mode
    raster-comp-op: multiply;
}

#hill-shade { raster-opacity: 1; }
#slope-shade { raster-opacity: 0.7; }

J’essayerai de retravailler ce fond de carte dans le futur pour pouvoir l’exploiter mais cette découverte de différents outils de carto numérique était en tout cas fort enrichissante …

Leave a reply