Qt:通过IP获取当前地理位置天气数据

来源:互联网 发布:借尸还魂事件 知乎 编辑:程序博客网 时间:2024/05/29 19:41

通过IP获取天气数据

大致流程是:

从百度Web服务api通过当前IP获取经纬度,然后将经纬度作为参数,从openweathermap获取天气数据,然后解析返回的json,打印到label上


这个流程的好处:

无需GPS定位,可快速解析,而且通用性强

缺点:

定位误差可能非常大


关于百度Web服务api

使用需要申请key,可以到这里申请

http://lbsyun.baidu.com/apiconsole/key

更多的api信息可以在这里查看

http://developer.baidu.com/map/index.php?title=webapi/ip-api

注:代码里的key是我申请的key,是为了方便大家测试,所以没删掉。

实际使用时,请替换成你自己申请的。毕竟我这个key可能随时废弃掉。


关于openweathermap

无需key即可使用

你也可以通过手写的地理位置来查找数据,比如说

http://api.openweathermap.org/data/2.5/weather?q=Hangzhou,cn

就是查看杭州的天气数据

更多的api信息可以在这里查看

http://openweathermap.org/current


另外,其实openweathermap返回了很多很多的天气数据,不过我在示例中只用了温度、湿度、气压和一个Icon


注:默认返回的是开式度,要转换成摄氏度的话,简单点的方法就是直接减去 273.15


效果图:



不多说,上代码


JasonQt_Weather.h

#ifndef __JasonQt_Weather_h__#define __JasonQt_Weather_h__// Qt lib import#include <QObject>#include <QJsonObject>#include <QJsonDocument>#include <QNetworkAccessManager>#include <QNetworkReply>namespace JasonQt_Weather{class Inquiry: public QObject{    Q_OBJECTprivate:    QNetworkAccessManager m_networkGetLatAndLon;    QNetworkAccessManager m_networkGetWeather;public:    Inquiry(void);    void getLatAndLon(void);    void getWeatherByGeographic(const double &lat, const double &lon);public slots:    void startInquiry(void);private slots:    void onGetLatAndLon(QNetworkReply *reply);    void onGetWeather(QNetworkReply *reply);signals:    void finished(const QString message, const QJsonObject weatherData);};}#endif//__JasonQt_Weather_h__


JasonQt_Weather.cpp

#include "JasonQt_Weather.h"using namespace JasonQt_Weather;Inquiry::Inquiry(void){    connect(&m_networkGetLatAndLon, SIGNAL(finished(QNetworkReply*)), this, SLOT(onGetLatAndLon(QNetworkReply*)));    connect(&m_networkGetWeather, SIGNAL(finished(QNetworkReply*)), this, SLOT(onGetWeather(QNetworkReply*)));}void Inquiry::getLatAndLon(void){    m_networkGetLatAndLon.get(QNetworkRequest(QUrl(QString("http://api.map.baidu.com/location/ip?ak=%1&coor=bd09ll").arg("54GzQbyspseUfRUbvDdVMKQW")))); // 这里可以修改百度LBS的key}void Inquiry::getWeatherByGeographic(const double &lat, const double &lon){    m_networkGetWeather.get(QNetworkRequest(QUrl(QString("http://api.openweathermap.org/data/2.5/weather?lat=%1&lon=%2").arg(lat).arg(lon))));}void Inquiry::startInquiry(void){    this->getLatAndLon();}void Inquiry::onGetLatAndLon(QNetworkReply *reply){    QJsonObject data = QJsonDocument::fromJson(reply->readAll()).object();    QJsonObject xy = data.value("content").toObject().value("point").toObject();    double lat = xy.value("y").toString().toDouble();    double lon = xy.value("x").toString().toDouble();    if(lat && lon)    {        this->getWeatherByGeographic(lat, lon);    }    else    {        qDebug("Get weather fail");        emit finished("Get lat and lon fail", QJsonObject());    }}void Inquiry::onGetWeather(QNetworkReply *reply){    QJsonObject data = QJsonDocument::fromJson(reply->readAll()).object();    if(!data.contains("message"))    {        emit finished("OK", data);    }    else    {        qDebug("Get weather fail");        emit finished("Get weather fail: " + data.value("message").toString(), QJsonObject());    }}


我也写了一个示例工程,可以到这里下载

http://download.csdn.net/detail/wsj18808050/8455365


1 0
原创粉丝点击