Tutoriel


Cartographier des vols en temps réel (Avancé)

Cartographier des vols en temps réel (Avancé)



Julien Godenir

...

1. Les données

Le mieux serait de lire en prérequis la version débutant de ce tutoriel pour apprendre quels sont les champs nécessaires et suffisants pour construire une telle viz. Vous avez un vol à attraper? Voici un court résumé:

  • 2 champs de dates, dans cet exemple [Departure_Datetime] et [Arrival_Datetime]
  • 2 points géocodés par latitude et longitude, ici: [Departure_Lat], [Departure_Lon], [Arrival_Lat], [Arrival_Lon]

2. Votre icône

Vous avez donc besoin désormais d'une image d'un avion (ou bien d'un train, ou bien d'une voiture) ! J'ai choisi l'icône simple ✈ ci-dessous. Vous pouvez choisir tout autre image, mais faites attention à ce que le nez de l'avion soit orienté à droite ! Nommez le plane.png.

a plane image

3. Générons 36 images d'un coup avec Python!

Ensuite, vous aurez envie de faire voler votre petit avion dans toutes les directions, partout sur la planète! Ainsi, vous aurez besoin de générer 36 images de l'avion, chacune tournée de 10°. Mais ce travail est fastidieux et je suis un peu fainéant alors j'utilise une pincée de code pour faire ça rapidement ! Connaissez-vous Python? C'est un des langages de programmation les plus simples que je connaisse. Il est d'ailleurs implémenté depuis peu dans Alteryx et dans Tableau. Si vous en avez le temps, vous en tirerez certainement de grands bénéfices à l'apprendre!

Téléchargez simplement Python 2.7 et ouvrez une interface de ligne de commande Windows + R sur Windows puis 'cmd' entrer.

Rentrez la commande suivante très précisément:

pip install pil

Cette commande devrait installer une librairie python pour le processing d'images. Ensuite créez un nouveau fichier avec une extension .py. Ouvez-le avec votre notepad par exemple et copiez-collez le code suivant:

from PIL import Image

src_im = Image.open('plane.png')
im = src_im.convert('RGBA')
for i in range(36):
    rot = im.rotate(i*10)
    rot.save(str(i*10).zfill(3) + 'plane.png')

Vous voyez? J'ai déjà écrit tout le code pour vous, il ne vous reste plus qu'à sauvegarder ce nouveau fichier python et c'est tout! Il ne reste plus qu'à l'exécuter!

Si vous souhaitez exécuter ce code, ouvrez tout simplement votre interface en ligne de commande et lancez:

python yourscript.py

Ca devrait créer automatiquement pour vous 36 images de votre avion à chaque fois tournées de 10°!!! Et voilà! Ce n'était pas si difficile de coder un petit peu, pas vrai? Maintenant, copiez simplement vos formes dans un nouveau dossier dans votre répertoire Tableau de formes.

4. Préparez vous pour du geocodage

Des lignes sur une carte dans Tableau, c'est pas mal mais ça ne permet pas de représenter la courbature de la Terre, donc nous devons l'approximer. Il y a tout ce dont vous avez besoin de savoir au sujet des bearings, geo-coordinates et angles sur ce site web. Vous pouvez également lire cette page Wikipedia.

Pour commencer, nous devons calculer nos latitudes et longitudes pour les départs et arrivées en radians plutôt qu'en degrés, car nous allons utiliser intensivement les fonctions SIN() et COS() qui ne fonctionnent qu'en radians. Ce sont les champs que vous verrez plus tard dans les formules en tant que Dep Lat Rad, Dep Lat Long, Arr Lat Rad et Arr Lat Long.

Ensuite, nous allons devoir créer les champs calculés suivants afin d'obtenir les trajectoires courbes:

h = sin²(Δφ/2) + cos φ <sub>1</sub> ⋅ cos φ <sub>2</sub> ⋅ sin²(Δλ/2)
δ = d/R = 2 ⋅ atan2( √h, √(1− h) )
A = sin((1−f)⋅δ) / sin δ
B = sin(f⋅δ) / sin δ
x = A ⋅ cos φ <sub>1</sub> ⋅ cos λ <sub>1</sub> + B ⋅ cos φ <sub>2</sub> ⋅ cos λ <sub>2</sub>
y = A ⋅ cos φ <sub>1</sub> ⋅ sin λ <sub>1</sub> + B ⋅ cos φ <sub>2</sub> ⋅ sin λ <sub>2</sub>
z = A ⋅ sin φ <sub>1</sub> + B ⋅ sin φ <sub>2</sub>
φ <sub>i</sub> = atan2(z, √x² + y²)
λ <sub>i</sub> = atan2(y, x)

Ca peut être un peu intimidant affiché ainsi, mais ne vous inquiétez pas, j'ai découpé le travail par petites étapes en prenant des captures d'écran de mes champs calculés dans la section suivante.

5. Du Tableau dans vos données

a. Calculez le taux d'avancement du vol basé sur vos dates de départ et d'arrivées:

MAX(
  MIN(
    DATEDIFF('minute', NOW(), [Departure Datetime])
    /
    DATEDIFF('minute', [Arrival Datetime], [Departure Datetime]),
    1
  ),
  0
)

Formula

b. Calculez la formule haversine avec vos latitudes et longitudes pour le départ et l'arrivée (en radians avec la fonction RADIANS()):

SIN([Arr Lat Rad] - [Dep Lat Rad]) ^2 +
COS([Dep Lat Rad]) * COS([Arr Lat Rad]) * SIN([Arr Lon Rad] - [Dep Lon Rad]) ^2

Formula

c. Calculez la distance angulaire entre le point de départ et le point d'arrivée:

2 * ATAN2(SQRT([haversine(d/r)]), SQRT(1 - [haversine(d/r)]))

Formula

d. Ici vous devez recalculer les coefficients de la formule:

SIN((1-[Percent Flight]) * [angular Distance]) / SIN([angular Distance])

Formula

SIN([Percent Flight] * [angular Distance]) / SIN([angular Distance])

Formula

[A] * COS([Dep Lat Rad]) * COS([Dep Lon Rad]) +
[B] * COS([Arr Lat Rad]) * COS([Arr Lon Rad])

Formula

[A] * COS([Dep Lat Rad]) * SIN([Dep Lon Rad]) +
[B] * COS([Arr Lat Rad]) * SIN([Arr Lon Rad])

Formula

[A] * SIN([Dep Lat Rad]) + [B] * SIN([Arr Lat Rad])

Formula

e. C'est presque bon! Vous pouvez désormais calculer les coordonnées geographiques estimées de l'appareil de la manière suivante:

ATAN2([z], SQRT([x]^2 + [y]^2))

ATTENTION, le résultat est en radians donc n'oubliez pas d'utiliser DEGREES() pour obtenir un résultat que Tableau peut comprendre.

Formula

ATAN2([y], [x])

Formula

f. Et vous calculez son orientation de la manière suivante:

DEGREES(
  ATAN2(
    SIN([Arr Lon Rad] - [aircraft lon rad]) * COS([Arr Lat Rad]),
    COS([aircraft lat rad]) * SIN([Arr Lat Rad]) -
    SIN([aircraft lat rad]) * COS([Arr Lat Rad]) * COS([Arr Lon Rad] - [aircraft lon rad])
  )
)

aircraft

RIGHT(
  "00" +
  REPLACE(
    STR(
      FLOOR(
        (
          IIF(
            [aircraft orientation] < 0,
            [aircraft orientation] + 360,
            [aircraft orientation]
          ) + 5
        ) / 10
      ) * 10
    ),
    '360',
    '0'
  ),
  3
)

approx.

6. Formez vos vols!

Si vous avez suffisemment d'avions affichés, ils devraient statistiquement afficher toutes les orientations entre 000 et 350. Ainsi, vous pouvez assigner les nouvelles formes au champ approx. aircraft orientation. Les formes devraient automatiquement être perfectement allignées à chaque avions puisque Tableau les assigne par ordre Alphabetique par défaut.

Vous devez maintenant glisser-déposer vos deux derniers champs aircraft lat vers les lignes et aircraft lon vers les colonnes.

Your

Pour terminer, si votre viz montre des données en temps réél, utilisez un filtre pour n'afficher que les appareils en vol actuellement.

Et voilà ! Une viz Tableau inspirée par Flightradar24! Si vous le souhaitez, vous pouvez essayer de pousser cette approche plus loin en appliquant des traînées derrière les avions!