伤心客 发表于 2024-10-12 08:09:13

.NET程序获取当前IP经纬度,并通过经纬度实现天气查询功能

 创建一个.net 8的webapi项目备用https://img2024.cnblogs.com/blog/1995789/202410/1995789-20241012093454941-1723716297.png 编辑一个实体类,该实体类用于存储获取ip地址的经纬度数据利用https://img2024.cnblogs.com/blog/1995789/202410/1995789-20241012093454937-1602504168.png 继承编辑三个类,用来存储对应经纬度的详细天气数据包:https://img2024.cnblogs.com/blog/1995789/202410/1995789-20241012093455121-1977077810.png 改造默认的天气控制器,内里写成我们自己的。例如先写个获取IP的经纬度坐标的请求https://img2024.cnblogs.com/blog/1995789/202410/1995789-20241012093455109-1093972408.png 运行一下,看下现在的效果,可以看到获取到ip的详细信息,包括运营商、经纬度坐标等。https://img2024.cnblogs.com/blog/1995789/202410/1995789-20241012093454946-308540866.png 继承拓展内容,根据经纬度获取天气数据https://img2024.cnblogs.com/blog/1995789/202410/1995789-20241012093454990-609331691.png 运行,可以看到一些天气信息https://img2024.cnblogs.com/blog/1995789/202410/1995789-20241012093454816-550338661.png 以下是返回的详细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】内回复“天气查询”即可获取源码地址。
https://img2024.cnblogs.com/blog/1995789/202410/1995789-20241012093308124-732397127.jpg
以上就是本文章全部内容,如果有帮助,欢迎点赞、在看、转发分享或评论,谢谢大佬们捧场~
 
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: .NET程序获取当前IP经纬度,并通过经纬度实现天气查询功能