|
|||||||||||||||||||||||||
![]() |
|
||||||||||||||||||||||||
|
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 :
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 :
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 :
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
|