Forum Flightgear France

Une communauté prend son envol

Vous n'êtes pas identifié(e).

Annonce

Futur nouvel inscrit, tu dois au préalable lire l'intégralité des 10 articles des règles, s'il te plaît. Tout nouveau compte qui ne respecte pas les règles sera supprimé par l'administration.

#1 6/04/2021 16:54:48

fdz
Membre
Lieu : Newbie
Inscription : 12/02/2021
Messages : 118
Site Web

Créer un parcours pour vol aux instruments

Bonjour,
débutant, j'ai longtemps cherché un moyen relativement simple pour créer un parcours en France, sans installer de logiciel complexe.
J'ai trouvé une méthode qui me convient et donc je la partage smile

Exemple de parcours entre Clermont et Toulouse:
gpsvisualizer_gpx_csv_on_map.jpg

Pour cela j'utilise un fichier GPX (clic-droit, enregistrer sous AIXM_X_IFR_FR.gpx) et le site web https://www.gpsvisualizer.com/ (clic-roulette souris pour ouvrir dans un nouvel onglet)

Dans un premier temps, aller sur https://www.gpsvisualizer.com/ et uploader le fichier GPX
La carte ci-dessus s'affiche (sans le tracé).
Symboles:
Rond vert: VOR-DME
Rond bleu: VOR
Rond gris: NDB
Triangle vert: point de report
Epingle rouge: présence d'un ILS sur l'aérodrôme

Notez la présence de l'outil Règle en bas à gauche pour calculer la distance entre 2 ou plusieurs points (clic-gauche pour ajouter un repère, clic-droit sur un repère pour le supprimer)
Survoler les points pour afficher leur nom.
Repérez les points de votre futur parcours.
Créer un nouveau fichier texte, nommer le: monparcours.gpx (par exemple)
Ouvrir le fichier AIXM_X_IFR_FR.gpx avec un éditeur de texte
Pour chaque point de votre parcours, rechercher la ligne correspondant au point dans le fichier AIXM_X_IFR_FR.gpx
Copier la ligne et coller la dans le fichier monparcours.gpx

Exemple de contenu du  fichier monparcours.gpx:
Attention, les deux premières lignes et la dernière sont obligatoires dans un fichier GPX.

<?xml version="1.0" encoding="UTF-8"?>
<gpx version="1.0" creator="notepad" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gpx="http://www.topografix.com/GPX/1/0" xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
<wpt lat="45.7859722222222" lon="3.16245"><name>CLERMONT FERRAND AUVERGNE [LFLC] 1092ft</name><ele>330</ele><sym>Airport</sym></wpt>
<wpt lat="45.7874722222222" lon="3.19219444444444"><name>CFA 114.35</name><ele>330</ele><sym>Navaid, Green</sym></wpt>
<wpt lat="45.4042777777778" lon="3.18238888888889"><name>VELIR</name><sym>Triangle, Green</sym></wpt>
<wpt lat="45.2763888888889" lon="3.17916666666667"><name>UXANA</name><sym>Triangle, Green</sym></wpt>
<wpt lat="45.1043611111111" lon="3.17480555555556"><name>MINPA</name><sym>Triangle, Green</sym></wpt>
<wpt lat="44.9570555555556" lon="3.16697222222222"><name>MOKDI</name><sym>Triangle, Green</sym></wpt>
<wpt lat="44.6083472222222" lon="3.16242777777778"><name>MEN 115.3</name><ele>1366</ele><sym>Navaid, Green</sym></wpt>
<wpt lat="44.5391666666667" lon="3.01666666666667"><name>REMDU</name><sym>Triangle, Green</sym></wpt>
<wpt lat="44.4836666666667" lon="2.90258333333333"><name>DITEV</name><sym>Triangle, Green</sym></wpt>
<wpt lat="44.4488888888889" lon="2.83333333333333"><name>ESPAL</name><sym>Triangle, Green</sym></wpt>
<wpt lat="44.3318472222222" lon="2.607175"><name>ROM 302</name><ele>639</ele><sym>Navaid, Black</sym></wpt>
<wpt lat="44.2097222222222" lon="2.33972222222222"><name>MAKIL</name><sym>Triangle, Green</sym></wpt>
<wpt lat="44.1233333333333" lon="2.16444444444444"><name>DEPES</name><sym>Triangle, Green</sym></wpt>
<wpt lat="43.9540444444445" lon="1.824175"><name>GAI 115.8</name><ele>296</ele><sym>Navaid, Blue</sym></wpt>
<wpt lat="43.6808333333333" lon="1.3098"><name>TOU 117.7</name><ele>173</ele><sym>Navaid, Green</sym></wpt>
</gpx>

Enregistrer le fichier monparcours.gpx
Aller sur  https://www.gpsvisualizer.com/
Dans le bandeau haut, cliquer sur CONVERT A FILE
Il s'agit ici de convertir le fichier GPX en CSV afin d'y ajouter quelques renseignements précieux comme par exemple l'altitude des points à partir de  modèles numériques de terrain (DEM).
gpsvisualizer_conv1_gpx_csv.jpg
1. sélectionner le format de sortie Plain Text
2. sélectionner le fichier monparcours.gpx
3. Cliquer sur CONVERT

Vous aurez alors un aperçu du fichier CSV final et la possibilité de le télécharger.
Télécharger le fichier CSV ainsi obtenu.
Nommer le: monparcours.csv
Il est nécessaire de faire une seconde conversion sur le fichier CSV obtenu avec les paramètres suivants:
gpsvisualizer_conv2_csv_csv.jpg
- Force text data to be this type: Trackpoints
- plain text delimiter: comma (virgule)
- output units: nautical
- Add estimated fields: heading
- Add estimated fields: distance
- (optionnel) Add DEM elevation data: ODP1

Le fichier CSV peut être ouvert et modifié avec un éditeur de texte.
Exemple après une double conversion du CSV, ajout de l'entête "desc", modif du name de LFLC, ajout du commentaire CLERMONT et d'un commentaire sur MEN 155.3 :

type,latitude,longitude,altitude (ft),course,distance (nmi),distance_interval (ft),sym,name,desc
T,45.785972222,3.162450000,1074.6,,0.000,,Airport,LFLC,CLERMONT FERRAND AUVERGNE - 1092ft
T,45.787472222,3.192194444,1050.2,85.9,1.252,7608.07,"Navaid, Green",CFA 114.35
T,45.404277778,3.182388889,2097.4,181.0,24.252,139752.02,"Triangle, Green",VELIR
T,45.276388889,3.179166667,2106.3,181.0,31.928,46639.15,"Triangle, Green",UXANA
T,45.104361111,3.174805556,3344.8,181.0,42.253,62734.46,"Triangle, Green",MINPA
T,44.957055556,3.166972222,2656.2,182.2,51.099,53746.89,"Triangle, Green",MOKDI
T,44.608347222,3.162427778,4533.1,180.5,72.023,127141.62,"Navaid, Green",MEN 115.3,Tourner à droite vers CAP 235
T,44.539166667,3.016666667,3566.3,236.4,79.527,45595.63,"Triangle, Green",REMDU
T,44.483666667,2.902583333,2275.9,235.7,85.450,35988.06,"Triangle, Green",DITEV
T,44.448888889,2.833333333,1866.8,234.9,89.085,22082.13,"Triangle, Green",ESPAL
T,44.331847222,2.607175000,2065.2,234.2,101.084,72910.33,"Navaid, Black",ROM 302
T,44.209722222,2.339722222,1374.7,237.6,114.745,83007.51,"Triangle, Green",MAKIL
T,44.123333333,2.164444444,1102.4,235.6,123.919,55742.93,"Triangle, Green",DEPES
T,43.954044444,1.824175000,965.9,235.4,141.809,108698.84,"Navaid, Blue",GAI 115.8
T,43.680833333,1.309800000,541.3,233.8,169.521,168380.16,"Navaid, Green",TOU 117.7

(*) distance_interval (ft) * 0.3028 / 1852 = distance (en NM) entre le point et le point précédent

Aperçu du fichier monparcours.csv sur gpsvisualizer:
gpsvisualizer_csv_on_map.jpg

Pour obtenir ce rendu,
Aller sur  https://www.gpsvisualizer.com/
Dans le bandeau haut, cliquer sur MAKE A MAP
gpsvisualizer_csv_to_map.jpg
Sélectionner les paramètres ci-dessus et cliquer sur Draw the map

- Le paramètre Colorize by: Distance permet d'obtenir la distance entre les points (dans les info-bulles), utile si non présente dans le CSV
- Le paramètre Track list: Names and descriptions permet d'afficher la case à cocher Tracks (utile pour masquer ou passer le calque en avant plan)
- Le paramètre  Draw tracks as waypoints: Yes, with no name permet d'afficher les points sur le tracé
- Le paramètre Force plain text to be this type: Trackpoints permet de relier les points par un segment
Sur la carte, en bas à gauche, cliquer sur l'icone Graph pour afficher la courbe d'élévations
Cliquer sur l'échelle du graphique pour changer les unités de mesure (dommage, il n'y a pas le NM)
Passer la souris sur la courbe pour afficher l'altitude d'un point
Sur la carte, cliquer sur un point pour afficher les informations relatives à ce point (info-bulle)
Il est possible d'ajouter des informations aux points dans le fichier monparcours.csv , après la dernière virgule.
Par exemple, il peut être intéressant d'ajouter la distance entre le point et le point précédent.
Ces informations apparaîtront dans l'info-bulle.

Il est possible d'afficher plusieurs fichiers sur la carte.
Pour cela, sur la page MAKE A MAP, reprendre les paramètres précédents et ajouter, par exemple, en File n° 2, le fichier AIXM_X_IFR_FR.gpx
Changer les paramètres selon besoin (ex: map type=OpenstreetMap+relief, option Colorize by=none)
Astuce: une fois la carte affichée, décocher et re-cocher la case "Tracks", cela permet de mettre les points du CSV en avant plan et ainsi de les rendre cliquables et donc d'afficher les info-bulles wink
Le calque de carte OpenAIP est également intéressant.

Pour aller plus loin,
Gpsvisualizer propose des outils de calculs dont le calcul de distance entre deux points.
Pour cela, dans le bandeau haut, cliquer sur Calculators
Dans le cadre Calculate the great circle distance between two points,
Reporter par exemple les coordonnées de LFLC et de CFA 114.35 se trouvant dans le fichier monparcours.csv
Calculer et éventuellement reporter la distance dans le fichier monparcours.csv, après la dernière virgule de la ligne CFA 114.35
Sauvegarder le csv. Cette distance apparaitra dans l'info-bulle de CFA 114.35

Enfin, petites cerises sur la gateau:
Il est possible d'uploader le fichier monparcours.gpx sur le site https://www.windy.com/ pour afficher la vitesse du vent ou le METAR d'un aéroport.
Pour uploader un fichier GPX, aller dans le menu "Burger" en haut à gauche, puis télécharger un fichier KML, GPX, etc
windy_gpx_metar.jpg

Enfin, avec SDVFR, si on place le fichier GPX dans le répertoire /Android/data/fr.skydreamsoft.sdvfr/files/perso/
alors on peut le charger sur la carte via le menu Navigation > Outils > Actions > Charger :
sdvfr_gpx.jpg
Rappel: pour envoyer la position avion de Flightgear vers SDVFR, ajouter le paramètre:
--generic=socket,out,1,255.255.255.255,49002,udp,foreflight-xgps
Et dans SDVFR, activer l'option Mode Simulateur

Voilà, ça parait un poil compliqué au premier abord mais finalement, après deux essais, ça roule smile
Ce tuto est également disponible en cliquant ici

Dernière modification par fdz (15/04/2021 18:39:28)


Flightgear version 2020.4.0 compilé et Flightgear version 2020.3.6 appImage
Linux Mint Debian Edition 4
HP ProBook 4530s - Intel Core i5-2430M - 8Go Ram - Carte graphique Intel HD 3000 et Radeon HD 7400M Series
- Non pilote - Avion préféré: l'Aerostar-700 alias "Aerostar 76 Clématisé"

Hors ligne

#2 6/04/2021 22:07:27

f-toro
Administrateur
Lieu : LFLA
Inscription : 16/12/2007
Messages : 3 015

Re : Créer un parcours pour vol aux instruments

C'est plus qu'un truc ou une astuce, c'est un vrai tuto, bien documenté !

C'est pourquoi je me suis permis de le déplacer pour qu'il ait plus d'impact.

Chapeau fdz !


André. anciennement taureau89_9
Debian Testing Amd64. CM Sabertooth 990FX, FX8350, 32 Go Ram DDR3 1866 Mhz, GTX 1060 6Go, DD 2To Sata 3, THRUSTMASTER T.Flight StickX, FG 2020.4.0 Git.

Hors ligne

#3 7/04/2021 12:41:38

dany93
Administrateur
Lieu : Région Parisienne
Inscription : 5/07/2009
Messages : 4 037

Re : Créer un parcours pour vol aux instruments

Bonjour,

Impressionnant ! Bravo fdz smile

Dany


FG 2020.4.0, Linux Mint 20.3, Intel Core i7-11700F @ 2.50GHz, RAM 32 GB DDR4, NVIDIA GeForce RTX 3060 (12 GB)
Boeing 787-8 (YASim, avec nickyivyca, aco)
Hangar avions Patten (PAF) Robin  DR400 JSBSim, Douglas DC3 JSBSim, CAP10B, Tecnam P92 JSBSim.

Hors ligne

#4 7/04/2021 17:24:59

fdz
Membre
Lieu : Newbie
Inscription : 12/02/2021
Messages : 118
Site Web

Re : Créer un parcours pour vol aux instruments

merci aux admins,
le plus impressionnant, c'est le gars (Adam Schneider) qui a créé le site gpsvisualizer smile
Faudrait que je lui demande pourquoi il faut faire une seconde passe sur le fichier CSV pour que les "estimated fields" soient bien pris en compte...


Flightgear version 2020.4.0 compilé et Flightgear version 2020.3.6 appImage
Linux Mint Debian Edition 4
HP ProBook 4530s - Intel Core i5-2430M - 8Go Ram - Carte graphique Intel HD 3000 et Radeon HD 7400M Series
- Non pilote - Avion préféré: l'Aerostar-700 alias "Aerostar 76 Clématisé"

Hors ligne

#5 10/04/2021 10:58:47

fdz
Membre
Lieu : Newbie
Inscription : 12/02/2021
Messages : 118
Site Web

Re : Créer un parcours pour vol aux instruments

Bonjour,
je lui ai envoyé un mail auquel il a répondu:

Yes, it is a multi-step process because you are converting from waypoints to tracks and then back again.  (It is an unusual situation.)

Oui, il s'agit d'un processus en plusieurs étapes, car vous convertissez des waypoints en traces, puis inversement.  (C'est une situation inhabituelle).

Je ne suis que moyennement convaincu par la réponse mais ce n'est pas très grave.

Il faut donc simplement convertir le GPX en CSV, sans option particulière puis convertir le CSV obtenu en un autre CSV avec les options désirées (DEM, Bearing, Distance, Comma, Nautical et Trackpoints).

PS: ce qui pourrait être sympa c'est de pouvoir uploader le GPX de waypoints sur les carto multijoueurs http://mpmap04.flightgear.org/ et/ou http://geoffair.org/fg/map-test2/map-test.html smile

Dernière modification par fdz (11/04/2021 10:23:23)


Flightgear version 2020.4.0 compilé et Flightgear version 2020.3.6 appImage
Linux Mint Debian Edition 4
HP ProBook 4530s - Intel Core i5-2430M - 8Go Ram - Carte graphique Intel HD 3000 et Radeon HD 7400M Series
- Non pilote - Avion préféré: l'Aerostar-700 alias "Aerostar 76 Clématisé"

Hors ligne

#6 11/04/2021 14:46:42

ctesc356
Membre
Inscription : 18/05/2010
Messages : 3 483

Re : Créer un parcours pour vol aux instruments

Bonjour,
merci pour le partage.
Un peu compliqué... si on pense qu'on a presque tout sous la main dans fg pour "pondre" une route, map, map in browser, routemanager etc.
Le + : le profil du terrain.

La première phase (recherche de points, copie des lignes de la bd) est assez fastidieuse.
Voilà un petit script python qui simplifie le boulot:

#!/usr/bin/python3

file = open('AIXM_X_IFR_FR.gpx', "r")
lines=file.readlines()    #lecture fichier bd
file.close()
route = open('route.txt', "r")
rte=route.readlines()   #lecture fichier route
route.close()
sortie=open('parcours.gpx', "w")    #raz fichier sortie
sortie=open('parcours.gpx', "a")
i=0
for wp in rte:
   wp=wp.rstrip('\n')   #suppression des lf
   for line in lines:
      line=line.rstrip('\n')
      if i < 2:
         sortie.write(line)  #ecriture des 2 lignes entête
         sortie.write("\n")
         i=i+1
      elif wp in line:
            print(line)
            sortie.write(line)    #ecriture lignes route
            sortie.write("\n")
            break
sortie.write("</gpx>")    #ligne fin
sortie.close()

- dans le dossier contenant "AIXM_X_IFR_FR.gpx" créer un fichier "route.txt"
- y écrire la route sous la forme: (ne pas entrer des wp "pin, red" (ILS) ça provoquerait des doublons)

LFLC
CFA 114.35
VELIR
UXANA
MINPA
MOKDI
MEN 115.3
REMDU
DITEV
ESPAL
ROM 302
MAKIL
DEPES
GAI 115.8
TOU 117.7

- lancer le script (dans ce même dossier) qui crée le fichier "parcours.gpx" utilisable pour la suite...

Sans garantie du gouvernement et bien-sûr perfectible... wink


Intel i5-9400F, 16Go Ram, Nvidia GTX1660Ti, Linux Mint

Hors ligne

#7 11/04/2021 16:20:12

fdz
Membre
Lieu : Newbie
Inscription : 12/02/2021
Messages : 118
Site Web

Re : Créer un parcours pour vol aux instruments

Bonjour ctesc356,
script testé et approuvé smile

Je ne connais pas python mais à la lecture du script: "elif wp in line:" je comprends que l'instruction recherche la chaine "wp" dans la chaine "line", ce qu'on pourrait traduire par: si "line" contient "wp" alors...

Tu peux l'améliorer en encadrant la chaine cherchée par <name> et </name> , avant d'effectuer la recherche dans la ligne.
Exemple: wp = "<name>" + wp + "</name>"
Ainsi, si l'utilisateur, pour un VOR ou un NDB n'écrit pas la fréquence dans le fichier route.txt, le script ne trouvera pas la ligne.

Exemple: MEN 115.3
Si dans le fichier route.txt, l'utilisateur écrit simplement MEN alors le script retournera plusieurs lignes:
SOMEN
MEN 115.3
FAMEN
etc...

J'ai fait une petite une modif pour les Navaids, le script fonctionne même sans la fréquence ou avec les 3 premiers chiffres de la fréquence.
Et une modif dans le même genre concernant la recherche d'aéroports.
Cela permet de n'écrire que le code OACI de l'aéroport dans le fichier texte.

Enfin, puisque le fichier cible se nomme "parcours.gpx" autant nommer le fichier route "parcours.txt" et le script "parcours.py" , histoire d'uniformiser les noms de fichiers smile

PS: as tu testé l'envoi de fichier GPX sur SDVFR et de suivre ton vol avec SDVFR ?


Script amélioré:

#!/usr/bin/python3

file = open('AIXM_X_IFR_FR.gpx', "r")
lines=file.readlines()    #lecture fichier bd
file.close()
route = open('parcours.txt', "r")
rte=route.readlines()   #lecture fichier route
route.close()
sortie=open('parcours.gpx', "w")    #raz fichier sortie
sortie=open('parcours.gpx', "a")
i=0
for wp in rte:
   wp=wp.rstrip('\n')   #suppression des lf
   
   ap = wp # pour la recherche des aeroports: "LFLC"
   sym="<sym>Airport"

   na = wp # pour la recherche des navaids : "MEN"
   if len(wp) == 3:
      na="<name>" + na + " "
      sym="<sym>Navaid"

   naf = wp # pour la recherche des navaids avec le debut de la frequence mais sans la décimale: "MEN 115"
   if len(wp) == 7:
      naf="<name>" + naf
      sym="<sym>Navaid"

   wp = "<name>" + wp + "</name>"  # pour une recherche à l'identique
   
   for line in lines:
      line=line.rstrip('\n')
      if i < 2:
         sortie.write(line)  #ecriture des 2 lignes entête
         sortie.write("\n")
         i=i+1
      elif wp in line or (ap in line and sym in line) or (na in line and sym in line) or (naf in line and sym in line)  :
            print(line)
            sortie.write(line)    #ecriture lignes route
            sortie.write("\n")
            break
sortie.write("</gpx>")    #ligne fin
sortie.close()

Dans ce fichier parcours.txt ,  j'ai remplacé CFA 114.35 par CFA 114 , et  GAI 115.8 par GAI. Le script trouve quand même ses petits.

LFLC
CFA 114
VELIR
UXANA
MINPA
MOKDI
MEN 115.3
REMDU
DITEV
ESPAL
ROM 302
MAKIL
DEPES
GAI
TOU 117.7

Dernière modification par fdz (12/04/2021 18:59:11)


Flightgear version 2020.4.0 compilé et Flightgear version 2020.3.6 appImage
Linux Mint Debian Edition 4
HP ProBook 4530s - Intel Core i5-2430M - 8Go Ram - Carte graphique Intel HD 3000 et Radeon HD 7400M Series
- Non pilote - Avion préféré: l'Aerostar-700 alias "Aerostar 76 Clématisé"

Hors ligne

#8 11/04/2021 17:37:40

ctesc356
Membre
Inscription : 18/05/2010
Messages : 3 483

Re : Créer un parcours pour vol aux instruments

fdz a écrit :

PS: as tu testé l'envoi de fichier GPX sur SDVFR ?

Oui, ça fonctionne, j'ai la route et mon avion fg sur la tablette wink


Intel i5-9400F, 16Go Ram, Nvidia GTX1660Ti, Linux Mint

Hors ligne

#9 11/04/2021 18:10:39

fdz
Membre
Lieu : Newbie
Inscription : 12/02/2021
Messages : 118
Site Web

Re : Créer un parcours pour vol aux instruments

j'ai amélioré le script, cette fois ci pour les navaids. Même sans la fréquence, ça fonctionne (en espérant qu'il n'y ait pas deux Navaids de même nom mais avec une fréquence différente).
Merci à toi pour la "trame" en python wink

Dans gpsvisualizer, ces options sont également assez pratiques wink
gpsvisualizer_wp_list_names.jpg
Waypoints labels: affiche les étiquettes de tous les points sur la carte
List of markers: affiche une liste contenant le nom des points. En sélectionnant un élément dans la liste, le focus se positionne directement sur le point.

Dernière modification par fdz (11/04/2021 19:05:23)


Flightgear version 2020.4.0 compilé et Flightgear version 2020.3.6 appImage
Linux Mint Debian Edition 4
HP ProBook 4530s - Intel Core i5-2430M - 8Go Ram - Carte graphique Intel HD 3000 et Radeon HD 7400M Series
- Non pilote - Avion préféré: l'Aerostar-700 alias "Aerostar 76 Clématisé"

Hors ligne

#10 12/04/2021 18:00:29

fdz
Membre
Lieu : Newbie
Inscription : 12/02/2021
Messages : 118
Site Web

Re : Créer un parcours pour vol aux instruments

News:
Le script crée un fichier CSV en plus du fichier GPX.
Si on ne souhaite faire que des calculs avec gpsvisualizer, les données du CSV sont idéales car elles sont déjà au format attendu par gpsvisualizer, c'est à dire lat et lon séparées par une virgule.
Et si on souhaite afficher les données sur la carte, par rapport au tuto, il ne reste plus qu'à faire la seconde passe sur ce fichier CSV pour avoir les infos complémentaires (bearing, distances, elevations):
gpsvisualizer_csvW_to_csvT.jpg

Le fichier GPX n'a quasiment plus d'intérêt, sauf si on souhaite le mixer avec le CSV sur la carto.

Enfin, pour les Windosiens, le même script en vba ( parcours.vbs ).
J'ai essayé de garder sensiblement les mêmes techniques entre python et vba.

Script parcours.py :

#!/usr/bin/python3
import os.path

def XmlToCsv(strXML):
   PT_TYPE="W"
   SEPAR=","

   # type,latitude,longitude,name,sym
   # <wpt lat="45.404278" lon="3.182389"><name>VELIR</name><sym>Triangle, Green</sym></wpt>
   
   p=strXML.find("lat=")+5
   z=strXML.find("lon=")-2
   strLat=strXML[p:z]
   
   p=strXML.find("lon=")+5
   z=strXML.find("<name>")-2
   strLon=strXML[p:z]
   
   p=strXML.find("<name>")+6
   z=strXML.find("</name>")
   strName=strXML[p:z]
   
   p=strXML.find("<sym>")+5
   z=strXML.find("</sym>")
   strSym=strXML[p:z]

   return PT_TYPE + SEPAR + strLat + SEPAR + strLon + SEPAR + "\"" + strSym + "\"" + SEPAR + strName
   

def chercheWaypointDansAixmEtCopieDansGpx(AixmFileName):
   fileName="parcours"
   fichierTxt=fileName+".txt"
   fichierGpx=fileName+".gpx"
   fichierCsv=fileName+".csv"

   if os.path.exists(AixmFileName) and os.path.exists(fichierTxt):
      objFicAixm = open(AixmFileName, "r")
      arrAixmFileLines=objFicAixm.readlines()    #lecture fichier bd
      objFicAixm.close()

      objFicTxt = open(fichierTxt, "r")
      arrTxtFileLines=objFicTxt.readlines()   #lecture fichier texte
      objFicTxt.close()
      
      objFicCsv=open(fichierCsv, "w")    #raz fichier Csv
      objFicCsv=open(fichierCsv, "a") 
      objFicCsv.write("type,latitude,longitude,sym,name")  #ecriture des entêtes
      objFicCsv.write("\n")   
   
      objFicGpx=open(fichierGpx, "w")    #raz fichier Gpx
      objFicGpx=open(fichierGpx, "a")   
   
      i=0
      r=0
      t=0
      for wp in arrTxtFileLines:
         wp=wp.rstrip('\n')   #suppression des lf
         r=r+1
      
         ap = wp # pour la recherche des aeroports: "LFLC"
         sym="<sym>Airport"
   
         na = wp # pour la recherche des navaids : "MEN"
         if len(wp) == 3:
            na="<name>" + na + " "
            sym="<sym>Navaid"
   
         naf = wp # pour la recherche des navaids avec le debut de la frequence mais sans la décimale: "MEN 115"
         if len(wp) == 7:
            naf="<name>" + naf
            sym="<sym>Navaid"
   
         wp = "<name>" + wp + "</name>"  # pour une recherche à l'identique
      
         for line in arrAixmFileLines:
            line=line.rstrip('\n')
            if i < 2:
               objFicGpx.write(line)  #ecriture des 2 lignes entête
               objFicGpx.write("\n")
               i=i+1
            elif wp in line or (ap in line and sym in line) or (na in line and sym in line) or (naf in line and sym in line)  :
                  print(line)
                  objFicGpx.write(line)    #ecriture ligne
                  objFicGpx.write("\n")			   
               
                  csvLine=XmlToCsv(line)
                  print(csvLine)
                  objFicCsv.write(csvLine) # ecriture ligne
                  objFicCsv.write("\n")
			   
                  t=t+1
                  break
			   
      objFicGpx.write("</gpx>")    #ligne fin
      objFicGpx.close()
      objFicCsv.close()
   
      print("End: "+str(t)+"/"+str(r)+" waypoints.")
   
# lance la procédure
chercheWaypointDansAixmEtCopieDansGpx("AIXM_X_IFR_FR.gpx")

Script parcours.vbs pour Windows (à exécuter de préférence avec cscript.exe) :

option explicit
' author: fdz , idée originale ctesc356
' object: pour chaque élément du fichier texte, cherche une correspondance dans le fichier AIXM et la recopie dans un nouveau fichier GPX.
const VERSION=20210412.1845
const MSGTITLE="PARCOURS"

Function CurrentDir() ' répertoire en cours
	dim monRepScript
	monRepScript=left(wscript.scriptfullname,len(wscript.scriptfullname)-len(wscript.scriptname))
	CurrentDir=monRepScript
End Function

function extract(strChaine,i,j) 
	' extrait une chaine dans une chaine (pour equivalent python sousChaine=chaine[start:end])
	dim p
	dim strReturn
	strReturn=""
	for p=i to j-1
		strReturn=strReturn & mid(strChaine,p,1)
	next
	extract=strReturn
end function

function XmlToCsv(strXML) ' def XmlToCsv(strXML):
	const PT_TYPE="W"
	const SEPAR=","
	dim strReturn
	dim strLat
	dim strLon
	dim strName
	dim strSym
	dim p
	dim z

	' type,latitude,longitude,name,sym
	' <wpt lat="45.404278" lon="3.182389"><name>VELIR</name><sym>Triangle, Green</sym></wpt>
	
	p=instr(strXML,"lat=")+5
	z=instr(strXML,"lon=")-2
	strLat=extract(strXML,p,z)
		
	p=instr(strXML,"lon=")+5
	z=instr(strXML,"<name>")-2
	strLon=extract(strXML,p,z)
	
	p=instr(strXML,"<name>")+6
	z=instr(strXML,"</name>")
	strName=extract(strXML,p,z)

	p=instr(strXML,"<sym>")+5
	z=instr(strXML,"</sym>")
	strSym=extract(strXML,p,z)

	strReturn=PT_TYPE & SEPAR & strLat & SEPAR & strLon & SEPAR & """" & strSym & """" & SEPAR & strName
	
	XmlToCsv=strReturn
	
end function

sub chercheWaypointDansAixmEtCopieDansGpx(AixmFileName)
	
	dim CRLF
	CRLF=chr(13) & chr(10) ' caractères de fin de ligne

	dim objADODB ' ADODB.Stream
	dim objFSO ' FileSystemObject
	
	dim strFicAIXM ' chemin du fichier AIXM
	dim strAixmFileContent ' contenu du fichier AIXM
	dim arrAixmFileLines ' tableau de lignes du fichier AIXM
	
	dim strFicTxt ' chemin du fichier texte
	dim strTxtFileContent ' contenu du fichier texte
	dim arrTxtFileLines ' tableau de lignes du fichier texte
	dim objFicTxt ' objet fichier texte
	
	dim strFicGpx ' chemin du fichier GPX cible (en sortie)
	dim objFicGpx ' objet fichier GPX

	dim strFicCsv ' chemin du fichier GPX cible (en sortie)
	dim objFicCsv ' objet fichier GPX	
	
	dim line ' contient une ligne du fichier AIXM
	dim p ' indice de ligne du tableau de lignes du fichier texte
	dim i ' num de ligne en cours du tableau AIXM
	dim l ' indice de ligne du tableau AIXM
	dim n ' nbr de lignes du tableau AIXM
	dim r ' nbr éléments recherchés
	dim t ' nbr éléments trouvés
	
	dim wp ' waypoint
	dim ap ' airport
	dim sym ' symbol
	dim na ' navaid
	dim naf ' navaid avec frequence
	
	' chemins des fichiers
	strFicAIXM=CurrentDir() & AixmFileName
	strFicTxt=CurrentDir() & replace(wscript.scriptname,".vbs",".txt")
	strFicGpx=CurrentDir() & replace(wscript.scriptname,".vbs",".gpx")
	strFicCsv=CurrentDir() & replace(wscript.scriptname,".vbs",".csv")
	
	' instanciation du FileSystemObject
	Set objFSO = CreateObject("Scripting.FileSystemObject")
	
	' récupère le contenu du fichier AIXM 
	strAixmFileContent=""
	if objFSO.FileExists(strFicAIXM) then
		Set objADODB = CreateObject("ADODB.Stream") ' cet objet permet de convertir un fichier encodé en UTF8 en une chaine ANSI
		objADODB.Charset="utf-8"
		objADODB.open
		objADODB.loadFromFile(strFicAIXM)
		strAixmFileContent=objADODB.ReadText()
		objADODB.close
		set objADODB=nothing
	else
		msgbox "Le fichier AIXM n'existe pas.",,MSGTITLE
	end if

	i=0
	r=0
	t=0	
	if strAixmFileContent="" then ' si le contenu AIXM est vide...
		msgbox "Erreur de fichier AIXM.",,MSGTITLE
	else	
		' Copie le contenu du fichier AIXM dans un tableau
		arrAixmFileLines=split(strAixmFileContent,chr(10)) ' remarque: les lignes du fichier Aixm créé sous Linux ne contiennent pas le chr(13)
		n=ubound(arrAixmFileLines)
		strAixmFileContent=""
		
		' Copie le contenu du fichier texte dans un tableau
		strTxtFileContent=""
		if objFSO.FileExists(strFicTxt) then
			Set objFicTxt = objFSO.OpenTextFile(strFicTxt,1)
			if objFicTxt.AtEndOfStream then
				msgbox "Le fichier texte est vide.",,MSGTITLE
			else
				strTxtFileContent =  objFicTxt.ReadAll ' Do While theFile.AtEndOfLine <> True
			end if
			objFicTxt.Close
		else
			msgbox "Le fichier texte n'existe pas.",,MSGTITLE
		end if
		
		if strTxtFileContent<>"" then
			arrTxtFileLines = split(strTxtFileContent,CRLF)
			
			set objFicCsv=objFSO.OpenTextFile(strFicCsv,2,true,0) ' Ouvre le fichier CSV cible en ecriture,create,ascii
			objFicCsv.Write "type,latitude,longitude,sym,name" & CRLF ' ecriture des entêtes
			
			set objFicGpx=objFSO.OpenTextFile(strFicGpx,2,true,0) ' Ouvre le fichier GPX cible en ecriture,create,ascii
			
			for p=0 to ubound(arrTxtFileLines) ' pour chaque élément du tableau de lignes du fichier texte...
				wp=trim(arrTxtFileLines(p)) ' élément du fichier texte (sans espaces)
				if wp<>"" then
					r=r+1
					
					ap=wp
					sym="<sym>Airport"
					
					na = wp ' pour la recherche des navaids : "MEN"
					if len(wp) = 3 then
						na="<name>" & na & " "
						sym="<sym>Navaid"
					end if
					
					naf = wp ' pour la recherche des navaids avec le debut de la frequence mais sans la décimale: "MEN 115"
					if len(wp) = 7 then
						naf="<name>" & naf
						sym="<sym>Navaid"
					end if

					wp = "<name>" & wp & "</name>"  ' pour une recherche à l'identique
					
					for l=0 to n  ' pour chaque élément du tableau de lignes du fichier AIXM...
						line=replace(arrAixmFileLines(l),chr(13),"")
						if i<2 then
							objFicGpx.Write line & CRLF ' ecriture des 2 lignes entête
						elseif instr(line,wp) or (instr(line,ap) and instr(line,sym)) or (instr(line,na) and instr(line,sym)) or (instr(line,naf) and instr(line,sym))  then
							objFicGpx.Write line & CRLF ' ecriture ligne
							objFicCsv.Write XmlToCsv(line) & CRLF ' ecriture ligne
			
							t=t+1
							exit for
						end if
						i=i+1
					next
				end if		
			next
			objFicGpx.Write "</gpx>"
			objFicGpx.close
			objFicCsv.close
		end if
	end if
	msgbox t & "/" & r & " waypoints.",,MSGTITLE
 
end sub

' lance la procédure
chercheWaypointDansAixmEtCopieDansGpx "AIXM_X_IFR_FR.gpx"

Dernière modification par fdz (12/04/2021 19:04:59)


Flightgear version 2020.4.0 compilé et Flightgear version 2020.3.6 appImage
Linux Mint Debian Edition 4
HP ProBook 4530s - Intel Core i5-2430M - 8Go Ram - Carte graphique Intel HD 3000 et Radeon HD 7400M Series
- Non pilote - Avion préféré: l'Aerostar-700 alias "Aerostar 76 Clématisé"

Hors ligne

#11 13/04/2021 8:11:29

ctesc356
Membre
Inscription : 18/05/2010
Messages : 3 483

Re : Créer un parcours pour vol aux instruments

Bonjour,
quelle expansion... ça prend du coffre wink

fdz a écrit :

pour les Windosiens, le même script en vba

Python est portable, ça devrait fonctionner sous windows.

Peut-être enlever le "#!/usr/bin/python3" du début, et installer python3.
"os.path" est là pour s'adapter aux os (linux,win,mac)

Dernière modification par ctesc356 (13/04/2021 8:14:54)


Intel i5-9400F, 16Go Ram, Nvidia GTX1660Ti, Linux Mint

Hors ligne

#12 14/04/2021 17:43:52

HH64
Membre
Lieu : Sud-Ouest Pyrénées
Inscription : 6/08/2016
Messages : 347

Re : Créer un parcours pour vol aux instruments

Bonjour,

Je suis avec intérêt ce sujet concernant la création de routes au travers de GPS Vizualizer et vous remercie des scripts mis à disposition.

Les fichiers .gpx ou .csv sont-ils directement consommables dans FlightGear (dans le Route Manager, le GPS ou un MCDU)?

Si non, une moulinette proche du travail déjà réalisé me semble-t-il et produisant un fichier de type .xml (.fgrun) pourrait s'avérer utile.


FG 2020.3.13, CPU: 2 x Xeon 5570 3GHz, RAM: 12Go, CG: Nvidia FX3800 1Go, Linux Mint 20 & Windows 10

Hors ligne

#13 14/04/2021 19:16:47

fdz
Membre
Lieu : Newbie
Inscription : 12/02/2021
Messages : 118
Site Web

Re : Créer un parcours pour vol aux instruments

Bonjour HH64,
Je viens de faire un premier test en exportant une liste de points depuis le route manager de FG.
On obtient un fichier XML assez verbeux.
J'ai nettoyé manuellement ce fichier XML en ne gardant que les informations essentielles.
Exemple:

<?xml version="1.0"?>
<PropertyList>
  <route>
    <wp>
      <ident>LFMN</ident>
      <lon>7.212732839</lon>
      <lat>43.65226515</lat>
    </wp>
    <wp>
      <ident>LFSO</ident>
      <lon>5.954551</lon>
      <lat>48.583207</lat>
    </wp>
  </route>
</PropertyList>

Puis depuis le route manager, j'ai rechargé ce fichier XML "light".
Pas de problème, ça fonctionne.
On peut donc imaginer pouvoir générer un fichier XML avec le script "Parcours" sans grande difficulté smile

Dernière modification par fdz (14/04/2021 19:17:53)


Flightgear version 2020.4.0 compilé et Flightgear version 2020.3.6 appImage
Linux Mint Debian Edition 4
HP ProBook 4530s - Intel Core i5-2430M - 8Go Ram - Carte graphique Intel HD 3000 et Radeon HD 7400M Series
- Non pilote - Avion préféré: l'Aerostar-700 alias "Aerostar 76 Clématisé"

Hors ligne

#14 14/04/2021 19:46:21

fdz
Membre
Lieu : Newbie
Inscription : 12/02/2021
Messages : 118
Site Web

Re : Créer un parcours pour vol aux instruments

Voici un premier jet du script parcours.py
D'un point de vue développeur, les fonctions de conversions sont loin d'être jolies jolies mais pour le moment elles fonctionnent.
J'améliorerai à l'occasion.
Le script génère en plus des fichiers CSV et GPX, un fichier XML pouvant être importé directement dans le Route manager de Flightgear.

Version bêta du script:

#!/usr/bin/python3
import os.path

def XmlToCsv(strXML):
   PT_TYPE="W"
   SEPAR=","

   # type,latitude,longitude,name,sym
   # <wpt lat="45.404278" lon="3.182389"><name>VELIR</name><sym>Triangle, Green</sym></wpt>
   
   p=strXML.find("lat=")+5
   z=strXML.find("lon=")-2
   strLat=strXML[p:z]
   
   p=strXML.find("lon=")+5
   z=strXML.find("<name>")-2
   strLon=strXML[p:z]
   
   p=strXML.find("<name>")+6
   z=strXML.find("</name>")
   strName=strXML[p:z]
   
   p=strXML.find("<sym>")+5
   z=strXML.find("</sym>")
   strSym=strXML[p:z]

   return PT_TYPE + SEPAR + strLat + SEPAR + strLon + SEPAR + "\"" + strSym + "\"" + SEPAR + strName


def XmlToFgXml(strXml):
   # <wpt lat="43.4366333333333" lon="5.21511944444444"><name>MARSEILLE PROVENCE [LFML] 70ft</name><ele>21</ele><sym>Airport</sym></wpt>
   # <wp> <lat>48.583207</lat> <lon>5.954551</lon> <ident>LFSO</ident></wp>
   newXml=strXml
   newXml=newXml.replace("<wpt","<wp>")
   newXml=newXml.replace("</wpt>","</wp>")
   newXml=newXml.replace("lat=\"","<lat>")
   newXml=newXml.replace("\" lon=\"","</lat><lon>")
   newXml=newXml.replace("\"><name>","</lon><ident>")
   newXml=newXml.replace("</name>","</ident>")
   newXml=newXml.replace("<sym>","<type>")
   newXml=newXml.replace("</sym>","</type>")
   return newXml


def chercheWaypointDansAixmEtCopieDansGpx(AixmFileName):
   fileName="parcours"
   fichierTxt=fileName+".txt"
   fichierGpx=fileName+".gpx"
   fichierCsv=fileName+".csv"
   fichierXml=fileName+".xml"

   if os.path.exists(AixmFileName) and os.path.exists(fichierTxt):
      objFicAixm = open(AixmFileName, "r")
      arrAixmFileLines=objFicAixm.readlines()    #lecture fichier bd
      objFicAixm.close()

      objFicTxt = open(fichierTxt, "r")
      arrTxtFileLines=objFicTxt.readlines()   #lecture fichier texte
      objFicTxt.close()
      
      objFicCsv=open(fichierCsv, "w")    #raz fichier Csv
      objFicCsv=open(fichierCsv, "a") 
      objFicCsv.write("type,latitude,longitude,sym,name")  #ecriture des entêtes
      objFicCsv.write("\n")
   
      objFicGpx=open(fichierGpx, "w")    #raz fichier Gpx
      objFicGpx=open(fichierGpx, "a")  

      objFicXml=open(fichierXml, "w")    #raz fichier Xml
      objFicXml=open(fichierXml, "a") 
      objFicXml.write("<?xml version=\"1.0\"?><PropertyList><route>")  #ecriture entête
      objFicXml.write("\n")   
   
      i=0
      r=0
      t=0
      for wp in arrTxtFileLines:
         wp=wp.rstrip('\n')   #suppression des lf
         r=r+1
      
         ap = wp # pour la recherche des aeroports: "LFLC"
         sym="<sym>Airport"
   
         na = wp # pour la recherche des navaids : "MEN"
         if len(wp) == 3:
            na="<name>" + na + " "
            sym="<sym>Navaid"
   
         naf = wp # pour la recherche des navaids avec le debut de la frequence mais sans la décimale: "MEN 115"
         if len(wp) == 7:
            naf="<name>" + naf
            sym="<sym>Navaid"
   
         wp = "<name>" + wp + "</name>"  # pour une recherche à l'identique
      
         for line in arrAixmFileLines:
            line=line.rstrip('\n')
            if i < 2:
               objFicGpx.write(line)  #ecriture des 2 lignes entête
               objFicGpx.write("\n")
               i=i+1
            elif wp in line or (ap in line and sym in line) or (na in line and sym in line) or (naf in line and sym in line)  :
                  print(line)
                  objFicGpx.write(line)    #ecriture ligne
                  objFicGpx.write("\n")			   
               
                  csvLine=XmlToCsv(line)
                  print(csvLine)
                  objFicCsv.write(csvLine) # ecriture ligne
                  objFicCsv.write("\n")

                  xmlLine=XmlToFgXml(line)
                  print(xmlLine)
                  objFicXml.write(xmlLine) # ecriture ligne
                  objFicXml.write("\n")
			   
                  t=t+1
                  break
			   
      objFicGpx.write("</gpx>")    #ligne fin
      objFicGpx.close()

      objFicXml.write("</route></PropertyList>")    #ligne fin
      objFicXml.close()

      objFicCsv.close()
   
      print("End: "+str(t)+"/"+str(r)+" waypoints.")
   
# lance la procédure
chercheWaypointDansAixmEtCopieDansGpx("AIXM_X_IFR_FR.gpx")

Attention, tous les points ne sont pas reconnus par le Route manager de Flightgear.
Dans le route manager, il faut afficher les coordonnées des points pour voir si elles sont à 0,0 (les distances sont aussi farfelues).
Auquel cas, il faut retirer ces points avec le bouton REMOVE.
Pour afficher les coordonnées, il suffit de sélectionner une ligne puis de re-cliquer sur la ligne.
L'affichage switche ainsi entre distance et coordonnées.
Bref, ce n'est pas Full compatible.

Dernière modification par fdz (14/04/2021 20:48:16)


Flightgear version 2020.4.0 compilé et Flightgear version 2020.3.6 appImage
Linux Mint Debian Edition 4
HP ProBook 4530s - Intel Core i5-2430M - 8Go Ram - Carte graphique Intel HD 3000 et Radeon HD 7400M Series
- Non pilote - Avion préféré: l'Aerostar-700 alias "Aerostar 76 Clématisé"

Hors ligne

#15 15/04/2021 13:17:48

HH64
Membre
Lieu : Sud-Ouest Pyrénées
Inscription : 6/08/2016
Messages : 347

Re : Créer un parcours pour vol aux instruments

Bonjour et avant tout merci.

Le script fonctionne parfaitement.

Pour la petite histoire, je le teste sur le parcours LFBT LFCO LATEK SOVAR PERDU ANETO GIROM LFNQ ALBER LFMP LFDJ LFJH LFDQ LFBP VNSB. Le navaid ALBER qui est un point radio fixe des Pyrénées est remplacé par l'aéroport Albert Bray (LFAQ) en Picardie qui suit curieusement le point La Quillane (LFNQ). Accepté par le gestionnaire de route de Flightgear, il subsiste cependant une anomalie sous la forme d'un point hors parcours à 2500NM. La suppression de ce point entraîne ensuite des anomalies en cascade.

Remplacer la chaîne de caractère dans la balise <ident> en ne laissant que le contenu entre (mais sans) crochets (ICAO) suffit à rendre la route parfaitement assimilable par FG. De plus, remplacer la balise <ele> par <altitude-ft> rend la gestion des altitudes (arrondies au 100' inférieurs) sol possible, bien entendu avec les précautions d'usage...

Bonne journée.

Dernière modification par HH64 (15/04/2021 14:12:36)


FG 2020.3.13, CPU: 2 x Xeon 5570 3GHz, RAM: 12Go, CG: Nvidia FX3800 1Go, Linux Mint 20 & Windows 10

Hors ligne

#16 15/04/2021 18:15:29

fdz
Membre
Lieu : Newbie
Inscription : 12/02/2021
Messages : 118
Site Web

Re : Créer un parcours pour vol aux instruments

Bonjour,
voilà qui devrait être mieux.
J'ai fait un certain nombre d'améliorations du code.
Et j'ai remarqué deux coquilles dans le fichier AIXM qui peuvent poser problème avec les scripts python.

Dans la ligne suivante, il faut remplacer xmlns par xmlns:gpx

xmlns="http://www.topografix.com/GPX/1/0"

Dans la ligne suivante, il y a un / en trop après le .fr" qu'il faut donc retirer

<link href="https://www.sia.aviation-civile.gouv.fr"/><text>

Le fichier corrigé se trouve ici: AIXM_X_IFR_FR.gpx (appuyer sur F5 pour actualiser)
J'y ai aussi ajouté l'aéroport de Genève.
Pour me faire pardonner des coquilles, un fichier AIXM avec des points outre-mer (aeroports IFR): AIXM_X_IFR_FR_OM.gpx
Modifiez la dernière du script en conséquence pour prendre ce fichier en référence wink

New script bêta:

#!/usr/bin/python3
SCRIPT_VERSION=20210415.1803
SCRIPT_AUTHOR="fdz, ctesc356"
import os.path
from xml.etree import ElementTree as xmlDom

# ----------------------------------------------------------------------------------------------------------
class GPoint:
   "Définition d'un point geographique"

   def __init__(self,strType="W",strLat="0.0",strLon="0.0",strName="UNKNOWN",strEle="",strSym="Waypoint"):
      self.type=strType
      self.lat=strLat
      self.lon=strLon
      self.name=strName
      self.ele=strEle
      self.sym=strSym
      #print("type:"+self.type,"name:"+self.name,"lat:"+self.lat,"lon:"+self.lon,"sym:"+self.sym,"ele:"+self.ele)

   def toGpx(self):
      strReturn="<lat>"+self.lat+"</lat>" + "<lon>"+self.lon+"</lon>" + "<name>"+self.name+"</name>" + "<sym>"+self.sym+"</sym>"
      if self.ele != "": strReturn=strReturn+"<ele>"+self.ele+"</ele>"
      strType="wpt"
      if self.type=="T": strType="trkpt"
      strReturn="<"+strType+">" + strReturn + "</"+strType+">"
      return strReturn

   def toCsv(self):
      SEPAR=","
      return self.type + SEPAR + self.lat + SEPAR + self.lon + SEPAR + "\"" + self.sym + "\"" + SEPAR + self.name # self.ele

   def toFgXml(self):
      strReturn=""
      pt=self
      if not pt.sym.find("Airport")==-1: pt.sym="airport"
      if not pt.sym.find("Heliport")==-1: pt.sym="airport"
      if not pt.sym.find("Navaid")==-1: pt.sym="navaid"
      if not pt.sym.find("Triangle")==-1: pt.sym="basic"
      
      strOACI=""
      if pt.sym=="airport":
         i=pt.name.find("[")+1
         j=pt.name.find("]")
         strOACI=pt.name[i:j]
         pt.name=strOACI

      strReturn="<lat>"+pt.lat+"</lat>" + "<lon>"+pt.lon+"</lon>" + "<ident>"+pt.name+"</ident>" + "<type>"+pt.sym+"</type>"

      if pt.ele!="": strReturn=strReturn + "<altitude-ft>"+str(int(float(pt.ele)*3.31))+"</altitude-ft>"

      if len(strOACI)>0: strReturn=strReturn+"<oaci>"+strOACI+"</oaci>"

      strReturn="<wp>"+ strReturn +"</wp>"
      return strReturn


# ----------------------------------------------------------------------------------------------------------
def XmlToPoint(strXML,strType):
   if len(strXML)>0:
      nodeXML=xmlDom.fromstring(strXML)
      #print(nodeXML.tag,nodeXML.attrib)
      pt=GPoint()
      pt.type=strType
      pt.lat=nodeXML.get('lat')
      pt.lon=nodeXML.get('lon')

      if nodeXML.find('name') != None:
         if nodeXML.find('name').text != None: pt.name=nodeXML.find('name').text

      if nodeXML.find('sym') != None:
         if nodeXML.find('sym').text != None: pt.sym=nodeXML.find('sym').text

      if nodeXML.find('ele') != None:
         if nodeXML.find('ele').text != None: pt.ele=nodeXML.find('ele').text
   
      return pt
   else:
      return None

# ----------------------------------------------------------------------------------------------------------
def chercheWaypointDansAixmEtExporte(AixmFileName,strTypePt="W"):
   fileName="parcours"
   fichierTxt=fileName+".txt"
   fichierGpx=fileName+".gpx"
   fichierCsv=fileName+".csv"
   fichierXml=fileName+".xml"

   if os.path.exists(AixmFileName) and os.path.exists(fichierTxt):
      objFicAixm = open(AixmFileName, "r")
      arrAixmFileLines=objFicAixm.readlines()    # charge le fichier bdd
      objFicAixm.close()

      objFicTxt = open(fichierTxt, "r")
      arrTxtFileLines=objFicTxt.readlines()   # charge le fichier texte
      objFicTxt.close()

      objFicGpx=open(fichierGpx, "w")    # raz fichier Gpx
      objFicGpx=open(fichierGpx, "a")
      
      objFicCsv=open(fichierCsv, "w")    # raz fichier Csv
      objFicCsv=open(fichierCsv, "a") 
   
      objFicXml=open(fichierXml, "w")    # raz fichier Xml
      objFicXml=open(fichierXml, "a") 
   
      i=0
      r=0
      t=0
      for wp in arrTxtFileLines:
         wp=wp.rstrip('\n')   # suppression des lf
         wp=wp.rstrip()
         if len(wp)==0: wp="chainevide"

         r=r+1
      
         ap = wp # pour la recherche des aeroports: "LFLC"
         sym="<sym>Airport"
         if len(wp) == 5:sym="<sym>Triangle" # si 5 car on considère que le pt recherché est un point de report: "ALBER"
   
         na = wp # pour la recherche des navaids : "MEN"
         if len(wp) == 3:
            na="<name>" + na + " "
            sym="<sym>Navaid"
   
         naf = wp # pour la recherche des navaids avec le debut de la frequence mais sans la décimale: "MEN 115"
         if len(wp) == 7:
            naf="<name>" + naf
            sym="<sym>Navaid"

  
         wp = "<name>" + wp + "</name>"  # pour une recherche à l'identique
      
         for line in arrAixmFileLines: # pour chaque ligne de la bdd XML
            line=line.rstrip('\n')
            if i < 2:
               objFicGpx.write(line)  # recopie des 2 lignes entête GPX
               objFicGpx.write("\n")
               i=i+1

               if i==2: 
                  objFicCsv.write("type,latitude,longitude,sym,name")  #ecriture des entêtes
                  objFicCsv.write("\n")

                  objFicXml.write("<?xml version=\"1.0\"?><PropertyList><route>")  #ecriture entête
                  objFicXml.write("\n")

                  if strTypePt=="T":
                     objFicGpx.write("<trk><trkseg>")  #ecriture entête
                     objFicGpx.write("\n")


            elif wp in line or (ap in line and sym in line) or (na in line and sym in line) or (naf in line and sym in line) :
               print(line)
               pt=XmlToPoint(line,strTypePt)
               if pt != None: 
                  line=pt.toGpx()
                  objFicGpx.write(line) #ecriture ligne
                  objFicGpx.write("\n")

                  line=pt.toCsv()
                  objFicCsv.write(line) # ecriture ligne
                  objFicCsv.write("\n")

                  line=pt.toFgXml()
                  objFicXml.write(line) # ecriture ligne
                  objFicXml.write("\n")
	   
               t=t+1
               break

      if strTypePt=="T":
         objFicGpx.write("</trkseg></trk>")  #ecriture fermeture entête
         objFicGpx.write("\n")
      objFicGpx.write("</gpx>")    #ligne fin
      objFicGpx.close()

      objFicXml.write("</route></PropertyList>")    #ligne fin
      objFicXml.close()

      objFicCsv.close()
   
      print("End: "+str(t)+"/"+str(r)+" waypoints.")

# ----------------------------------------------------------------------------------------------   
def parseAIXM():
   xmlContent=xmlDom.parse("AIXM_X_IFR_FR.gpx")
   xmlRoot=xmlContent.getroot()
   xmlWaypoints=xmlRoot.findall('wpt') #  xmlns:gpx= {http://www.topografix.com/GPX/1/0}
   print(len(xmlWaypoints))
   i=0
   for xmlWaypoint in xmlWaypoints:
      i=i+1
      strXml=xmlDom.tostring(xmlWaypoint,encoding="unicode",method="xml")
      pt=XmlToPoint(strXml,"W")
      print(i, pt.toCsv()) # xmlWaypoint

# ---------------------------------------------------------------------------------------------- 
# lance la procédure
chercheWaypointDansAixmEtExporte("AIXM_X_IFR_FR.gpx","W") # type=W (waypoint) ou T (trackpoint)

@HH64:
Dans ton exemple, SOVAR et VNSB n'existe pas dans le fichier AIXM donc ils ne sortent pas dans les fichiers gpx, csv et xml

Dernière modification par fdz (15/04/2021 19:18:19)


Flightgear version 2020.4.0 compilé et Flightgear version 2020.3.6 appImage
Linux Mint Debian Edition 4
HP ProBook 4530s - Intel Core i5-2430M - 8Go Ram - Carte graphique Intel HD 3000 et Radeon HD 7400M Series
- Non pilote - Avion préféré: l'Aerostar-700 alias "Aerostar 76 Clématisé"

Hors ligne

#17 15/04/2021 18:59:42

HH64
Membre
Lieu : Sud-Ouest Pyrénées
Inscription : 6/08/2016
Messages : 347

Re : Créer un parcours pour vol aux instruments

Bonsoir,

Ce nouveau script me semble très efficace puisqu'aucune retouche n'est nécessaire côté gestionnaire de routes.
Je t'informerai si je devais trouver quelque alea.

Encore merci pour ton outil.


FG 2020.3.13, CPU: 2 x Xeon 5570 3GHz, RAM: 12Go, CG: Nvidia FX3800 1Go, Linux Mint 20 & Windows 10

Hors ligne

#18 15/04/2021 19:20:37

fdz
Membre
Lieu : Newbie
Inscription : 12/02/2021
Messages : 118
Site Web

Re : Créer un parcours pour vol aux instruments

HH64 a écrit :

Bonsoir,

Ce nouveau script me semble très efficace puisqu'aucune retouche n'est nécessaire côté gestionnaire de routes.
Je t'informerai si je devais trouver quelque alea.

Encore merci pour ton outil.

De rien, c'est un plaisir wink
J'ai ajouté dans mon message précédent, le lien vers un fichier AIXM incluant les aéroports outre-mer smile


Flightgear version 2020.4.0 compilé et Flightgear version 2020.3.6 appImage
Linux Mint Debian Edition 4
HP ProBook 4530s - Intel Core i5-2430M - 8Go Ram - Carte graphique Intel HD 3000 et Radeon HD 7400M Series
- Non pilote - Avion préféré: l'Aerostar-700 alias "Aerostar 76 Clématisé"

Hors ligne

#19 16/04/2021 17:12:35

fdz
Membre
Lieu : Newbie
Inscription : 12/02/2021
Messages : 118
Site Web

Re : Créer un parcours pour vol aux instruments

Bonjour,
J'ai mis le script parcours.py en téléchargement sur le site Github: https://github.com/ledudulela/Script_GPX_parcours
Ainsi, si je fais de nouvelles mises à jour, il n'y aura qu'une seule source pour le télécharger.

PS:
Dans cette version, j'ai ajouté la gestion d'arguments de ligne de commande:
Le script accepte les paramètres optionnels suivants:

-i fileName   (pour changer de fichier source)
-w                 (pour forcer les exports en waypoints)
-t                   (pour forcer les exports en trackpoints)

et fait un update de la méthode toFgXml() pour les navaids

Dernière modification par fdz (16/04/2021 18:22:46)


Flightgear version 2020.4.0 compilé et Flightgear version 2020.3.6 appImage
Linux Mint Debian Edition 4
HP ProBook 4530s - Intel Core i5-2430M - 8Go Ram - Carte graphique Intel HD 3000 et Radeon HD 7400M Series
- Non pilote - Avion préféré: l'Aerostar-700 alias "Aerostar 76 Clématisé"

Hors ligne

#20 17/04/2021 10:40:56

HH64
Membre
Lieu : Sud-Ouest Pyrénées
Inscription : 6/08/2016
Messages : 347

Re : Créer un parcours pour vol aux instruments

Merci aux 2 auteurs. C'est bien noté et déjà expérimenté avec succès.

Bonne journée.


FG 2020.3.13, CPU: 2 x Xeon 5570 3GHz, RAM: 12Go, CG: Nvidia FX3800 1Go, Linux Mint 20 & Windows 10

Hors ligne

#21 17/04/2021 11:24:00

fdz
Membre
Lieu : Newbie
Inscription : 12/02/2021
Messages : 118
Site Web

Re : Créer un parcours pour vol aux instruments

Bonjour,
si je trouve comment extraire les points de la base de données de Flightgear, je ferai le même script mais en utilisant les données Flightgear à la place des données AIXM ...


Flightgear version 2020.4.0 compilé et Flightgear version 2020.3.6 appImage
Linux Mint Debian Edition 4
HP ProBook 4530s - Intel Core i5-2430M - 8Go Ram - Carte graphique Intel HD 3000 et Radeon HD 7400M Series
- Non pilote - Avion préféré: l'Aerostar-700 alias "Aerostar 76 Clématisé"

Hors ligne

#22 17/04/2021 16:43:33

HH64
Membre
Lieu : Sud-Ouest Pyrénées
Inscription : 6/08/2016
Messages : 347

Re : Créer un parcours pour vol aux instruments

Bonjour,

Volant plus souvent sur hélicoptère, j'ai cherché une solution me permettant de tracer mes routes non pas à partir de points aéronautiques définis mais à partir du trajet au fond des vallées. La saisie suffisamment fine des points du trajet est particulièrement fastidieuse. Cependant, Google Earth et certainement bien d'autres logiciels permettent de saisir un trajet ensuite exportable sous la forme d'un fichier .kmz  "illisible".

GPS_Vizualizer permet de convertir ce fichier en un fichier texte simple à convertir en .xml pour le route manager. A charge de l'utilisateur d'y apporter ses commentaires: <altitude-ft>, <ident> etc.

En l'état parcours.py ne sait pas traiter ce fichier et j'envisage de le modifier en ce sens... Avant que
de réinventer l'eau tiède, je m'interroge sur l'existence d'autres solutions.

Qu'en pensez-vous?

Fichier exemple:

type	latitude	longitude	name	desc
T	43.092947381	-0.041858842	Pyrenees_65_GE	
T	43.074146677	-0.040950122		
T	43.064310002	-0.046430955		
T	43.050017340	-0.058070027		
T	43.040351659	-0.072771619		
T	43.030695989	-0.079764571		
T	43.019908667	-0.089267098		
T	43.007053258	-0.096318510		
T	43.001682507	-0.086318028		
T	42.993818074	-0.080409230		
T	42.982909244	-0.072753694		
T	42.973555403	-0.065999451		
T	42.962077217	-0.061551663		
T	42.956092612	-0.063190418		
T	42.949566271	-0.064622437		
T	42.945661354	-0.058050825		
T	42.939738493	-0.049726999		
T	42.931204509	-0.039120860		
T	42.922652802	-0.035871650		
T	42.917361991	-0.037350764		
T	42.909995966	-0.034400907		
T	42.902857197	-0.029691525		
T	42.891365948	-0.021082256		
T	42.881817455	-0.012294097		
T	42.873191454	-0.007547978		
T	42.865971477	-0.006402060		
T	42.860157634	-0.007901926		
T	42.847053756	-0.001202650		
T	42.841103170	0.001675423		
T	42.833723160	0.001454216		
T	42.828088956	0.004589328		
T	42.823483458	0.007177183		
T	42.817991910	0.008945188		
T	42.811869855	0.008779396		
T	42.805712847	0.011325809		
T	42.794746886	0.016637778		
T	42.783931250	0.017275402		
T	42.764124717	0.013959087		
T	42.760859565	0.010259474		
T	42.765066121	0.005749523		
T	42.758259474	0.001872265		
T	42.755111220	-0.001971417		
T	42.739097072	-0.000794769		
T	42.735886150	-0.002749184		
T	42.732114141	-0.004297801		
T	42.729019494	-0.005485527		
T	42.726051111	-0.008351173		
T	42.722779782	-0.012642011		
T	42.720639797	-0.018016158		
T	42.720542081	-0.022331307		
T	42.719709963	-0.027590153		
T	42.718887167	-0.034435368		
T	42.717215182	-0.039101515		
T	42.714292363	-0.045239989		
T	42.714036323	-0.054357254		
T	42.723020981	-0.058796406		

Dernière modification par HH64 (17/04/2021 16:44:57)


FG 2020.3.13, CPU: 2 x Xeon 5570 3GHz, RAM: 12Go, CG: Nvidia FX3800 1Go, Linux Mint 20 & Windows 10

Hors ligne

#23 17/04/2021 23:08:28

fdz
Membre
Lieu : Newbie
Inscription : 12/02/2021
Messages : 118
Site Web

Re : Créer un parcours pour vol aux instruments

tu peux aussi coller ton texte dans LibreOffice Calc et faire une formule qui concatène les valeurs en les encadrant de balises xml:
Astuce: pour mettre des double-quotes (touche3) dans une chaine, il suffit de les doubler ""

="<wp>" & "<lat>" & B2 & "</lat>"  & "<lon>" & C2 & "</lon>"   & "<ident>" & D2 & "</ident>" & "<type>basic</type>" & "</wp>"

tu obtiendras une ligne de cette forme:

<wp><lat>43.092947381</lat><lon>-0.041858842</lon><ident>1</ident><type>basic</type></wp>

iL ne reste plus qu'à coller le résultat dans un fichier xml commençant par:

<?xml version="1.0"?><PropertyList><route>

et finissant par:

</route></PropertyList>

Tout comme gpsvisualizer > Draw on a map, le site www.calculitineraires.fr permet de créer un parcours et de l'exporter en gpx, kml, csv.
Avec la carte TOPO-ERSI, ça devrait te convenir. Tu peux même avoir les altitudes smile
Le CSV de calculitinéraires utilise le point-virgule comme séparateur et lat,lon sont dans un même champ et séparées par une virgule.
Les formules sont:

lat = GAUCHE(A2;CHERCHE(",";A2)-1)
lon = STXT(A2;CHERCHE(",";A2)+1;30)

/!\ On peut saisir manuellement des coordonnées personnelles dans le route manager mais j''ai l'impression qu'on ne peut pas importer dans le route manager des coordonnées personnelles à partir d'un xml sans que cela génère des erreurs.

Dernière modification par fdz (19/04/2021 20:17:21)


Flightgear version 2020.4.0 compilé et Flightgear version 2020.3.6 appImage
Linux Mint Debian Edition 4
HP ProBook 4530s - Intel Core i5-2430M - 8Go Ram - Carte graphique Intel HD 3000 et Radeon HD 7400M Series
- Non pilote - Avion préféré: l'Aerostar-700 alias "Aerostar 76 Clématisé"

Hors ligne

#24 18/04/2021 11:09:39

HH64
Membre
Lieu : Sud-Ouest Pyrénées
Inscription : 6/08/2016
Messages : 347

Re : Créer un parcours pour vol aux instruments

@ fdz

Grand merci pour tes suggestions que je n'ai pas tardé à mettre en oeuvre.

J'ai testé le site www.calculitineraires.fr. Le trajet.csv répond très bien au besoin.

J'obtiens  bien quelques alertes (warnings) mais, après le retrait des quelques waypoints pour lesquels le route manager présente un aléa de parcours et une sauvegarde par ses soins (save), le "parcours.xml" obtenu donne un résultat plus que satisfaisant.

Merci encore de ton temps et de tes conseils.
Bonne journée.

Dernière modification par HH64 (19/04/2021 12:16:14)


FG 2020.3.13, CPU: 2 x Xeon 5570 3GHz, RAM: 12Go, CG: Nvidia FX3800 1Go, Linux Mint 20 & Windows 10

Hors ligne

#25 18/04/2021 20:39:30

fdz
Membre
Lieu : Newbie
Inscription : 12/02/2021
Messages : 118
Site Web

Re : Créer un parcours pour vol aux instruments

bonjour,

si je trouve comment extraire les points de la base de données de Flightgear, je ferai le même script mais en utilisant les données Flightgear à la place des données AIXM ...

Concernant la base de données de Flightgear, on trouve des fichiers zip dans le dossier: flightgear/fgdata/Navaids
Ces zip contiennent des fichiers .dat qui sont en réalité des fichiers texte plus ou moins CSV.
Les données datent de 2013.

J'ai récupéré toutes les données de la base de données mondiales Flightgear et en ai fait un fichier LibreOffice Calc de 15 Mo que je donnerai à la demande.

Dernière modification par fdz (21/04/2021 19:18:04)


Flightgear version 2020.4.0 compilé et Flightgear version 2020.3.6 appImage
Linux Mint Debian Edition 4
HP ProBook 4530s - Intel Core i5-2430M - 8Go Ram - Carte graphique Intel HD 3000 et Radeon HD 7400M Series
- Non pilote - Avion préféré: l'Aerostar-700 alias "Aerostar 76 Clématisé"

Hors ligne

Pied de page des forums