使用天气 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票,平均分:0.00/10
10,937
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

松山健翔

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