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

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

时间:2024-10-12 09:35:17浏览次数:1  
标签:经纬度 IP 天气 weather res NET httpClient GMT

  创建一个.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】内回复“天气查询”即可获取源码地址。

以上就是本文章全部内容,如果有帮助,欢迎点赞、在看、转发分享或评论,谢谢大佬们捧场~

 

标签:经纬度,IP,天气,weather,res,NET,httpClient,GMT
From: https://www.cnblogs.com/weskynet/p/18459831

相关文章

  • 南沙C++信奥赛陈老师解一本通题 1939:【07NOIP普及组】纪念品分组
    ​ 【题目描述】元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格之和不能超过一个给定的整数。为了保证在尽量短的时间内发完......
  • iptables配置网络防火墙
    文章目录基本链配置动作常用命令基本链链是数据包传播的途径,每条链对应多条规则。数据包进入服务器需要经过多道关卡,以下是三条应用在“主机防火墙”中的链。INPUT:入口流量OUTPUT:出口流量FORWARD:转发流量配置动作配置防火墙规则时,对于指定的数据包,我们通常可以......
  • JavaScript-条件运算符
    条件运算符条件运算符主要是通过if和问号(?)实现。if语句if语句后面小括号内是判断条件,之后大括号内是在判断条件为真的情况下执行的语句内容。if后面可以接着跟elseif,也可以跟else,但是else必须放在最后,即所有的if和elseif都执行完了之后才能是else。注意在多个ifelse判断的语句......
  • HI6338 (DIP-8内置75W方案)
    Hi6338combinesadedicatedcurrentmodePWMcontrollerwithintegratedhigh voltagepowerMOSFET.Vcclowstartupcurrentandlowoperatingcurrentcontributeto areliablepoweronstartupdesignwithHi6338.theICoperatesinExtended‘burst mode’......
  • 10.11日noip多校联考总结
    10.11日noip多校联考总结T1看到感觉像是一个很玄学的题目,在考场上推了大概一个多小时,又写了大概半个小时,终于调出来了。谨记:三分取mid需要进行浮点数运算。对于每一行和每一列定义两个数组来记录要加多少,因为我们只需要知道其中任意一个数就可以推出所有的数,那么考虑枚举x0,来......
  • Javascript笔试题目(一)
    1.JS查找文章中出现频率最高的单词?要在JavaScript中查找文章中出现频率最高的单词,你可以按照以下步骤进行操作:将文章转换为小写:这可以确保单词的比较是大小写不敏感的。移除标点符号:标点符号会干扰单词的计数。将文章拆分成单词:可以使用空格或其他分隔符来拆分。统计每个单......
  • 在Kubernetes中实现灰度发布(Canary Release)是一种有效的策略,它允许逐步将新版本的应用
    在Kubernetes中实现灰度发布(CanaryRelease)是一种有效的策略,它允许逐步将新版本的应用推送给部分用户群体,以收集反馈并监控新版本的表现。这种方法可以显著降低新版本上线的风险,并在问题发生时快速回滚。灰度发布通常比滚动更新(RollingUpdate)提供更细粒度的控制,因为它可以精确......
  • 多校A层冲刺NOIP2024模拟赛05
    A.好数(number)很容易想到\(n^3\)枚举两个,看第三个是否出现,扩展一下,枚举一个,看剩下需要的和是否出现过,提前处理出两两的和和最早能合出这个数的位置,复杂的\(O(n^2)\)点击查看代码#include<bits/stdc++.h>constintmaxn=5000+10;usingnamespacestd;intn,a[maxn],cnt,......
  • Communication-Efficient Learning of Deep Networks from Decentralized Data论文阅
    联邦学习开山之作Communication-EfficientLearningofDeepNetworksfromDecentralizedDataabstractIntroductionTheFederatedAveragingAlgorithmExperimentalResultsConclusionsandFutureWorkCommunication-EfficientLearningofDeepNetworksfromDec......
  • 『模拟赛』多校A层冲刺NOIP2024模拟赛05
    Rank烂。A.好数(number)签,唐,没签上。考虑之前几次类似的题方法都是选\(k-1\)的方案存起来以使总复杂度除以一个\(n\),故考虑记共\(n^2\)个两两组合之和,枚举当前点\(i\)前面的点,找是否有值为它们的差的组合,复杂度\(\mathcal{O(n^2)}\),用map记再挂个\(\logn\)。赛......