Accueil
 

Cartogrammes

Entrée 1 Donnée continue
Sortie Dessin

Description :

Enjeu

L'enjeu du cartogramme (ou anamorphose, c'est à dire déformation) est de rendre compte d'un phénomène en déformant les régions d'une carte. Pour y parvenir il est indispensable que les régions de la carte finales demeurent identifiables pour l'utilisateur.

Il faut en particulier conserver les voisinages entre les régions tout en évitant les "aberrations topologiques", On parle d'aberration topologique lorsque deux polygones se chevauchent après déformations.

Principe

Notre cartogramme consiste à rendre la surface des territoires proportionnelle à une donnée numérique (population,...).

La carte finale est donc composée de territoires de densités idéalement égales (densité=donnée/surface). La donnée source doit donc être une donnée absolue (comptage et non pourcentage).

La méthode de déformation

Nous avons choisi l'algorithme de J.A. Dougenik, N.R. Chrisman D.R. Niemeyer, qui procède par itération pour se rapprocher de cette situation idéale. Chaque itération homogénéïse la densité mais déforme un peu plus la carte, la rendant un peu moins reconnaissable.

Le principe de la déformation est de calculer pour chaque point de la carte, une force qui va le déplacer.

La force exercée sur un point est la résultante des forces exercées par chacun des polygones sur le point. Un polygone dont la surface doit augmenter, va repousser les points proches de lui, et s'il doit se réduire il va les attirer. Les calculs intègrent des corrections pour limiter les aberrations topologiques.

Paramètres

Comme cela a été souligné précédemment, le cartogramme doit rendre compte d'un phénomène en déformant une surface tout en conservant suffisamment sa forme pour qu'elle soit lisible.

Si l'on demande un grand nombre d'itérations à notre algorithme, il améliore la précision numérique de la représentation mais risque de diminuer la lisibilité de la carte.

Critères d'arrêt par proportionalité

Initialement, nous avions choisi la régression surface/donnée pour avoir un critère d'arrêt (voir ci-dessous). La droite de régression est une approximation du nuage de points par une fonction affine. Malgré les bons résultats obtenus en général, elle présente 2 inconvénients majeurs pour notre cas :

  • La droite de régression ne passe pas forcément par zéro, or nous voulons une proportionnalité entre surface et donnée, donc une fonction linéaire et non affine.
  • Les objets dont la donnée et la surface sont petites peuvent être à la même distance de la droite que des objets ayant une donnée et un surface importantes. Cependant un même écart de surface n'a pas du tout la même influence sur un petit objet que sur un grand.

1) Proportionnalité

La droite qui passe par le barycentre du nuage et le point zéro est une approximation linéaire du nuage:




L'indice de qualité qui va déterminer si la déformation est suffisante sera le suivant :
  • Soit Di la différence (en valeur absolue) entre l'ordonnée d'un point et sa projection verticale sur la droite. C'est la différence entre la surface réelle de l'objet et la surface désirée.
  • Soit S la surface totale de tous les objets
    Indice de qualité :
  • On peut l'interpréter ainsi : si la différence entre les surface obtenues et les surfaces désirées représente 20% de la surface totale, on a un indice de 0,8. Si la différence est nulle, on a . On peut noter que cet indice se situe dans l'intervalle , mais qu'en général il est positif dès les premières itérations.


2) Prise en compte des valeurs petites et grandes

Pour permettre à l'utilisateur d'évaluer si un objet est proche ou loin de la surface optimale on calcule l'angle entre deux droites :

  • la droite passant par le barycentre et l'origine (voir ci-dessus)
    la droite passant par ce point et l'origine si cet angle (en valeur absolue) est supérieur à alors le polygone est colorié pour permettre une visualisation immédiate des erreurs (en rouge les polygones trop petits, en bleu les polygones trop grands) :



Script :

2      module untyped_list ""
3        mod_type integer "104"
3        mod_subtype integer "614"
3        mod_name string "Cartogramme"
3        mod_dads integer_list ""
4          ? integer "4"
3        delay_sec integer "10"
3        quality_stop double "0.9"
3        dens_stddev double "0.353232"
3        iter_max integer "30"
3        mean_density double "1.010075"
3        out_time boolean "F"
3        iter_stop integer "15"
3        linear untyped_list ""
4          data_count integer "277"
4          unavail_count integer "0"
4          direction_angle double "0.79638"
4          quality double "0.901745"
4          maxabsangle double "0.562871"
4          min_x double "102"
4          min_y double "0.83981"
4          max_x double "132677"
4          max_y double "1024.366616"
4          barycenter vector ""
5            x_val double "0.015067"
5            y_val double "0.015402"
5            z_val double "0"
4          direction vector ""
5            x_val double "0.699299"
5            y_val double "0.714829"
5            z_val double "0"
3        dens_stddev_array double_list ""
4          ? double "0.210394"
4          ? double "0.096969"
4          ? double "0.12711"
4          ? double "0.160331"
4          ? double "0.19479"
4          ? double "0.223402"
4          ? double "0.24115"
4          ? double "0.251201"
4          ? double "0.257794"
4          ? double "0.262609"
4          ? double "0.26792"
4          ? double "0.276626"
4          ? double "0.291394"
4          ? double "0.312106"
4          ? double "0.334248"
4          ? double "0.353232"
3        mean_density_array double_list ""
4          ? double "0.062089"
4          ? double "0.060254"
4          ? double "0.119889"
4          ? double "0.201657"
4          ? double "0.306295"
4          ? double "0.429078"
4          ? double "0.557729"
4          ? double "0.676138"
4          ? double "0.772963"
4          ? double "0.845512"
4          ? double "0.897476"
4          ? double "0.934328"
4          ? double "0.961067"
4          ? double "0.981317"
4          ? double "0.997188"
4          ? double "1.010075"
3        quality_array double_list ""
4          ? double "-0.129567"
4          ? double "0.006505"
4          ? double "0.179559"
4          ? double "0.3599"
4          ? double "0.510344"
4          ? double "0.625029"
4          ? double "0.706838"
4          ? double "0.765967"
4          ? double "0.806836"
4          ? double "0.835379"
4          ? double "0.855565"
4          ? double "0.870247"
4          ? double "0.881329"
4          ? double "0.889825"
4          ? double "0.896455"
4          ? double "0.901745"

Exemple d'utilisation