使用 Weather API 获取天气数据
感谢您的辛勤工作。
我是系统开发室的松山。
这次,我想使用“Weather API”创建一个天气检查应用程序。
以前我认为有必要从日本气象厅购买天气信息,但
现在似乎有一个API可以免费使用,所以我就使用它。
顺便说一句,日本气象厅似乎也在免费分发天气数据,但
由于它基本上是气象数据(雨、风、温度等),因此它似乎与天气数据不同。
(已发布过往天气信息)
要求
① 使用 Rakuten Rapid API 的开放天气地图
② 在之前创建的基础上重复使用 HTTP 通信
③ 从 GPS 位置信息获取附近城市的天气数据
④ 在屏幕上显示纬度、经度、城市名称和天气图标 显示
* Created with Unity 2019.4 .11f1
乐天快速API
Rakuten Rapid API 是一项允许您使用和开发各种功能的 API 的服务。
虽然需要注册帐户,但有很多功能可以免费使用,因此您可以尝试各种功能。
乐天快速API
打开天气地图
使用 Rakuten Rapid API 中的开放天气地图获取天气数据。
打开天气地图
有多个 API,但如果您想获取当前天气,可以使用当前天气数据 API。
您可以在浏览器上进行测试,因此最好在调整参数的同时进行尝试。
请注意,即使在测试中,它也会被计入调用次数中。 (每月免费500次)
作为API请求信息,需要以下信息。
・请求标头(固定)
request.AddHeader("x-rapidapi-host", "community-open-weather-map.p.rapidapi.com"); // 主机地址 request.AddHeader("x-rapidapi-key", "xxxxxxxxxxxxxxxxx"); // 为每个账户颁发的API密钥
・请求参数
q:城市ID(*必填)
即使没有其他可选参数,似乎也没有问题。
您可以
在此处您的城市 ID 您可以获得注册城市的天气数据。
HTTP通讯
按照上述要求,我们将按照以往创建的流程进行实施。
点击此处查看往期文章
・ApiBase.cs
・CoroutineHandler.cs
・SigletonMonoBehaviour.cs
・Network.cs
・ApiSample.cs
复制源关于此区域
添加/调整功能以支持 OpenWeatherMap。
1. 对应GET方法
为了支持 GET 方法,通过将 JSON 中传递的请求参数连接到 URL 将其转换为字符串。
虽然比较试探,但还是以下面的形式实现。
私有字符串 convGetParam(string json) { string jsonTrim = json.Trim('{', '}'); jsonTrim = jsonTrim.Replace("\"", ""); string[] jsonArry = jsonTrim.Split(', '); string bool isFirst = true (var data in jsonArry) { if (!data.Contains(":")) if (!isFirst) { retStr += "&"; } else { isFirst = false; } string[] paramAry = data.Split(':'); retStr += paramAry[0] + "=" + paramAry[1] }
2.设置请求头
这里,如上所述,设置主机地址和API密钥。
*数值显示在 OpenWeatherMap 屏幕上
3.定义HTTP请求和响应参数
在Script/Api下创建一个用于获取天气数据的类。
这次它是使用 WeatherApi.cs 创建的。
■ 请求
请求只是城市名称。
[可序列化] public struct Request { public string q }
■回应
回应有点长,不过会这样展开。
实际上,您所需要的只是 Weather 结构,但为了以防万一,我可以获取它。
[可序列化] 公共结构坐标 { 公共浮点 lat } [可序列化] 公共结构天气 { 公共 int 公共字符串主要; } [可序列化] 公共浮动温度; ; 公共浮动 temp_min; 公共 int 湿度; } [Serialized] public struct Wind { public float speed; } [Serialized] public struct Rain { ; // 1h 不能用作元素名称 } [Serialized] public struct Clouds { public int all; } [Serialized] public struct Sys { public int id; public int sunrise; ; } [可序列化] public struct Response { public Coord coord;<Weather>天气; // 公共字符串基; // 基不能用作元素名称 public Main main; public Rain rain; public Sys sys;公共 int id; 公共字符串名称; }
*有一些不能使用的名字已经被注释掉了,但是这次我们不用担心它们,因为这些信息不会被使用^^;
目前来看,我认为沟通相关的准备工作是可以的。
使用全球定位系统
对于 GPS,我们还将参考我们过去创建的代码编写必要的代码。
点击此处查看往期文章
这次需要的GPS处理是:
输入.location.Start(); 输入.compass.enabled = true;
首先执行此操作,
Input.location.lastData.longitude; // 经度 Input.location.lastData.latitude; // 纬度
只需使用lastData 即可获取纬度和经度。
* 严格来说,我们还会判断是否可以使用GPS。
Input.location.isEnabledByUser; // 是否允许使用 GPS Input.location.status; // 运行状态下可以使用
另外,不要忘记在 ProjectSettings 中填写位置使用说明。
天气数据
如上所述,为了获取天气数据,需要指定注册城市,因此
为了验证目的,我们从47个都道府县中提取了1个城市数据,并
从GPS获取的经纬度中选择了最近的一个来实现。获取城市天气数据的流程。
首先,创建城市数据。
作为城市数据,在以下结构中定义都道府县名称、城市名称、城市名称(用于 API)、纬度和经度。
private struct Data { public string prefecture; // 城市名称 public string name; // 经度 public double lat;
将其转换为这样的数据。
静态私有列表<Data>数据=新列表<Data>{ 新数据 { 县 = "北海道", city = "札幌市", name = "札幌", lon = 141.346939, lat = 43.064171 }, 新数据 { prefecture = "青森县", city = "青森市", name =“青森”,lon = 140.740005,lat = 40.82444},新数据{县=“岩手县”,城市=“盛冈市”,名称=“盛冈”,lon = 141.152496,lat = 39.703609},新数据{县=“宫城县”,城市=“仙台市”,名称=“仙台”,lon=140.871933,纬度=38.26889},新数据{县=“秋田县”,城市=“秋田市”,名称=“秋田” , lon = 140.116669, lat = 39.716671 }, 新数据 { prefecture = “山形县”, city = “山形市”, name = “山形”, lon = 139.821671, lat = 38.721668 }, 新数据 { prefecture = “福岛县” ", city = "福岛市", name = "福岛", lon = 140.383331, lat = 37.400002 }, // // 省略 // 新数据 { prefecture = "鹿儿岛县", city = "鹿儿岛市", name = "鹿儿岛", lon = 130.558136, lat = 31.560181 }, new Data { prefecture = "冲绳县", city = "那霸市", name = "那霸", lon = 127.681107, lat = 26.2125 } };
接下来,根据您当前的位置(纬度和经度)搜索最近的城市数据。
如果有这样的功能就好了?
static public Info NearbyCity(double lon, double lat) { Info info = new Info(); float dist = 9999f; foreach(Data dat in datas) { double z = (dat.lat - lat) * Lat2Km;是南 double x = (dat.lon - lon) * Lat2Km; // +x 是东 Vector3 v = new Vector3((float)x, 0, (float)z); if(v.magnitude < dist) { dist = v.magnitude; info.city = dat.prefecture + dat.city; info.name = dat.name;
返回值结构体中包含用于显示的城市名称和用于API的城市名称。
公共结构信息 { 公共字符串城市 公共字符串名称; }
在屏幕上显示纬度、经度、城市名称和天气图标
在 Unity 中配置屏幕。
大概就是这个图
剩下要做的就是显示使用 GPS 和 API 获取的信息,这就是成品。
您可以在此处查看天气 ID 和天气图标等信息。
天气数据详情
概括
虽然有点仓促,但我认为这是一个大致显示天气的示例。
天气数据的获取本身可以通过单个 API 来实现,但注册城市和当前位置之间的链接(数据转换)可能会有点麻烦。
这次我也将示例项目上传到 GitHub。
我希望这会对您有所帮助。
统一示例
Rakuten Rapid Api 还有其他功能,所以我想下次使用它。
最后
我开设了我所属的系统开发服务网站“SEKARAKU Lab”。
Beyond是从服务器设计搭建到运营的一站式服务,所以如果您在服务器端开发方面遇到任何问题,请随时联系我们。
SEKARAKU 实验室: [https://sekarakulab.beyondjapan.com/](https://sekarakulab.beyondjapan.com/)
好了,现在就这些了。