[Résolu] Récupération de données évolutives

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

[Résolu] Récupération de données évolutives

Message par PhM »

Bonjour,

Sur cette page : https://aviationweather.cp.ncep.noaa.go ... aw&taf=off, je cherche le moyen avec une instruction du type :

InitNetwork()
URL$ = "https://aviationweather.cp.ncep.noaa.go ... aw&taf=off"
Debug GetURLPart(URL$, "xxx")

De récupérer, autant de fois que je le souhaite, l'information variable : LFMT 150800Z AUTO 01005KT 9999 FEW014 08/08 Q1012 NOSIG et rien d'autre !

Pour le moment, cela ne fonctionne pas ?
Avez-vous une idée pour résoudre ce problème ?

Philippe
Dernière modification par PhM le lun. 16/déc./2019 8:46, modifié 1 fois.
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Récupération de données évolutives

Message par Marc56 »

Bonjour,

Soit tu télécharge toute la page web avec ReceiveHTTPFile() puis tu extrais le code entre les balises

Code : Tout sélectionner

<!-- Data starts here -->
<code>LFMT 150830Z AUTO 02008KT 9999 BKN015 10/09 Q1012 NOSIG</code>
Quelque chose comme ça:

Code : Tout sélectionner

InitNetwork()

Source_File$ = GetTemporaryDirectory() + "\Source.txt"

If ReceiveHTTPFile("https://aviationweather.cp.ncep.noaa.gov/metar/data?ids=LFMT&format=raw&taf=off", Source_File$)
    Debug "Connexion OK"
Else
    Debug "Echec de connexion au site"
EndIf

If Not OpenFile(0, Source_File$)
     Debug "Fichier source non chargé"
     End
 EndIf
 
Debug "Lecture fichier source..."
While Not Eof(0)
     Txt$ = ReadString(0, #PB_Ascii | #PB_File_IgnoreEOL)
Wend
CloseFile(0)
Debug "Fichier en mémoire."

Pos_Start   = FindString(Txt$, "<!-- Data starts here -->")
Pos_End     = FindString(Txt$, "</code>", Pos_Start)                         
Metar$      = Mid(Txt$, Pos_Start + 32, Pos_End - Pos_Start - 32)

Debug "METAR: " + #CRLF$ + Metar$
C'est aussi possible avec ReceiveHTTPMemory()


Soit tu vas sur la page API
https://www.aviationweather.gov/dataserver
et tu utilises HTTPRequest()
La réponse peut être au format XML ou CSV
https://www.aviationweather.gov/dataser ... type=metar
(mais hélas leur site est en HTTPS)

:wink:
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

Re: Récupération de données évolutives

Message par PhM »

Merci beaucoup Marc56 !
J'avais compris qu'en enregistrant le fichier, il fallait ensuite chercher la ligne à l'intérieur sans savoir comment faire ?
Par contre, je vais également rechercher la solution avec la deuxième méthode plus correcte et rapide, je suppose ?
Philippe
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Récupération de données évolutives

Message par Marc56 »

Voici la méthode HTTPRequest avec l'exemple 1 de la page
https://www.aviationweather.gov/dataser ... type=metar
La réponse est en XML
À toi d'adapter l'URL et la sortie CSV plutôt qu'XML
(Je n'ai pas lu toute la doc)

Code : Tout sélectionner

InitNetwork()

HttpRequest = HTTPRequest(#PB_HTTP_Get, 
                          "https://www.aviationweather.gov/adds/dataserver_current/httpparam?dataSource=metars&requestType=retrieve&format=xml&stationString=KDEN%20KSEA%20PHNL&hoursBeforeNow=2")
If HttpRequest
    Debug "Status:  " + HTTPInfo(HTTPRequest, #PB_HTTP_StatusCode)
    Debug "Réponse: " + HTTPInfo(HTTPRequest, #PB_HTTP_Response)
    
    FinishHTTP(HTTPRequest)
Else
    Debug "La requête a échoué"
EndIf
Un fois que tu auras mis au point un retour en CSV, tu pourras extraire les infos facilement avec StringField()

:wink:
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

Re: Récupération de données évolutives

Message par PhM »

La deuxième méthode est un petit peu plus rapide car le texte générer en XML est plus court :

Code : Tout sélectionner

InitNetwork()

Source_File$ = GetTemporaryDirectory() + "\metar.txt"

If ReceiveHTTPFile("https://www.aviationweather.gov/adds/dataserver_current/httpparam?dataSource=metars&requestType=retrieve&format=xml&hoursBeforeNow=3&mostRecent=true&stationString=LFMT", Source_File$)
    Debug "Connexion OK"
Else
    Debug "Echec de connexion au site"
EndIf
; -------------------------------------------------------------------
If Not OpenFile(0, Source_File$)
     Debug "Fichier source non chargé"
     End
EndIf
; -------------------------------------------------------------------
Debug "Lecture fichier source..."
While Not Eof(0)
     Txt$ = ReadString(0, #PB_Ascii | #PB_File_IgnoreEOL)
Wend
CloseFile(0)
Debug "Fichier en mémoire."
; -------------------------------------------------------------------

Pos_Start   = FindString(Txt$, "raw_text")
Pos_End     = FindString(Txt$, "</raw_text>", Pos_Start)                         
Metar$      = Mid(Txt$, Pos_Start + 9, Pos_End - Pos_Start - 9)

Debug "METAR: " + #CRLF$ + Metar$
Encore merci Marc56 pour le coup de main...
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Récupération de données évolutives

Message par Marc56 »

C'est bien mais tu peux encore alléger la requête serveur
(ce qui est conseillé par le site (https://www.aviationweather.gov/dataser ... tpractices))

Code : Tout sélectionner

InitNetwork()

; https://aviationweather.cp.ncep.noaa.gov/metar/data?ids=LFMT&format=raw&taf=off
; LFMT 150800Z AUTO 01005KT 9999 FEW014 08/08 Q1012 NOSIG

; Ne recevoir que les infos RAW
URL$ = "https://www.aviationweather.gov/adds/dataserver_current/httpparam"+
       "?dataSource=metars"     +
       "&requestType=retrieve"  +
       "&format=csv"            +
       "&stationString=LFMT"    + 
       "&hoursBeforeNow=2"      +
       "&mostRecent=true"       +
       "&fields=raw_text"

HttpRequest = HTTPRequest(#PB_HTTP_Get, URL$)
                          
If HttpRequest
    Debug "--- Full infos --------------------------------------------"
    Debug "Status:  " + HTTPInfo(HTTPRequest, #PB_HTTP_StatusCode)
    Full_Reply$ = HTTPInfo(HTTPRequest, #PB_HTTP_Response)
    Debug "Réponse: " + Full_Reply$
    FinishHTTP(HTTPRequest)
Else
    Debug "La requête a échoué"
    End
EndIf

; Prendre la dernière ligne (compter les LF)
; Supprimer les ,,,,, en trop
Raw_Txt$ = RTrim(StringField(Full_Reply$, CountString(Full_Reply$, Chr(10)), Chr(10)), ",")

Debug "--- RAW infos --------------------------------------------"
Debug Raw_Txt$

Debug ""
Debug "--- Details ----------------------------------------------" 
Debug "Aéroport     : " + StringField(Raw_Txt$, 1, " ")
Debug "Heure Z      : " + StringField(Raw_Txt$, 2, " ")
Debug "Observation  : " + StringField(Raw_Txt$, 3, " ")
; etc
Ce qui donne:

Code : Tout sélectionner

--- Full infos --------------------------------------------
Status:  200
Réponse: No errors
No warnings
4 ms
data source=metars
1 results
raw_text,station_id,observation_time,latitude,longitude,temp_c,dewpoint_c,wind_dir_degrees,wind_speed_kt,wind_gust_kt,visibility_statute_mi,altim_in_hg,sea_level_pressure_mb,corrected,auto,auto_station,maintenance_indicator_on,no_signal,lightning_sensor_off,freezing_rain_sensor_off,present_weather_sensor_off,wx_string,sky_cover,cloud_base_ft_agl,sky_cover,cloud_base_ft_agl,sky_cover,cloud_base_ft_agl,sky_cover,cloud_base_ft_agl,flight_category,three_hr_pressure_tendency_mb,maxT_c,minT_c,maxT24hr_c,minT24hr_c,precip_in,pcp3hr_in,pcp6hr_in,pcp24hr_in,snow_in,vert_vis_ft,metar_type,elevation_m
LFMT 151300Z AUTO 07007KT 9999 FEW025 16/12 Q1012 BECMG BKN010,,,,,,,,,,,,,,,,,,,,,,,,,,,,

--- RAW infos --------------------------------------------
LFMT 151300Z AUTO 07007KT 9999 FEW025 16/12 Q1012 BECMG BKN010

--- Details ----------------------------------------------
Aéroport     : LFMT
Heure Z      : 151300Z
Observation  : AUTO
:wink:
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

Re: Récupération de données évolutives

Message par PhM »

Ha oui, tu as poussé le développement à fond !
C'est cool, je vois que tu t'es pris au jeu également...
Re-merci pour tout ce savoir mis en commun !

La grande découverte pour moi est, qu'en fait, il est possible d'aller sur n'importe quel site de n'importe quel domaine et de "piocher" ce que l'on veut !

Juste une chose, dans un précédent message, tu as écrit : mais hélas leur site est en HTTPS, pourquoi cette remarque ?

Philippe
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Récupération de données évolutives

Message par Marc56 »

Ma première version ne fonctionnait pas, j'ai cru que c'était à cause du https, mais non.

PS. Dans tous les cas de figures, on préfère donc ce système (webservices) plutôt que de charger des pages entières car il permet de "demander" au serveur un minimum de données (voir le guides des bonnes pratiques), donc de libérer la charge serveur et la bande passante au maximum.

Oui, les METARs m'intéressent mais c'est juste pour X-Plane :P
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

Re: Récupération de données évolutives

Message par PhM »

Et moi, c'est pour P3D entre autres... car je fabrique un altimètre avec un Arduino (sur base Adafruit BMP388) et pour calculer l’attitude avec la meilleure précision, il faut connaitre le QNH le plus proche du lieu de la mesure.
En attendant mieux (FS2020)...
Bonne fin de journée !
Avatar de l’utilisateur
Naheulf
Messages : 193
Inscription : dim. 10/mars/2013 22:22
Localisation : France

Re: Récupération de données évolutives

Message par Naheulf »

Question à deux Pascal :
Si tu pars toujours du même endroit, tu ne peux pas te baser sur l'altitude topographique du lieu et la pression au sol au moment du décollage ?
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

Re: Récupération de données évolutives

Message par PhM »

Je ne suis pas certain de bien comprendre la question ?
Lorsque l'on décolle d'un lieu, c'est la pression évolutive de l'aéroport (relevée toutes les 1/2 heure) qui est prise en compte (QNH). En occurrence, à Montpellier (LFMT), l'aéroport est, en plus, pratiquement au niveau de la mer (1m).
Ai-je répondu à la question ?
Avatar de l’utilisateur
Naheulf
Messages : 193
Inscription : dim. 10/mars/2013 22:22
Localisation : France

Re: Récupération de données évolutives

Message par Naheulf »

Visiblement je me suis mal exprimé donc je reformule :

Connaissant l'altitude réelle de ton appareil lorsqu'il est sur le tarmac (1m pour l'aéroport de Montpellier)
Connaissant la pression actuellement mesurée par ton capteur (BMP388)

Ne peut-tu pas calculer le QNH en local ? (Même si le calcul ne serais valable qu'au décollage : la pression atmosphérique au sol, donc le QNH, étant susceptible de varier pendant la durée du vol.)
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

Re: Récupération de données évolutives

Message par PhM »

Ok, je comprends mieux.
En fait, l’altimètre que je fais n'a rien à voir avec l'aviation !
Son utilisation, dans mon secteur géographique et pour le programme injecté dans l'Arduino a besoin, pour plus de précision du QNH le plus proche !
Voir ici et pages suivantes pour comprendre : https://learn.adafruit.com/adafruit-bmp388/overview
Répondre