Comment créer des contours éclairés de Tanaka avec QGis

Les contours de Tanaka sont une méthode d’affichage du terrain développée par le professeur Tanaka Kitiro en 1950. Tanaka a appelé sa technique la « méthode de Contours en relief », mais elle est généralement appelée la « méthode de contours éclairés » ou la « méthode Tanaka ».

Cette méthode applique une source lumineuse située au nord-ouest, à une carte de contours. Le résultat est une représentation de style 3D du terrain. La méthode implique de modifier la largeur et la couleur des lignes de contour basées sur leur position par rapport à la source lumineuse : Les lignes de contour qui font face à la source de lumière sont dessinés en blanc tandis que celles qui se trouvent dans l’ombre sont tracées en noir; les lignes perpendiculaires à la source lumineuse sont dessinées plus fines que les parallèles. En résumé, cette méthode donne un effet d’ombre réaliste aux cartes de terrain et permet à l’observateur de mieux comprendre les caractéristiques du paysage.

Nous allons partir d’une couche de polylignes contenant des isobathes et/ou des courbes de niveau. Si vous n’en disposez pas, vous pouvez partir d’un MNT en créant une couche de contours. Étant donné la suite du traitement, pensez à généraliser les contours. Dans le cas contraire il vous faudra beaucoup de patience…

Pour obtenir les contours de Tanaka nous allons tout d’abord décomposer les polylignes en segments élémentaires n’ayant que deux points. Pour chaque segment nous allons calculer l’angle d’exposition à la source de lumière. En fonction de cet angle nous allons affecter à chaque tronçon une couleur et une épaisseur: les tronçons exposés complètement à la source, placée arbitrairement au Nord Ouest, seront blancs et les plus épais, les tronçons perpendiculaires seront les plus fins et les tronçons tournés à l’opposé de la source de lumière seront complètement noirs.

Pour décomposer les polylignes, nous utiliserons la commande Grass  v.split.vert qui découpe les polylignes à chaque nœud.

ta2Configurez le nombre maximum de vertex par segment à 2.

Vous aurez une nouvelle couche, à première vue identique à la précédente sauf que tous les tronçons sont indépendants.

Nous avons besoin de connaître l’orientation de chaque tronçon par rapport au coin Nord Ouest de la vue. Nous allons ajouter un champ azimuth dans lequel nous allons calculer cet angle.

Ouvrez la table attributaire et la calculatrice de champs.

Rentrez le nom et définition du nouveau champ, puis cliquez sur l’onglet « Éditeur de fonction« .

ta3

Rentrez la fonction de calcul de l’azimut:

def Fazimuth(geometry, feature, parent):
    p1=geometry.asPolyline()[0]
    p2=geometry.asPolyline()[-1]
    a=p1.azimuth(p2)
    if a < 0:
        a += 360
    return a

et cliquez sur charger. Si vous n’avez pas fait d’erreur d’indentation ou de syntaxe, vous n’aurez pas de message d’erreur et vous pourrez revenir sur l’onglet Expression:

ta4Rentrez la fonction de calcul:

Fazimuth($geometry)

et vous aurez le calcul qui se réalise.

Mise en forme du style

Nous disposons maintenant de tout ce qu’il faut pour mettre en place le style Tanaka: des tronçons élémentaires et l’azimut de chaque tronçon.

Nous allons mettre en place une expression pour affecter un dégradé de couleur aux tronçons, puis une autre pour mettre en place un dégradé d’épaisseurs.

Pour le dégradé de couleurs, nous allons créer une expression qui affectera aux tronçons les plus exposés à la lumière une couleur blanche et une luminosité de 100, et, aux moins exposés une couleur noire et une luminosité de 0.

Ouvrez la fenêtre de propriétés de la couche->style.

Cliquez sur Ligne simple, puis ouvrez le menu de définition de la couleur et sélectionnez Éditer.

tan3Dans l’onglet Expression rentrez l’expression suivante:

set_color_part(
‘black’,
‘lightness’,
scale_linear( abs(
(CASE WHEN « azimuth »-45 < 0
THEN « azimuth »-45+360
ELSE « azimuth »-45 END) -180),
0,180,
0,100))

tan4Cliquez sur OK.

La deuxième expression contrôlera l’épaisseur des lignes, affectant une épaisseur de 1mm aux tronçons en travers de la lumière et une épaisseur de 0.2mm aux tronçons perpendiculaires à celle-ci.

Ouvrez le menu de définition de l’épaisseur de trait et sélectionnez Éditer:

tan5Dans la fenêtre Expression rentrez l’expression suivante:

scale_linear( abs( abs(
(CASE WHEN « azimuth »-45 < 0
THEN « azimuth »-45+360
ELSE « azimuth »-45 END) -180) -90),
0,90,
0.2,1)

tan6Cliquez sur OK et fermez les propriétés de la couche.

Voilà!

Vous devez retrouver les contours de Tanaka dans votre fenêtre cartographique:

tan7

2 pensées sur “Comment créer des contours éclairés de Tanaka avec QGis”

  1. Bonjour, super article et votre méthode fonctionne parfaitement.

    Par contre, j’ai l’impression qu’elle est adaptée à de la bathymétrie, c’est-à-dire que les valeurs d’altitude élevées sont considérées comme des « creux ».

    Comment modifier les expressions pour avoir l’effet inverse ? C’est-à-dire faire ressortir les altitudes élevées ?

    1. Merci beaucoup.
      Dans l’exemple il s’agit bien d’isobathes, mais inversées (les valeurs de profondeur sont toutes positives). A aucun moment la valeur de la courbe de niveau intervient dans sa mise en forme. Tout ce qui est utilisé est l’orientation du segment par rapport à la source lumineuse.Par orientation il faut bien entendre l’angle entre le tronçon et la source lumineuse et si cette source se situe à gauche ou à droite du tronçon. On considère que les polygones sont dessinés dans le sens des aiguilles d’une montre: un tronçon à 45°, c’est à dire complètement exposé à la source lumineuse, sera complètement blanc s’il va du point bas gauche au point haut droit, et complètement noir s’il a un sens inverse.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *