【Unity3D日常】獲取天氣信息以及地方位置

一、前言

前段時間有小夥伴問到如何用Unity製作天氣預報,博主也是在網上找了很多資料,發現天氣API接口穩定的確實沒有,除非是天氣官方提供的, 但是我觀察了下,要是合作伙伴纔有開放的可能。

其他的,例如:百度 APIStore、一些同學在其他網站上抓包下來的接口,以及什麼各種收費的 API,都沒有穩定的。
找了很多接口API,發現了一個比較好用的免費天氣API,就分享一下

首先看一下效果圖:
在這裏插入圖片描述

項目源碼鏈接:
https://github.com/764424567/Unity_GetWeatherInfo

二、參考資料

1、unity 獲取地方位置和天氣(簡單版本)
2、免費、穩定的天氣預報API
3、免費天氣API,天氣JSON API,不限次數獲取十五天的天氣預報
4、國內天氣API Java版本請求Demo

三、正文

3.1 獲取地方位置

百度地圖API:

http://api.map.baidu.com/location/ip?ak=bretF4dm6W5gqjQAXuvP0NXW6FeesRXb&coor=bd09ll

返回的Json字符串:

{“address”:“CN|\u6cb3\u5357|\u90d1\u5dde|None|UNICOM|0|0”,“content”:{“address”:"\u6cb3\u5357\u7701\u90d1\u5dde\u5e02",“address_detail”:{“city”:"\u90d1\u5dde\u5e02",“city_code”:268,“district”:"",“province”:"\u6cb3\u5357\u7701",“street”:"",“street_number”:""},“point”:{“x”:“185.64964385”,“y”:“134.75661006”}},“status”:0}

看不懂沒關係,我們去Json解析網站解析一下:
https://tool.oschina.net/codeformat/json
在這裏插入圖片描述
數據說明:
address:數據頭
content:數據內容

  • address:省份城市
  • address_detail:城市名字,編號代碼,省份
  • point:位置座標等數據

status:數據狀態

我們就根據這些數據寫一個數據類來接收這些數據:

#region 返回的城市名字等數據類
public class CityData
{
    public string address;
    public Content content;
    public int status;

}
public class Content
{
    public string address;
    public Address_Detail address_detail;
    public Point point;
}
public class Address_Detail
{
    public string city;
    public int city_code;
    public string district;
    public string province;
    public string street;
    public string street_number;
}

public class Point
{
    public string x;
    public string y;
}
#endregion

這些命名不能改,不然Json解析不了
在這裏插入圖片描述
下面解析Json文件

需要導入這些腳本:
在這裏插入圖片描述
下載鏈接:
https://download.csdn.net/download/q764424567/12403068

代碼:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

#region 返回的城市名字等數據類
public class CityData
{
    public string address;
    public Content content;
    public int status;

}
public class Content
{
    public string address;
    public Address_Detail address_detail;
    public Point point;
}
public class Address_Detail
{
    public string city;
    public int city_code;
    public string district;
    public string province;
    public string street;
    public string street_number;
}

public class Point
{
    public string x;
    public string y;
}
#endregion

public class WeatherTools : MonoBehaviour
{
    /// <summary>
    /// 獲取位置信息
    /// </summary>
    string Posurl = "http://api.map.baidu.com/location/ip?ak=bretF4dm6W5gqjQAXuvP0NXW6FeesRXb&coor=bd09ll";

    void Start()
    {
        //獲取位置
        StartCoroutine(RequestCityName());
    }

    IEnumerator RequestCityName()
    {
        WWW www = new WWW(Posurl);
        yield return www;
        if (string.IsNullOrEmpty(www.error))
        {
            CityData cityData = LitJson.JsonMapper.ToObject<CityData>(www.text);
            Debug.Log(cityData.content.address_detail.city);
        }
    }
}

效果:
在這裏插入圖片描述

3.2 城市名字轉化爲城市代碼編號

因爲接口:

http://t.weather.sojson.com/api/weather/city/city_code

需要用到city_code的值,我們需要將獲取到城市名字轉爲city_code,也就是城市代碼編號,這個編號對應的Json文件是這樣的:
在這裏插入圖片描述
城市對應的city_code的Json文件:
https://download.csdn.net/download/q764424567/12403068

城市名字轉爲city_code

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

#region 返回的城市名字等數據類
public class CityData
{
    public string address;
    public Content content;
    public int status;

}
public class Content
{
    public string address;
    public Address_Detail address_detail;
    public Point point;
}
public class Address_Detail
{
    public string city;
    public int city_code;
    public string district;
    public string province;
    public string street;
    public string street_number;
}

public class Point
{
    public string x;
    public string y;
}
#endregion

#region 城市的city_code編號代碼
public class CityCode
{
    public int id;
    public int pid;
    public string city_code;
    public string city_name;
    public string post_code;
    public string area_code;
    public string ctime;
}
#endregion

public class WeatherTools : MonoBehaviour
{
    public static Dictionary<string, string> PosToId = new Dictionary<string, string>();
    public static bool initDic = false;

    /// <summary>
    /// 獲取位置信息
    /// </summary>
    string Posurl = "http://api.map.baidu.com/location/ip?ak=bretF4dm6W5gqjQAXuvP0NXW6FeesRXb&coor=bd09ll";

    void Start()
    {
        //獲取位置
        StartCoroutine(RequestCityName());
    }

    IEnumerator RequestCityName()
    {
        WWW www = new WWW(Posurl);
        yield return www;
        if (string.IsNullOrEmpty(www.error))
        {
            CityData cityData = LitJson.JsonMapper.ToObject<CityData>(www.text);
            Debug.Log(cityData.content.address_detail.city);
            //獲取city_code
            Debug.Log(GetWeatherId(cityData.content.address_detail.city));
        }
    }

    public static string GetWeatherId(string name)
    {
        string city_code = "";
        if (!initDic)
        {
            initDic = true;
            TextAsset city = Resources.Load<TextAsset>("city");
            List<CityCode> cityCode = LitJson.JsonMapper.ToObject<List<CityCode>>(city.text);
            foreach (CityCode t in cityCode)
            {
                PosToId[t.city_name] = t.city_code;
            }
        }
        for (int i = 1; i < name.Length; i++)
        {
            string tn = name.Substring(0, i);
            if (PosToId.ContainsKey(tn))
            {
                city_code = PosToId[tn];
            }
        }
        return city_code;
    }
}

效果:
在這裏插入圖片描述

3.3 獲取天氣信息

萬事俱備,只欠東風,接下來就看一下如何獲取天氣信息吧:
在這裏插入圖片描述
先分析一下獲取到Json字符串:
獲取天氣的API:

http://t.weather.sojson.com/api/weather/city/city_code

在這裏插入圖片描述
在這裏插入圖片描述
密密麻麻的啥玩意呀,沒關係,我們還可以用Json解析工具解析一下:
https://tool.oschina.net/codeformat/json
在這裏插入圖片描述
沒錯啦,就是我們需要的所有數據,我們根據這些再次製作數據類:

#region 天氣數據類
public class WeatherData
{
    public string message;
    public int status;
    public string date;
    public string time;
    public CityInfo cityInfo;
    public WeathData data;
}
public class CityInfo
{
    public string city;
    public string cityId;
    public string parent;
    public string updateTime;
}
public class WeathData
{
    public string shidu;
    public double pm25;
    public double pm10;
    public string quality;
    public string wendu;
    public string ganmao;
    public WeathDetailData[] forecast;
    public WeathDetailData yesterday;
}
public class WeathDetailData
{
    public string date;
    public string sunrise;
    public string high;
    public string low;
    public string sunset;
    public double aqi;
    public string ymd;
    public string week;
    public string fx;
    public string fl;
    public string type;
    public string notice;
}
#endregion

看不懂建議再看一下Json解析出來的數據格式。。。

》不想看上面過程的,直接複製下面的代碼就行《

代碼:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

#region 返回的城市名字等數據類
public class CityData
{
    public string address;
    public Content content;
    public int status;

}
public class Content
{
    public string address;
    public Address_Detail address_detail;
    public Point point;
}
public class Address_Detail
{
    public string city;
    public int city_code;
    public string district;
    public string province;
    public string street;
    public string street_number;
}

public class Point
{
    public string x;
    public string y;
}
#endregion

#region 城市的city_code編號代碼
public class CityCode
{
    public int id;
    public int pid;
    public string city_code;
    public string city_name;
    public string post_code;
    public string area_code;
    public string ctime;
}
#endregion

#region 天氣數據類
public class WeatherData
{
    public string message;
    public int status;
    public string date;
    public string time;
    public CityInfo cityInfo;
    public WeathData data;
}
public class CityInfo
{
    public string city;
    public string cityId;
    public string parent;
    public string updateTime;
}
public class WeathData
{
    public string shidu;
    public double pm25;
    public double pm10;
    public string quality;
    public string wendu;
    public string ganmao;
    public WeathDetailData[] forecast;
    public WeathDetailData yesterday;
}
public class WeathDetailData
{
    public string date;
    public string sunrise;
    public string high;
    public string low;
    public string sunset;
    public double aqi;
    public string ymd;
    public string week;
    public string fx;
    public string fl;
    public string type;
    public string notice;
}
#endregion

public class WeatherTools : MonoBehaviour
{
    public static Dictionary<string, string> PosToId = new Dictionary<string, string>();
    public static bool initDic = false;

    /// <summary>
    /// 獲取位置信息
    /// </summary>
    string Posurl = "http://api.map.baidu.com/location/ip?ak=bretF4dm6W5gqjQAXuvP0NXW6FeesRXb&coor=bd09ll";
    /// <summary>
    /// 獲取天氣信息
    /// </summary>
    string Weatherurl = "http://t.weather.sojson.com/api/weather/city/";

    void Start()
    {
        //獲取位置
        StartCoroutine(RequestCityName());
    }

    IEnumerator RequestCityName()
    {
        WWW www = new WWW(Posurl);
        yield return www;
        if (string.IsNullOrEmpty(www.error))
        {
            CityData cityData = LitJson.JsonMapper.ToObject<CityData>(www.text);
            Debug.Log(cityData.content.address_detail.city);
            //獲取city_code
            Debug.Log(GetWeatherId(cityData.content.address_detail.city));
            //獲取天氣信息
            string city_code = GetWeatherId(cityData.content.address_detail.city);
            StartCoroutine(RequestWeatherData(city_code));
        }
    }

    public static string GetWeatherId(string name)
    {
        string city_code = "";
        if (!initDic)
        {
            initDic = true;
            TextAsset city = Resources.Load<TextAsset>("city");
            List<CityCode> cityCode = LitJson.JsonMapper.ToObject<List<CityCode>>(city.text);
            foreach (CityCode t in cityCode)
            {
                PosToId[t.city_name] = t.city_code;
            }
        }
        for (int i = 1; i < name.Length; i++)
        {
            string tn = name.Substring(0, i);
            if (PosToId.ContainsKey(tn))
            {
                city_code = PosToId[tn];
            }
        }
        return city_code;
    }

    IEnumerator RequestWeatherData(string cicy_code)
    {
        WWW www = new WWW(Weatherurl + cicy_code);
        Debug.Log(Weatherurl + cicy_code);
        yield return www;
        if (string.IsNullOrEmpty(www.error))
        {
            Debug.Log(www.text);
            WeatherData t = LitJson.JsonMapper.ToObject<WeatherData>(www.text);
            //天氣信息
            Debug.Log(t.data.forecast[0].date);
            Debug.Log(t.data.forecast[0].high);
            Debug.Log(t.data.forecast[0].low);
            Debug.Log(t.data.forecast[0].ymd);
            Debug.Log(t.data.forecast[0].week);
            Debug.Log(t.data.forecast[0].sunrise);
            Debug.Log(t.data.forecast[0].sunset);
            Debug.Log(t.data.forecast[0].aqi);
            Debug.Log(t.data.forecast[0].fx);
            Debug.Log(t.data.forecast[0].fl);
            Debug.Log(t.data.forecast[0].type);
            Debug.Log(t.data.forecast[0].notice);
        }
    }
}

效果:
在這裏插入圖片描述

3.4 數據顯示

數據都有,下面就是顯示了
在這裏插入圖片描述
UI:

    //UI顯示
    public Text m_TextCityName;
    public Text m_TextQuality;
    public Text m_TextNotice;
    public Image[] m_ImageType;
    //今天
    public Text m_TextTodayDate;
    
    public Text m_TextTodayType;
    public Text m_TextTodayTemperature;
    public Text m_TextTodayfx;
    //明天
    public Text m_TextTomorrowDate;
    public Text m_TextTomorrowType;
    public Text m_TextTomorrowTemperature;
    public Text m_TextTomorrowfx;
    //後天
    public Text m_TextAcquiredDate;
    public Text m_TextAcquiredType;
    public Text m_TextAcquiredTemperature;
    public Text m_TextAcquiredfx;

在這裏插入圖片描述
天氣UI圖片資源:
https://download.csdn.net/download/q764424567/12403068

代碼:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

#region 返回的城市名字等數據類
public class CityData
{
    public string address;
    public Content content;
    public int status;

}
public class Content
{
    public string address;
    public Address_Detail address_detail;
    public Point point;
}
public class Address_Detail
{
    public string city;
    public int city_code;
    public string district;
    public string province;
    public string street;
    public string street_number;
}

public class Point
{
    public string x;
    public string y;
}
#endregion

#region 城市的city_code編號代碼
public class CityCode
{
    public int id;
    public int pid;
    public string city_code;
    public string city_name;
    public string post_code;
    public string area_code;
    public string ctime;
}
#endregion

#region 天氣數據類
public class WeatherData
{
    public string message;
    public int status;
    public string date;
    public string time;
    public CityInfo cityInfo;
    public WeathData data;
}
public class CityInfo
{
    public string city;
    public string cityId;
    public string parent;
    public string updateTime;
}
public class WeathData
{
    public string shidu;
    public double pm25;
    public double pm10;
    public string quality;
    public string wendu;
    public string ganmao;
    public WeathDetailData[] forecast;
    public WeathDetailData yesterday;
}
public class WeathDetailData
{
    public string date;
    public string sunrise;
    public string high;
    public string low;
    public string sunset;
    public double aqi;
    public string ymd;
    public string week;
    public string fx;
    public string fl;
    public string type;
    public string notice;
}
#endregion

public class WeatherTools : MonoBehaviour
{
    public static Dictionary<string, string> PosToId = new Dictionary<string, string>();
    public static bool initDic = false;

    //UI顯示
    public Text m_TextCityName;
    public Text m_TextQuality;
    public Text m_TextNotice;
    public Image[] m_ImageType;
    //今天
    public Text m_TextTodayDate;
    
    public Text m_TextTodayType;
    public Text m_TextTodayTemperature;
    public Text m_TextTodayfx;
    //明天
    public Text m_TextTomorrowDate;
    public Text m_TextTomorrowType;
    public Text m_TextTomorrowTemperature;
    public Text m_TextTomorrowfx;
    //後天
    public Text m_TextAcquiredDate;
    public Text m_TextAcquiredType;
    public Text m_TextAcquiredTemperature;
    public Text m_TextAcquiredfx;

    /// <summary>
    /// 獲取位置信息
    /// </summary>
    string Posurl = "http://api.map.baidu.com/location/ip?ak=bretF4dm6W5gqjQAXuvP0NXW6FeesRXb&coor=bd09ll";
    /// <summary>
    /// 獲取天氣信息
    /// </summary>
    string Weatherurl = "http://t.weather.sojson.com/api/weather/city/";

    void Start()
    {
        //獲取位置
        StartCoroutine(RequestCityName());
    }

    IEnumerator RequestCityName()
    {
        WWW www = new WWW(Posurl);
        yield return www;
        if (string.IsNullOrEmpty(www.error))
        {
            CityData cityData = LitJson.JsonMapper.ToObject<CityData>(www.text);
            Debug.Log(cityData.content.address_detail.city);
            //獲取city_code
            Debug.Log(GetWeatherId(cityData.content.address_detail.city));
            //獲取天氣信息
            string city_code = GetWeatherId(cityData.content.address_detail.city);
            StartCoroutine(RequestWeatherData(city_code));
        }
    }

    public static string GetWeatherId(string name)
    {
        string city_code = "";
        if (!initDic)
        {
            initDic = true;
            TextAsset city = Resources.Load<TextAsset>("city");
            List<CityCode> cityCode = LitJson.JsonMapper.ToObject<List<CityCode>>(city.text);
            foreach (CityCode t in cityCode)
            {
                PosToId[t.city_name] = t.city_code;
            }
        }
        for (int i = 1; i < name.Length; i++)
        {
            string tn = name.Substring(0, i);
            if (PosToId.ContainsKey(tn))
            {
                city_code = PosToId[tn];
            }
        }
        return city_code;
    }

    IEnumerator RequestWeatherData(string cicy_code)
    {
        WWW www = new WWW(Weatherurl + cicy_code);
        Debug.Log(Weatherurl + cicy_code);
        yield return www;
        if (string.IsNullOrEmpty(www.error))
        {
            Debug.Log(www.text);
            WeatherData t = LitJson.JsonMapper.ToObject<WeatherData>(www.text);
            //UI顯示數據
            WeatherData_UIShow(t);
        }
    }

    public void WeatherData_UIShow(WeatherData _weatherData)
    {
        m_TextCityName.text = _weatherData.cityInfo.city;
        m_TextQuality.text = _weatherData.data.quality;
        m_TextNotice.text = _weatherData.data.forecast[0].notice;
        string[] data = WeatherData_Parse(_weatherData);
        //今天
        m_TextTodayDate.text = data[0];
        m_TextTodayType.text = data[1];
        m_TextTodayTemperature.text = data[2];
        m_TextTodayfx.text = data[3];
        //明天
        m_TextTomorrowDate.text = data[4];
        m_TextTomorrowType.text = data[5];
        m_TextTomorrowTemperature.text = data[6];
        m_TextTomorrowfx.text = data[7];
        //後天
        m_TextAcquiredDate.text = data[8];
        m_TextAcquiredType.text = data[9];
        m_TextAcquiredTemperature.text = data[10];
        m_TextAcquiredfx.text = data[11];
    }

    public string[] WeatherData_Parse(WeatherData _weatherData)
    {
        string[] data = new string[12];
        for (int i = 0; i < 3; i++)
        {
            //圖片顯示
            string path = "weather/" + _weatherData.data.forecast[i].type;
            m_ImageType[i].sprite = Resources.Load(path, typeof(Sprite)) as Sprite;
            //數據計算
            string temperatureLow = _weatherData.data.forecast[i].low;
            string temperatureHigh = _weatherData.data.forecast[i].high;
            temperatureLow = temperatureLow.Substring(3, temperatureLow.Length - 3);
            temperatureHigh = temperatureHigh.Substring(3, temperatureHigh.Length- 3);
            //String數組存一下拼接好的字符串
            data[i * 4 + 0] = _weatherData.data.forecast[i].date + "日   " + _weatherData.data.forecast[i].week;
            data[i * 4 + 1] = _weatherData.data.forecast[i].type;
            data[i * 4 + 2] = temperatureLow + " ~ " + temperatureHigh;
            data[i * 4 + 3] = _weatherData.data.forecast[i].fx;
        }
        return data;
    }
}

效果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章