当前位置: > > > Swift - 使用OpenWeatherMap获取天气的实时数据、预测数据

Swift - 使用OpenWeatherMap获取天气的实时数据、预测数据

我们做一些Web应用或者是手机应用,有时会需要展示出实时的天气数据或者天气预报数据。这里推荐一个好用的天气API服务:OpenWeatherMap

1,OpenWeatherMap介绍
(1)OpenWeatherMap 提供广泛的气象数据,如包含当前天气的地图,一周预报,降水,风,云,来自气象站的其他数据。
(2)数据结果提供 JSONXML,、以及 HTML 等多种格式。
(3)免费用户可以使用绝大部分功能。同收费用户比起来,只是对每分钟查询次数有限制(60次/分钟)。但这个也足够我们使用了。

2,OpenWeatherMap注册 
要使用 OpenWeatherMap 的服务,首先我们要到它的官网上注册一个帐号,地址:http://openweathermap.org
然后再登录帐号,注册个 apikey。这个在后面获取气候信息时参数中需要带上。(注册这些都是免费的。)

3,API提供的功能介绍
(1)实时天气数据
(2)最近5天的天气预报数据(时间精度:每3小时一条数据)
(3)最近16天的天气预报数据(时间精度:每天一条数据)
(4)历史数据查询
(5)紫外线指数查询
(6)提供天气图层(Weather map layers)
(7)气象站数据提供
(8)批量数据下载
(9)空气污染查询
官方API说明地址:http://openweathermap.org/api 。下面我通过两个简单的样例,演示使用方法。

4,实时天气查询
API支持根据城市名称、城市ID、城市邮编、经纬度坐标这4种方式查询对应城市的天气信息。
下面样例使用城市名称来查询,查询出北京当前的实时天气,效果图如下: 

(注意:这里对返回的 JSON 数据我使用 SwiftyJSON 来解析,具体用法可以参考我原来写的这篇文章:Swift - SwiftyJSON的使用祥解
import UIKit

class ViewController: UIViewController {
    
    let apiId = "12b2817fbec86915a6e9b4dbbd3d9036"

    override func viewDidLoad() {
        super.viewDidLoad()
        
        getCurrentWeatherData();
    }
    
    //获取当前天气数据(北京)
    func getCurrentWeatherData(){
        let urlStr = "http://api.openweathermap.org/data/2.5/weather?q=beijing&units=metric&appid=\(apiId)"
        let url = NSURL(string: urlStr)!
        guard let weatherData = NSData(contentsOfURL: url) else { return }
        
        //将获取到的数据转为json对象
        let jsonData = JSON(data: weatherData)
        
        //日期格式化输出
        let dformatter = NSDateFormatter()
        dformatter.dateFormat = "yyyy年MM月dd日 HH:mm:ss"
        
        print("城市:\(jsonData["name"].string!)")
        
        let weather = jsonData["weather"][0]["main"].string!
        print("天气:\(weather)")
        let weatherDes = jsonData["weather"][0]["description"].string!
        print("详细天气:\(weatherDes)")
        
        let temp = jsonData["main"]["temp"].number!
        print("温度:\(temp)°C")
        
        let humidity = jsonData["main"]["humidity"].number!
        print("湿度:\(humidity)%")
        
        let pressure = jsonData["main"]["pressure"].number!
        print("气压:\(pressure)hpa")
        
        let windSpeed = jsonData["wind"]["speed"].number!
        print("风速:\(windSpeed)m/s")
        
        let lon = jsonData["coord"]["lon"].number!
        let lat = jsonData["coord"]["lat"].number!
        print("坐标:[\(lon),\(lat)]")
        
        let timeInterval1 = NSTimeInterval(jsonData["sys"]["sunrise"].number!)
        let date1 = NSDate(timeIntervalSince1970: timeInterval1)
        print("日出时间:\(dformatter.stringFromDate(date1))")
        
        let timeInterval2 = NSTimeInterval(jsonData["sys"]["sunset"].number!)
        let date2 = NSDate(timeIntervalSince1970: timeInterval2)
        print("日落时间:\(dformatter.stringFromDate(date2))")
        
        let timeInterval3 = NSTimeInterval(jsonData["dt"].number!)
        let date3 = NSDate(timeIntervalSince1970: timeInterval3)
        print("数据时间:\(dformatter.stringFromDate(date3))")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

5,未来天气预测
下面样例查询出未来5天内,北京的天气预报数据。效果图如下:

import UIKit

class ViewController: UIViewController {
    
    let apiId = "12b2817fbec86915a6e9b4dbbd3d9036"

    override func viewDidLoad() {
        super.viewDidLoad()
        
        getForcastWeatherData();
    }
    
    //获取未来天气数据(北京)
    func getForcastWeatherData(){
        let urlStr = "http://api.openweathermap.org/data/2.5/forecast?q=beijing&units=metric&appid=\(apiId)"
        let url = NSURL(string: urlStr)!
        guard let weatherData = NSData(contentsOfURL: url) else { return }
        
        //将获取到的数据转为json对象
        let weatherJson = JSON(data: weatherData)
        
        print("城市:\(weatherJson["city"]["name"].string!)")
        
        let lon = weatherJson["city"]["coord"]["lon"].number!
        let lat = weatherJson["city"]["coord"]["lat"].number!
        print("坐标:[\(lon),\(lat)]")
        
        //日期格式化输出
        let dformatter = NSDateFormatter()
        dformatter.dateFormat = "yyyy年MM月dd日 HH:mm:ss"
        
        //遍历数据
        for (_,jsonData):(String, JSON) in weatherJson["list"] {
            let timeInterval = NSTimeInterval(jsonData["dt"].number!)
            let date = NSDate(timeIntervalSince1970: timeInterval)
            print("--- 时间:\(dformatter.stringFromDate(date)) ---")
            
            let weather = jsonData["weather"][0]["main"].string!
            print("天气:\(weather)")
            let weatherDes = jsonData["weather"][0]["description"].string!
            print("详细天气:\(weatherDes)")
            
            let temp = jsonData["main"]["temp"].number!
            print("温度:\(temp)°C")
            
            let humidity = jsonData["main"]["humidity"].number!
            print("湿度:\(humidity)%")
            
            let pressure = jsonData["main"]["pressure"].number!
            print("气压:\(pressure)hpa")
            
            let windSpeed = jsonData["wind"]["speed"].number!
            print("风速:\(windSpeed)m/s")
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
评论4
  • 4楼
    2018-01-14 23:03
    木有

    要怎么写用定位取得当地天气?

    站长回复

    1,首先我们获取当前的经纬度位置坐标,并通过经纬度获取对应的城市。这个可以参考我的另一篇文章:Swift - 经纬度位置坐标与真实地理位置相互转化

    2,得到当前城市后再通过类似本文的第三方接口获取对应的天气。

  • 3楼
    2017-03-21 11:35
    雨落决堤

    我觉得不管用不用的到 好东西还是可以支持一下

    站长回复

    多谢你的支持。

  • 2楼
    2016-06-21 10:30
    linjoe

    额,站长,忘了还有个问题,怎么根据定位来更换他的城市代码呢,给个思路就可以了...

    站长回复

    这个天气API直接就可以通过坐标来查询天气的。你先定位得到经纬度坐标,再用这个坐标调用它的天气接口。

    返回的结果里面除了天气数据,还有对应的国家、城市代码等数据。

  • 1楼
    2016-06-21 10:22
    linjoe

    首先万分感谢站长,终于等到了这篇文章!
    我先前请求您写这篇文章之后一直在看demo,也在留言上咨询了您一些问题,对这个也算是有一点点经验了
    ...
    现在还有一个比较头疼的就是,如何根据他未来几天的数据来绘制折线图呢?我对这个还不是很了解,需求要求把一周内每天的最高温度和最低温度各自连成一个折线,而且每个拐点标上温度。这个完全是一点思路没有,看了看网上的教程,没有我需要的- -..

    站长回复

    折线图你可以自己绘制实现,也可以使用网上一些现成的第三方图表组件。

    这个我也排到计划里吧,到时先篇相关文章。不过就是要等一段时间就是了。