使用天气 API 获取天气数据

感谢您的辛勤工作。
我是系统开发室的松山。
这次,我打算使用“天气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 获取天气数据。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 请求和响应参数
在脚本/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 实验室: [https://sekarakulab.beyondjapan.com/](https://sekarakulab.beyondjapan.com/)
好了,现在就这些了。
0