IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Codes sources à télécharger Delphi Discussion :

Récupération et affichage de la météo actuelle via l’API Open-Meteo


Sujet :

Codes sources à télécharger Delphi

  1. #1
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 451
    Par défaut Récupération et affichage de la météo actuelle via l’API Open-Meteo
    API météo d’Open-Meteo

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    implementation
     
    uses
      // Modules pour la gestion des dates, JSON, HTTP et l'encodage d'URL
      System.DateUtils, System.JSON,
      System.Net.HttpClient, System.NetEncoding;
     
    {$R *.dfm}
    Convertit un code météo numérique en description textuelle en français
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    function WeatherCodeToString(Code: Integer): string;
    begin
      case Code of
        0:  Result := 'Ciel dégagé';
        1:  Result := 'Principalement dégagé';
        2:  Result := 'Partiellement nuageux';
        3:  Result := 'Couvert';
        45: Result := 'Brouillard';
        48: Result := 'Brouillard givrant';
        51: Result := 'Bruine légère';
        53: Result := 'Bruine modérée';
        55: Result := 'Bruine dense';
        61: Result := 'Pluie légère';
        63: Result := 'Pluie modérée';
        65: Result := 'Forte pluie';
        80: Result := 'Averses légères';
        81: Result := 'Averses modérées';
        82: Result := 'Averses violentes';
      else
        Result := 'Code inconnu';
      end;
    end;
    Recherche l'index de l'heure la plus proche de l'heure courante fournie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    function FindBestTimeIndex(const Times: TJSONArray; const Curr: string): Integer;
    var
      CurrDT, DT, Diff, BestDiff: TDateTime;
      S: string;
      i: Integer;
    begin
      Result := -1;
      CurrDT := ISO8601ToDate(Curr);      // Conversion de la chaîne ISO en TDateTime
      BestDiff := MaxDateTime;
     
      // Parcours du tableau des heures disponibles
      for i := 0 to Times.Count - 1 do
      begin
        S := Times.Items[i].Value;
     
        // Formatage pour compatibilité ISO8601
        if (Length(S) > 0) and (S[Length(S)] = 'Z') then
          SetLength(S, Length(S) - 1);
        S := StringReplace(S, ' ', 'T', [rfReplaceAll]);
     
        // Conversion en date, on saute si échec
        try
          DT := ISO8601ToDate(S);
        except
          Continue;
        end;
     
        // Calcul de l'écart absolu et mise à jour du meilleur indice
        Diff := Abs(DT - CurrDT);
        if Diff < BestDiff then
        begin
          BestDiff := Diff;
          Result := i;
        end;
      end;
    end;
    Procédure principale qui récupère et affiche la météo pour une ville donnée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    procedure WeatherAPI(City: String);
    var
      Http: THTTPClient;
      Resp: IHTTPResponse;
      JsonRoot, JsonCW, JsonHourly: TJSONObject;
      Results, Times, HumArr, PresArr, CloudArr: TJSONArray;
      Lat, Lon: Double;
      FS: TFormatSettings;
      Url, CurrTime: string;
      Index: Integer;
      Humidity, Pressure, CloudCover, WindSpeed: Double;
      WindDir, WCode: Integer;
      Msg: TStringList;
    begin
      Http := THTTPClient.Create;
      try
        // --- Géocodage : obtenir latitude et longitude depuis le nom de la ville ---
        Resp := Http.Get(
          'https://geocoding-api.open-meteo.com/v1/search?name='
          + TNetEncoding.Url.Encode(City) + '&count=1');
        if Resp.StatusCode <> 200 then
          raise Exception.Create('Erreur géocodage : ' + Resp.StatusText);
     
        JsonRoot := TJSONObject.ParseJSONValue(Resp.ContentAsString) as TJSONObject;
        try
          Results := JsonRoot.GetValue<TJSONArray>('results');
          if (Results = nil) or (Results.Count = 0) then
            raise Exception.Create('Ville non trouvée');
          Lat := Results.Items[0].GetValue<Double>('latitude');
          Lon := Results.Items[0].GetValue<Double>('longitude');
        finally
          JsonRoot.Free;
        end;
     
        // --- Construction de l'URL pour l'API météo ---
        FS := TFormatSettings.Create;
        FS.DecimalSeparator := '.';
        Url := Format(
          'https://api.open-meteo.com/v1/forecast?latitude=%.4f&longitude=%.4f'
          + '&current_weather=true'
          + '&hourly=relativehumidity_2m,pressure_msl,cloudcover'
          + '&timezone=auto',
          [Lat, Lon], FS);
     
        // --- Requête pour les données météo ---
        Resp := Http.Get(Url);
        if Resp.StatusCode <> 200 then
          raise Exception.Create('Erreur météo : ' + Resp.StatusText);
     
        JsonRoot := TJSONObject.ParseJSONValue(Resp.ContentAsString) as TJSONObject;
        try
          // Extraction des objets JSON
          JsonCW := JsonRoot.GetValue<TJSONObject>('current_weather');
          JsonHourly := JsonRoot.Values['hourly'] as TJSONObject;
     
          Times    := JsonHourly.Values['time'] as TJSONArray;
          HumArr   := JsonHourly.Values['relativehumidity_2m'] as TJSONArray;
          PresArr  := JsonHourly.Values['pressure_msl'] as TJSONArray;
          CloudArr := JsonHourly.Values['cloudcover'] as TJSONArray;
     
          CurrTime := JsonCW.GetValue<string>('time');
     
          // Trouver l'index d'heure le plus proche de l'heure courante
          Index := FindBestTimeIndex(Times, CurrTime);
          if Index < 0 then
            raise Exception.CreateFmt(
              'Aucun créneau horaire valide trouvé pour %s', [CurrTime]);
     
          // Lire les valeurs correspondantes dans les tableaux
          Humidity   := (HumArr.Items[Index] as TJSONNumber).AsDouble;
          Pressure   := (PresArr.Items[Index] as TJSONNumber).AsDouble;
          CloudCover := (CloudArr.Items[Index] as TJSONNumber).AsDouble;
          WindSpeed  := JsonCW.GetValue<Double>('windspeed');
          WindDir    := JsonCW.GetValue<Integer>('winddirection');
          WCode      := JsonCW.GetValue<Integer>('weathercode');
     
          // --- Préparation du message à afficher ---
          Msg := TStringList.Create;
          try
            Msg.Add(Format(
              'Température       : %.1f °C',
              [JsonCW.GetValue<Double>('temperature')]));
            Msg.Add(Format('Humidité          : %.0f %%', [Humidity]));
            Msg.Add(Format('Pression          : %.1f hPa', [Pressure]));
            Msg.Add(Format('Nébulosité        : %.0f %%', [CloudCover]));
            Msg.Add(Format('Vent              : %.1f km/h', [WindSpeed]));
            Msg.Add(Format('Direction du vent : %d°', [WindDir]));
            Msg.Add('Conditions        : ' + WeatherCodeToString(WCode));
            Msg.Add('Dernière maj      : ' + CurrTime);
     
            // Affichage de la météo dans une boîte de dialogue
            ShowMessage(Msg.Text);
          finally
            Msg.Free;
          end;
     
        finally
          JsonRoot.Free;
        end;
     
      finally
        Http.Free;
      end;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      WeatherAPI('Paris');
    end;
    Nom : Capture d'écran 2025-07-05 182733.png
Affichages : 133
Taille : 15,7 Ko
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.
    Ce n’est pas un bogue - c’est une fonctionnalité non documentée.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 59
    Par défaut
    merci comme j'avais cette function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    function DirectionToCardinal(Degrees: Double): string;
    const
      Directions: array[0..15] of string = (
        'N', 'NNE', 'NE', 'ENE', 'E', 'ESE', 'SE', 'SSE',
        'S', 'SSO', 'SO', 'OSO', 'O', 'ONO', 'NO', 'NNO'
      );
    var
      Index: Integer;
    begin
      // Normaliser entre 0 et 360
      Degrees := Degrees - 360 * Floor(Degrees / 360);
      if Degrees < 0 then
        Degrees := Degrees + 360;
     
      // Index = position dans le tableau des directions (chaque tranche = 22.5°)
      Index := Round(Degrees / 22.5) mod 16;
     
      Result := Directions[Index];
    end;
    je l'ai ajouté ça me parle un peut plus que les °
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Msg.Add(Format('Direction du vent : %d°' + ' (' + DirectionToCardinal(WindDir) + ')', [WindDir]));

  3. #3
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 114
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 114
    Par défaut
    Bonjour,

    dommage, il y a un truc très moche, c'est ça :
    Nom : string_moche.png
Affichages : 103
Taille : 1,4 Ko

    Au plus simple, 2025-07-05 18:15 serait mieux, et quand on écrit en français, le top serait : 05-07-2025 18:15. C'est possible ?
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  4. #4
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 451
    Par défaut
    Bonjour Jipété,

    Citation Envoyé par Jipété Voir le message
    Bonjour,

    dommage, il y a un truc très moche, c'est ça :
    Nom : string_moche.png
Affichages : 103
Taille : 1,4 Ko

    Au plus simple, 2025-07-05 18:15 serait mieux, et quand on écrit en français, le top serait : 05-07-2025 18:15. C'est possible ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    implementation
     
    uses DateUtils;
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      IsoDateStr: string;
    begin
      IsoDateStr := '2025-07-05T18:15';
      // 05/07/2025 18:15:00
      ShowMessage(DateTimeToStr(ISO8601ToDate(IsoDateStr)));
    end;
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    implementation
     
    uses DateUtils;
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      IsoDateStr: string;
      DateMAJ: TDateTime;
    begin
      IsoDateStr := '2025-07-05T18:15';
      try
        DateMAJ := ISO8601ToDate(IsoDateStr);
        // 05/07/2025 18:15
        ShowMessage('Dernière maj : ' + FormatDateTime('dd/mm/yyyy hh:nn', DateMAJ));
      except
        on E: Exception do
          ShowMessage('Erreur de conversion : ' + E.Message);
      end;
    end;
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.
    Ce n’est pas un bogue - c’est une fonctionnalité non documentée.

  5. #5
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 114
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 114
    Par défaut
    Yep !

    Merci infiniment, je n'aurais pas eu l'idée d'aller trainer dans ces recoins.

    Je n'ai pas testé, je te fais confiance, et il fait trop chaud, tellement trop chaud...

    Merci encore,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/05/2008, 20h56
  2. Réponses: 2
    Dernier message: 03/04/2007, 11h23
  3. affichage de la date actuelle
    Par Gary dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 04/09/2006, 23h56
  4. [VC++] Affichage de l'heure actuelle.
    Par ksoft dans le forum Visual C++
    Réponses: 4
    Dernier message: 16/08/2006, 12h04
  5. Réponses: 4
    Dernier message: 25/05/2006, 17h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo