通过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_OBJECT
private:
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