.NET程式獲取當前IP經緯度,並透過經緯度實現天氣查詢功能

WeskyNet發表於2024-10-12
建立一個.net 8的webapi專案備用
0
編輯一個實體類,該實體類用於儲存獲取ip地址的經緯度資料使用
0
繼續編輯三個類,用來儲存對應經緯度的具體天氣資料包:
0
改造預設的天氣控制器,裡面寫成我們自己的。例如先寫個獲取IP的經緯度座標的請求
0
執行一下,看下現在的效果,可以看到獲取到ip的具體資訊,包括運營商、經緯度座標等。
0
繼續擴充內容,根據經緯度獲取天氣資料
0
執行,可以看到一些天氣資訊
0
以下是返回的具體json報文,供參考:
{
  "latitude": 22.5,
  "longitude": 114,
  "generationtime_ms": 0.05698204040527344,
  "utc_offset_seconds": 0,
  "timezone": "GMT",
  "timezone_abbreviation": "GMT",
  "elevation": 37,
  "current_weather_units": {
    "time": "iso8601",
    "interval": "seconds",
    "temperature": "°C",
    "windspeed": "km/h",
    "winddirection": "°",
    "is_day": "",
    "weathercode": "wmo code"
  },
  "current_weather": {
    "time": "2024-10-11T09:45",
    "interval": 900,
    "temperature": 26.1,
    "windspeed": 6.6,
    "winddirection": 131,
    "is_day": 1,
    "weathercode": 2
  }
}

資料欄位解析
基本資訊
  • latitude: 22.5 - 緯度。表示該地點的緯度位置。
  • longitude: 114 - 經度。表示該地點的經度位置。
  • generationtime_ms: 0.05698204040527344 - 資料生成的時間,單位是毫秒。表示從資料請求到資料生成所用的時間。
  • utc_offset_seconds: 0 - 與 UTC 時間的偏移,單位為秒。這裡為 0 表示該資料是在 GMT 時區下計算的。
  • timezone: "GMT" - 時區,表示為 GMT。
  • timezone_abbreviation: "GMT" - 時區縮寫,這裡也是 GMT。
  • elevation: 37 - 表示該地點的海拔高度為 37 米。
當前天氣單位
current_weather_units 部分用於解釋當前天氣資料中每個欄位的單位。
  • time: "iso8601" - 時間格式遵循 ISO 8601 標準。
  • interval: "seconds" - 時間間隔單位為秒。
  • temperature: "°C" - 溫度單位為攝氏度。
  • windspeed: "km/h" - 風速單位為每小時公里數。
  • winddirection: "°" - 風向單位是角度,以度數表示。
  • is_day: "" - 此欄位沒有單位,僅用來指示是否是白天(通常為 0 或 1)。
  • weathercode: "wmo code" - 表示天氣情況的程式碼,使用 WMO(世界氣象組織)標準程式碼。
當前天氣情況
current_weather 部分提供了實際的天氣資料。
  • time: "2024-10-11T09:45" - 表示觀測的具體時間點,格式為 ISO 8601,即 2024 年 10 月 11 日 09:45。此處我們要換算成自己的東八區時間,要增加8小時,則是下午17點45分。
  • interval: 900 - 表示觀測間隔為 900 秒,即 15 分鐘。
  • temperature: 26.1 - 當前溫度為 26.1°C。
  • windspeed: 6.6 - 當前風速為 6.6 km/h。
  • winddirection: 131 - 當前風向為 131 度。風向用度數表示,0 度表示正北,90 度表示正東,131 度則大致為東南方向。
  • is_day: 1 - 表示當前觀測是在白天,1 代表白天,0 通常代表夜晚。
  • weathercode: 2 - 當前的天氣程式碼為 2,按照 WMO 的天氣程式碼標準,2 通常表示“部分多雲”。
WMO 天氣程式碼詳解
根據 WMO(世界氣象組織)的標準,weathercode 欄位提供了天氣狀況的具體資訊。以下是一些常見的 WMO 天氣程式碼:
  • 0: 晴朗
  • 1: 主要晴朗
  • 2: 部分多雲
  • 3: 多雲
  • 4: 陰天
  • 45: 有霧
  • 48: 有濃霧
  • 51: 輕微毛毛雨
  • 53: 中等毛毛雨
  • 55: 強毛毛雨
  • 61: 輕微陣雨
  • 63: 中等陣雨
  • 65: 強陣雨
  • 71: 輕雪
  • 73: 中雪
  • 75: 強雪
  • 95: 雷陣雨,可能有輕微的降水
  • 99: 雷陣雨,伴有強降水
天氣描述
在當前的資料中,weathercode 為 2,這表示天氣狀況為“部分多雲”。
獲取經緯度和天氣的線上請求程式碼:
LocationInfo locationInfo = null;
using (var httpClient = _httpClientFactory.CreateClient())
{
    httpClient.Timeout = TimeSpan.FromSeconds(100);

    var res = httpClient.GetAsync("http://ip-api.com/json/").GetAwaiter().GetResult();
    res.EnsureSuccessStatusCode();
    var location = res.Content.ReadAsStringAsync().GetAwaiter().GetResult();
    if (!string.IsNullOrEmpty(location))
    {
        locationInfo = JsonConvert.DeserializeObject<LocationInfo>(location);
    }
}
if (locationInfo != null)
{
    using (var httpClient = _httpClientFactory.CreateClient())
    {
        httpClient.Timeout = TimeSpan.FromSeconds(100);

        var res = httpClient.GetAsync($"https://api.open-meteo.com/v1/forecast?latitude={locationInfo.lat}&longitude={locationInfo.lon}&current_weather=true").GetAwaiter().GetResult();
        res.EnsureSuccessStatusCode();
        var weather = res.Content.ReadAsStringAsync().GetAwaiter().GetResult();
        if (!string.IsNullOrEmpty(weather))
        {
            WeatherResponse weatherInfo = JsonConvert.DeserializeObject<WeatherResponse>(weather);
            return Ok(weatherInfo);
        }
    }
}

如果需要完整原始碼,可以在公眾號【Dotnet Dancer】內回覆“天氣查詢”即可獲取原始碼地址。

以上就是本文章全部內容,如果有幫助,歡迎點贊、在看、轉發分享或評論,謝謝大佬們捧場~

相關文章