使用天气 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
0
11,210
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

松山健翔

我曾在一家游戏开发公司工作多年,负责编程和项目管理等工作。
2019年,我加入Beyond Inc.,在横滨办公室工作。
我主要负责服务器端开发的项目管理(偶尔也参与编程)。
我的爱好是公路自行车赛和观看赛马。