开发者社区> CoderZ1010> 正文

Unity 接入高德开放API - 天气查询

简介: Unity 接入高德开放API - 天气查询
+关注继续查看

接入接口前首先申请应用密钥Key,登录高德开发者开放平台,创建应用,获取密钥。

imageimage.gif

天气查询API服务地址:https://restapi.amap.com/v3/weather/weatherInfo?parameters,需以Get请求方式调用,parameters代表所有参数,参数以&进行分隔。

imageimage.gif

前两个参数为必填参数,extensions传入base代表实况天气,all代表预报天气,定义枚举用以区分:

public enum GetDataType
{
    /// <summary>
    /// 获取实况天气
    /// </summary>
    Lives,
    /// <summary>
    /// 获取预报天气
    /// </summary>
    Forecast
}

image.gif

这里我们以JSON格式解析接口响应数据,所以output传入JSON。最终封装Weather天气类:

using System;
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
[AddComponentMenu("")]
public class Weather : MonoBehaviour
{
    private static Weather instance;
    public static Weather Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new GameObject("[Weather]").AddComponent<Weather>();
                DontDestroyOnLoad(instance);
            }
            return instance;
        }
    }
    //密钥 于高德开发者平台创建应用申请获得
    private const string key = "";
    public enum GetDataType
    {
        /// <summary>
        /// 获取实况天气
        /// </summary>
        Lives,
        /// <summary>
        /// 获取预报天气
        /// </summary>
        Forecast
    }
    /// <summary>
    /// 获取天气数据
    /// </summary>
    /// <param name="city">城市编码</param>
    /// <param name="callback">回调函数</param>
    public void Get(string city, GetDataType type, Action<string> callback)
    {
        StartCoroutine(SendWebRequest(city, type, callback));
    }
    private IEnumerator SendWebRequest(string city, GetDataType type, Action<string> callback)
    {
        //url拼接
        string url = string.Format("https://restapi.amap.com/v3/weather/weatherInfo?key={0}&city={1}&extensions={2}", key, city, type == GetDataType.Lives ? "base" : "all");
        //GET方式调用API服务
        using (UnityWebRequest request = UnityWebRequest.Get(url))
        {
            DateTime beginTime = DateTime.Now;
            yield return request.SendWebRequest();
            DateTime endTime = DateTime.Now;
            if (request.result == UnityWebRequest.Result.Success)
            {
                Debug.Log($"{beginTime} 发起网络请求 于 {endTime} 收到响应:\r\n{request.downloadHandler.text}");
                callback.Invoke(request.downloadHandler.text);
            }
            else
            {
                Debug.Log($"发起网络请求失败:{request.error}");
            }
        }
    }
    private void OnDestroy()
    {
        instance = null;
    }
}

image.gif

调用实况天气数据测试(320115代表南京市江宁区,具体城市区域编码参考城市编码表,于高德开放平台下载):

Weather.Instance.Get("320115", Weather.GetDataType.Lives, data => { });

image.gif

imageimage.gif

调用预测天气数据测试:

Weather.Instance.Get("320115", Weather.GetDataType.Forecast, data => { });

image.gif

imageimage.gif

最终运用接口响应的数据,需要定义响应数据结构,将字符串数据反序列化为我们定义的类,参数说明:

imageimage.gif

using System;
[Serializable]
/// <summary>
/// 天气API响应数据结构
/// </summary>
public class WeatherResponse
{
    /// <summary>
    /// 返回状态 1成功/0失败
    /// </summary>
    public int status;
    /// <summary>
    /// 返回结果总数目
    /// </summary>
    public int count;
    /// <summary>
    /// 返回的状态信息
    /// </summary>
    public string info;
    /// <summary>
    /// 返回状态说明 10000代表正确
    /// </summary>
    public int infoCode;
    /// <summary>
    /// 实况天气数据信息
    /// </summary>
    public WeatherLive[] lives;
    /// <summary>
    /// 预报天气信息数据
    /// </summary>
    public WeatherForecast[] forecast;
}
[Serializable]
/// <summary>
/// 实况天气数据
/// </summary>
public class WeatherLive
{
    /// <summary>
    /// 省份名
    /// </summary>
    public string province;
    /// <summary>
    /// 城市名
    /// </summary>
    public string city;
    /// <summary>
    /// 区域编码
    /// </summary>
    public string adcode;
    /// <summary>
    /// 天气现象(汉字描述)
    /// </summary>
    public string weather;
    /// <summary>
    /// 实时气温 单位:摄氏度
    /// </summary>
    public int temperature;
    /// <summary>
    ///风向描述 
    /// </summary>
    public string winddirection;
    /// <summary>
    /// 风力级别 单位:级
    /// </summary>
    public int windpower;
    /// <summary>
    /// 空气适度
    /// </summary>
    public int humidity;
    /// <summary>
    /// 数据发布时间
    /// </summary>
    public string reporttime;
}
[Serializable]
/// <summary>
/// 预报天气数据
/// </summary>
public class WeatherForecast
{
    /// <summary>
    /// 省份名称
    /// </summary>
    public string province;
    /// <summary>
    /// 城市名称
    /// </summary>
    public string city;
    /// <summary>
    /// 城市编码
    /// </summary>
    public int adcode;
    /// <summary>
    /// 预报发布时间
    /// </summary>
    public string reporttime;
    /// <summary>
    /// 预报数据列表
    /// </summary>
    public CastInfo[] casts;
}
[Serializable]
public class CastInfo
{
    /// <summary>
    /// 日期
    /// </summary>
    public string date;
    /// <summary>
    /// 星期几
    /// </summary>
    public int week;
    /// <summary>
    /// 白天天气现象
    /// </summary>
    public string dayweather;
    /// <summary>
    /// 晚上天气现象
    /// </summary>
    public string nightweather;
    /// <summary>
    /// 白天温度
    /// </summary>
    public int daytemp;
    /// <summary>
    /// 晚上温度
    /// </summary>
    public int nighttemp;
    /// <summary>
    /// 白天风向
    /// </summary>
    public string daywind;
    /// <summary>
    /// 晚上风向
    /// </summary>
    public string nightwind;
    /// <summary>
    /// 白天风力
    /// </summary>
    public int daypower;
    /// <summary>
    /// 晚上风力
    /// </summary>
    public int nightpower;
}

image.gif

使用Unity内置序列化/反序列化工具类JsonUtility将数据反序列化:

Weather.Instance.Get("320115", Weather.GetDataType.Forecast, data =>
{
    WeatherResponse response = JsonUtility.FromJson<WeatherResponse>(data);
    //TODO
});

image.gif

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【unity本站最全系列】unity常用API大全一篇文章足以(万字详解)不信你不收藏
【unity本站最全系列】unity常用API大全一篇文章足以(万字详解)不信你不收藏
17 0
unity常用API基础知识
常用API基础知识
11 0
Zotero翻译插件Zotero PDF Translate无法正常翻,翻译api接入
Zotero翻译插件Zotero PDF Translate无法正常翻,翻译api接入
562 0
Django API 开发:博客系统接入 API(下)
我们的下一个项目是使用 Django REST Framework 功能的博客 API。 它将具有用户,权限,并允许完整的 CRUD(创建-读取-更新-删除)功能。 我们还将探索视图集,路由器和文档。 在本文中,我们将构建博客系统基本的 API 部分。
93 0
Django API 开发:博客系统接入 API(中)
我们的下一个项目是使用 Django REST Framework 功能的博客 API。 它将具有用户,权限,并允许完整的 CRUD(创建-读取-更新-删除)功能。 我们还将探索视图集,路由器和文档。 在本文中,我们将构建博客系统基本的 API 部分。
52 0
Django API 开发:博客系统接入 API(上)
我们的下一个项目是使用 Django REST Framework 功能的博客 API。 它将具有用户,权限,并允许完整的 CRUD(创建-读取-更新-删除)功能。 我们还将探索视图集,路由器和文档。在本文中,我们将构建博客系统基本的 API 部分。
61 0
微软行星云计算planet platform中的高分辨率影像通过API接入Google Earth Engine(GEE)
微软行星云计算planet platform中的高分辨率影像通过API接入Google Earth Engine(GEE)
154 0
明晚直播:钉钉宜搭连接器接入高德API实战演示
《你好!低代码》第二十期明天(10月19日)晚上7点准时直播。本期将带来钉钉宜搭连接器实战演示,记得准时收看哦~
537 0
Java快递单号查询接口怎么接入物流API
Java怎么写物流接口,怎么接入物流接口,如何根据单号查询物流跟踪的详细信息 需求 根据用户输入的订单号,我们的后台识别订单号并根据快递鸟查询快递Api接口,实现自动查询的功能 demo实例 本人自己运行过的Demo —> 点我下载 应用场景(下图) 实现步骤 4.
10171 0
快递鸟单号查询接口电子面单API接入教程
电商平台和小程序都有物流模块,需要查询物流轨迹状态,一家家去对接顺丰、申通、中通、圆通、韵达、百世、邮政、EMS、京东、天天、德邦、安能等快递单号查询接口和电子面单API接口,是非常麻烦的,快递鸟集物流快运快递查询接口580家、电子面单接口30家,向200多万发货商家免费提供一次性对接,这对技术人员来说就变的非常简单,标准的统一接口,后期维护也非常方便,今天我就快递鸟单号查询接口、电子面单批量打印API、预约取件接口、快递查询自动识别接口的接入流程做个全面分享,希望能帮到有需要的朋友。
4477 0
+关注
CoderZ1010
一名Unity开发工程师,SKFramework开源框架作者,CSDN博客专家、Unity领域优质创作者,华为云云享专家,阿里云专家博主,从事于游戏、VR、AR、MR、虚拟仿真、数字孪生、元宇宙等相关领域,个人微信公众号:当代野生程序猿。
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
数据资源的基础设施API总线
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载