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

通过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



版权声明:本文为wsj18808050原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。