[Résolu] Récupération de données évolutives
[Résolu] Récupération de données évolutives
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
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.
Re: Récupération de données évolutives
Bonjour,
Soit tu télécharge toute la page web avec ReceiveHTTPFile() puis tu extrais le code entre les balises
Quelque chose comme ça:
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)

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>
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$
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)

Re: Récupération de données évolutives
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
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
Re: Récupération de données évolutives
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)
Un fois que tu auras mis au point un retour en CSV, tu pourras extraire les infos facilement avec StringField()

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

Re: Récupération de données évolutives
La deuxième méthode est un petit peu plus rapide car le texte générer en XML est plus court :
Encore merci Marc56 pour le coup de main...
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$
Re: Récupération de données évolutives
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))
Ce qui donne:

(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
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

Re: Récupération de données évolutives
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
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
Re: Récupération de données évolutives
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
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

Re: Récupération de données évolutives
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 !
En attendant mieux (FS2020)...
Bonne fin de journée !
Re: Récupération de données évolutives
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 ?
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 ?
Re: Récupération de données évolutives
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 ?
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 ?
Re: Récupération de données évolutives
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.)
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.)
Re: Récupération de données évolutives
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
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