Un petit post pour partager ma présentation au meetup open transport du 18 Septembre.

meetup

Et également pour faire de la pub pour la journée Data Analytics and Visualization in Transport que nous organisons le 10 Octobre prochain à Marne-la-vallée. Le programme complet est disponible par .

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 …

We finally (me and Pierre Latouche) released our preprint on graph clustering with stochastic block model when the number of cluster is unknown. In our proposal this is solved thank to a model selection approach based on the integrated complete data log likelihood. Algorithmic issues to perform clustering and model selection at the same time are also discussed. It his availbale at arXiv or here and the abstract follow:

The stochastic block model (SBM) is a mixture model used for the clustering of nodes in networks. It has now been employed for more than a decade to analyze very different types of networks in many scientific fields such as Biology and social sciences. Because of conditional dependency, there is no analytical expression for the posterior distribution over the latent variables, given the data and model parameters. Therefore, approximation strategies, based on variational techniques or sampling, have been proposed for clustering. Moreover, two SBM model selection criteria exist for the estimation of the number K of clusters in networks but, again, both of them rely on some approximations. In this paper, we show how an analytical expression can be derived for the integrated complete data log likelihood. We then propose an inference algorithm to maximize this exact quantity. This strategy enables the clustering of nodes as well as the estimation of the number clusters to be performed at the same time and no model selection criterion has to be computed for various values of K. The algorithm we propose has a better computational cost than existing inference techniques for SBM and can be employed to analyze large networks with ten thousand nodes. Using toy and true data sets, we compare our work with other approaches.

blogbd

Adjacency matrix of a blogs network, the rows/columns are sorted by cluster number
with clusters found by the greedy ICL algorithm. The cluster boundaries are depicted with white
lines.

Welcome to my new blog.

I intend to speak a little bit of my research and provide some tutorial oriented content in this new version.

I hope to publish on a weekly basis.

I will write in English for the moment in order to practice, but will certainly also write posts in french.

So, have a good read …

Etienne