使用天气 API 获取天气数据

今天工作完成得很好。
我是系统开发部的松山。
这次我想尝试使用“天气API”创建一个天气查询应用程序。
我以前认为必须从日本气象厅购买天气信息,但
现在似乎有免费的API可用,所以我将使用其中一个。
顺便一提,日本气象厅也免费提供天气数据,但
似乎与天气数据有所不同,因为它基本上只是天气信息(降雨、风力、温度等)。
(他们确实提供过过去的天气数据。)
要求
① 使用乐天快速 API 的 Open Weather Map
② 基于先前创建的代码重用 HTTP 通信
③ 根据 GPS 位置信息获取附近城市的天气数据
④ 在屏幕上显示纬度、经度、城市名称和天气图标
*使用 Unity 2019.4.11f1 创建
乐天快速 API
Rakuten Rapid API 是一项允许您使用和开发各种功能的 API 的服务。
虽然需要注册帐户,但许多功能都是免费的,因此您可以尝试各种选项。Rakuten
Rapid API
打开天气地图
我们将使用 Rakuten Rapid API 中提供的 Open Weather Map 来检索天气数据
。
虽然有多种 API 可用,但如果您只想获取当前天气信息,那么“当前天气数据 API”似乎就足够了。
您可以在浏览器中进行测试,因此建议您尝试调整参数。
请注意,测试通话次数也计入总通话次数。(每月 500 次免费通话。)
以下信息似乎是 API 请求所必需的:
• 请求头(固定)
request.AddHeader("x-rapidapi-host", "community-open-weather-map.p.rapidapi.com"); // 主机地址 request.AddHeader("x-rapidapi-key", "xxxxxxxxxxxxxxxxxx"); // 每个账户颁发的 API 密钥
- 请求参数
q:城市 ID(*必填)
其他可选参数不是必需的。
您的城市ID 在这里 获取
您还可以获取已注册城市的天气数据。
HTTP 通信
基于以上要求,我们将以先前创建的流程为基础进行实施。
之前的文章可在此处查看。
从 Scripts/Utility 和 Scripts/Api 中复制源代码
:ApiBase.cs
、CoroutineHandler.cs
、SigletonMonoBehaviour.cs
、Network.cs
、ApiSample.cs
等。
添加/调整功能以支持 OpenWeatherMap。
1. 支持 GET 方法
为了支持 GET 方法,以 JSON 格式传递的请求参数会被转换为字符串并连接到 URL 中。
这只是一个非常初步的实现,但大致如下。
private string convGetParam(string json) { string jsonTrim = json.Trim('{', '}'); jsonTrim = jsonTrim.Replace("\"", ""); string[] jsonArry = jsonTrim.Split(','); string retStr = "?"; bool isFirst = true; foreach (var data in jsonArry) { if (!data.Contains(":")) break; if (!isFirst) { retStr += "&"; } else { isFirst = false; } string[] paramAry = data.Split(':'); retStr += paramAry[0] + "=" + paramAry[1]; } return retStr; }
2. 设置请求头
如上所述,您需要在此处设置主机地址和API密钥。
*这些值将显示在OpenWeatherMap屏幕上。
3. 定义 HTTP 请求和响应参数
在 Script/Api 目录下,创建一个用于检索天气数据的类。
在本例中,我们将其创建为 WeatherApi.cs。
■
申请中只需包含城市名称。
[Serializable] public struct Request { public string q; }
■ 回复
回复内容有点长,但展开后是这样的。
实际上,仅天气结构就足够了,但我为了以防万一,还是把所有信息都整理出来了。
[Serializable] public struct Coord { public float lon; public float lat; } [Serializable] public struct Weather { public int id; public string main; public string description; public string icon; } [Serializable] public struct Main { public float temp; public float fells_like; public float temp_min; public float temp_max; public int pressure; public int humidity; } [Serializable] public struct Clouds { public int all; } [Serializable] public struct Sys { public int type; public int id; public string country; public int sunrise; public int sunset; } [Serializable] public struct Response { public Coord coord; public List<Weather> weather; // public string base; // base 不能是元素名称 public Main main; public int visibility; public Wind wind; public Rain rain; public Clouds clouds; public int dt; public Sys sys; public int timezone; public int id; public string name; public int cod; }
*有些名字不能使用,所以被注释掉了,但这次我们不需要这些信息,所以不用担心^^;
目前来看,所有与沟通相关的事宜都已准备就绪。
使用GPS
对于GPS部分,我将参考我过去编写的代码来编写必要的代码。(
之前的文章在这里)
本次所需的GPS处理如下:
输入.location.Start(); 输入.compass.enabled = true;
先做这件事,
Input.location.lastData.longitude; // 经度 Input.location.lastData.latitude; // 纬度
`lastData` 方法仅用于获取纬度和经度。
*严格来说,它还会判断 GPS 是否可用。*
Input.location.isEnabledByUser; // 允许使用 GPS Input.location.status; // 如果处于运行状态则可以使用
另外,别忘了在项目设置中填写位置用途描述。

天气数据
如上所述,获取气象数据需要指定已注册的城市。因此,
为了验证数据的真实性,我们将从47个都道府县中抽取一个城市的数据,并
实施一个基于GPS获取的经纬度信息,检索距离该城市最近的城市的气象数据的过程。
首先,我们创建城市数据。
城市数据将包括地级市名称、城市名称、城市名称(用于 API)、纬度和经度,其结构如下。
private struct Data { public string prefecture; // 府名称 public string city; // 城市名称 public string name; // 传递给 API 的城市名称 public double lon; // 经度 public double lat; // 纬度 }
数据格式如下:
静态私有列表<Data>datas = new List<Data> { new Data { prefecture = "北海道", city = "札幌", name = "札幌", lon = 141.346939, lat = 43.064171 }, new Data { prefecture = "青森县", city = "青森市", name = "青森", lon = 140.740005, lat = 40.82444 }, new Data { prefecture = "岩手县", city = "盛冈市", name = "盛冈", lon = 141.152496, lat = 39.703609 }, new Data { prefecture = "宫城县", city = "仙台市", name = "仙台", lon = 140.871933, lat = 38.26889 }, new Data { prefecture = "秋田县"县,城市 = "秋田市", 名称 = "秋田", 经度 = 140.116669,纬度 = 39.716671 }, new Data { 县 = "山形县", 城市 = "山形市", 名称 = "山形", 经度 = 139.821671,纬度 = 38.721668 }, new Data { 县 = "福岛县", 城市 = "福岛市", 名称 = "福岛", 经度 = 140.383331,纬度 = 37.400002 }, // // 省略 // new Data { 县 = "鹿儿岛县", 城市 = "鹿儿岛市", 名称 = "鹿儿岛", 经度 = 130.558136,纬度 = 31.560181 }, new Data { 县 = "冲绳县", 城市 = " "那霸市", 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; // -z 表示南向 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; } } return info; }
返回的结构体将包含用于显示的省/市名称和用于 API 的城市名称。
public struct Info { public string city; public string name; }
屏幕上显示纬度、经度、城市名称和天气图标
我们将使用 Unity 配置屏幕。
以下是大致思路。

剩下的工作就是显示通过 GPS 和 API 获取的信息,这就是最终产品。

您可以在这里找到天气 ID 和其他信息,以及天气图标。
天气数据详情
概括
这是一个简要概述,但我认为它提供了一个显示天气的基本示例。
虽然获取天气数据本身可以通过单个 API 实现,但将已注册的城市与当前位置关联(转换)则比较耗时。我
已经将示例项目上传到 GitHub。
希望它能有所帮助。Unity
示例
乐天 Rapid API 还有其他功能,所以我想在其他场合尝试使用它。
最后
我已推出“SEKARAKU Lab”,这是我所属系统开发公司的服务网站。Beyond
提供从服务器设计、构建到运维的一站式服务,如果您在服务器端开发方面遇到任何问题,欢迎随时联系我们。SEKARAKU
Lab:[https://sekarakulab.beyondjapan.com/](https://sekarakulab.beyondjapan.com/)
好了,今天就到这里。
0
