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
- Qt:通过IP获取当前地理位置天气数据
- java web 通过ip获取当前地理位置
- 通过IP获取地理位置
- 通过IP地址获取当前地理位置(省份)的接口
- 通过IP地址获取当前地理位置(省份)的接口
- 通过IP地址获取当前地理位置(省份)的接口
- PHP通过IP 获取 地理位置
- php 通过ip获取地理位置
- 获取电脑物理地址以及通过IP地址获取当前地理位置(省份)的接口
- 通过javascript 获取当前地理位置 所在城市
- 腾讯新浪通过IP地址获取当前地理位置(省份)的接口
- 腾讯新浪通过IP地址获取当前地理位置(省份)的接口
- 通过IP地址获取地理位置信息
- PHP通过IP 获取 地理位置(转)
- 通过php获取ip所在地理位置
- java通过Ip地址获取地理位置
- 通过新浪接口获取IP地理位置
- JAVA通过IP获取地理位置(地区)
- 仿QQ空间滚动ActionBar透明度变化Demo
- poj 3279 Fliptile
- HTML表单密码框里的默认提示信息效果代码
- 类的多态性实现PHP依赖注入模式(模式一)
- hdu 5168 Legal path
- Qt:通过IP获取当前地理位置天气数据
- poj 1426 Find The Multiple
- zoj 3706 Break Standard Weight
- 嵌入式 Makefile中:=与?=与+=与=的区别$@,$^,$<区别
- 学习新技术的10个建议
- unity中虚拟直升机、直升机的旋转移动,子弹的实例化爆炸等效果的实现
- SHELL命令
- 华为牛人的十年工作感悟
- Nodejs完成一个待办事项的实例教程