『openframeworks』天气预报查询

之前有需要要做一个天气预报查询的程序,在网上也找了很多别人的程序试了试,发现很多都不怎么好使。

最近研究了一下,发现也不是很难。首先,必须找到一个好一点的接口。在网上搜索发现,国家气象局提供的接口好像还不错。

可以参考这片文章,对这个接口的介绍还蛮全面的:http://www.weste.net/2012/8-23/84850.html

通过接口,我们试试打开武汉的链接,可以看到以下数据:

{"weatherinfo":{"city":"武汉","cityid":"101200101","temp":"23","WD":"东风","WS":"2级","SD":"52%","WSE":"2","time":"15:20","isRadar":"1","Radar":"JC_RADAR_AZ9270_JB"}}

可以发现他采用的是Json格式保存的信息。

这里我尝试用两种方法来进行处理。


1.自己来解析这些数据,这里我试了解析实时的简单的天气信息。效果如下:


首先,我们需要定义一个地址的查询接口URL:

以武汉为例,我们可以实时查询其信息,在update函数中实现如下:

void testApp::update(){
	if(ofGetElapsedTimef() - timeMark > 600.0f){							//每10分钟更新一次数据
		string url = "http://www.weather.com.cn/data/sk/101200101.html";			//武汉天气的接口地址
		ofHttpResponse response = ofLoadURL(url);
		if(response.status == 200) {
			char* pBuffer = response.data.getBinaryBuffer();				//得到相关的天气信息保存到char*中
			wchar_t wPathname[512] = {0};
			int len = MultiByteToWideChar(CP_UTF8, NULL, pBuffer, -1, NULL, 0);		
			MultiByteToWideChar(CP_UTF8, 0, pBuffer, -1, wPathname, len);			//转换成wchar_t*
			if(wcscmp(wPathname, weatherInfo) != 0){
				memset(weatherInfo, 0, 512);
				memcpy(weatherInfo, wPathname, 512);
				if(wcscmp(weatherInfo, wPathname) == 0) {
					wcout<<L"天气信息更新!\n";					//信息有变化,进行解析
					infoVec = splitWstring(weatherInfo);
					// string city, temp, WD, WS, SD, time;
					city = getInfo(L"city");
					temp = getInfo(L"temp");
					SD = getInfo(L"SD");
					wstring WD = getInfo(L"WD");
					wstring WS = getInfo(L"WS");
					time = getInfo(L"time");
					wind = wcscat(const_cast<wchar_t*>(WD.c_str()), WS.c_str());
				}
			}else{
				wcout<<L"天气信息无变化!\n";
			}
		}
		timeMark = ofGetElapsedTimef();
	}
}
这里根据得到数据的格式,写的解析函数splitWstring,得到保存有数据的vector:

vector<wstring> testApp::splitWstring(wstring s){			//解析字符串,把数据存入vector
	wstring::size_type pos = 0, pre_pos = 0;
	wstring tmpWstring;
	vector<wstring> tmpVec;
	while( (pre_pos = s.find_first_of(L'\"', pre_pos)) != wstring::npos ){
		if( (pos = s.find_first_of(L'\"', pre_pos+1)) == wstring::npos ){
			break;
		}
		tmpWstring = s.substr(pre_pos+1, pos-pre_pos-1);
		tmpVec.push_back(tmpWstring);
		pre_pos = pos+1;
	}
	return tmpVec;
}
<pre code_snippet_id="197469" snippet_file_name="blog_20140221_4_7379237" name="code" class="cpp">//得到相应的信息
wstring testApp::getInfo(const wstring index){
	//由于相关的信息在key的下一个存储,所以直接取出来即可
	for(vector<wstring>::iterator iter = infoVec.begin(); iter != infoVec.end() - 1; iter++) {
		if(wcscmp(index.c_str(), (*iter).c_str()) == 0) {
			return *(iter+1);
		}
	}
	return NULL;
}


 最后,在得到数据后,我们直接画出来就OK了: 
void testApp::draw(){
	bgImg.draw(0, 0, 240, 400);	
	if(city.size() != 0) {
		//地点
		font_ado.drawString(city, 80, 300);
		//显示实时温度
		font.drawString(temp, 25, 150);
		font.drawString(L"℃", 105, 150);
		//显示风向,风力
		font_wind.drawString(wind, 30, 70);
		//显示湿度
		font_wind.drawString(L"湿度", 30, 85);
		font_wind.drawString(SD, 60, 85);
		//更新时间
		font_time.drawString(L"更新时间", 160, 390);
		font_time.drawString(time, 200, 390);
	}
}
wstring testApp::getInfo(const wstring index){
	//由于相关的信息在key的下一个存储,所以直接取出来即可
	for(vector<wstring>::iterator iter = infoVec.begin(); iter != infoVec.end() - 1; iter++) {
		if(wcscmp(index.c_str(), (*iter).c_str()) == 0) {
			return *(iter+1);
		}
	}
	return NULL;
}


2.第二种方法,解析我用的别人封装好的Json解析方法。

就是这位大神的作品:https://github.com/jefftimesten/ofxJSON

OK,走起,先把它加到of中。

通过Json我们能容易的得到相关信息,如下:

string url_ = "http://m.weather.com.cn/data/101200101.html";
		bool parsingSuccessful = dateJson.open(url_);<span style="white-space:pre">				</span>//Json解析
		if(parsingSuccessful) {
			date = dateJson["weatherinfo"]["date"].asString();<span style="white-space:pre">		</span>//得到相关信息
			date_y = dateJson["weatherinfo"]["date_y"].asString();
			week = dateJson["weatherinfo"]["week"].asString();
			index = dateJson["weatherinfo"]["index"].asString();
			index_d = dateJson["weatherinfo"]["index_d"].asString();
			index_uv = dateJson["weatherinfo"]["index_uv"].asString();
			index_xc = dateJson["weatherinfo"]["index_xc"].asString();
			index_tr = dateJson["weatherinfo"]["index_tr"].asString();
			index_cl = dateJson["weatherinfo"]["index_cl"].asString();
			index_ls = dateJson["weatherinfo"]["index_ls"].asString();
			index_ag = dateJson["weatherinfo"]["index_ag"].asString();
			for(int i=1; i<=6; i++){
				string a, b, c;
				a = "temp" + ofToString(i);
				b = "weather" + ofToString(i);
				c = "wind" + ofToString(i);
				temps[i-1] = dateJson["weatherinfo"][a].asString();
				weatheres[i-1] = dateJson["weatherinfo"][b].asString();
				winds[i-1] = dateJson["weatherinfo"][c].asString();
			}
		}

最后把string转成wstring,我们就能正确的去显示中文的信息了:

//设置区域
std::wcout.imbue(std::locale("CHS"));

wchar_t* testApp::stringToWstring(string src) {  //string转wstring

	int len = src.size();
	int wcslen = ::MultiByteToWideChar(CP_UTF8, NULL, src.c_str(), len, NULL, 0);
	wchar_t* wszString = new wchar_t[wcslen + 1];
	::MultiByteToWideChar(CP_UTF8, NULL, src.c_str(), len, wszString, wcslen);
	wszString[wcslen] = L'\0';
	return wszString;
}
最后还是一样,我们依次将它们画出来!效果如下,凑合看吧。


春雨惊春清谷天,
夏满芒夏暑相连。
秋处露秋寒霜降,
冬雪雪冬小大寒
上半年是六廿一,
下半年是八廿三。
每月两节日期定,
最多只差一两天。


                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: openFrameworks是一个开源的跨平台C++开发框架,可帮助开发人员轻松创建屏幕实时、交互式的应用程序,具有良好的可扩展性。而openFrameworks的三维重建模块则是可以基于RGBD传感器不断获取深度图像数据,进而实现逐帧三维重建的功能,从而获取更多的场景信息和三维结构。 通过openFrameworks的三维重建模块,我们可以从一系列二维的图像中,通过计算机算法自动构建出三维场景,实现对物体的直观化呈现和深度分析。openFrameworks三维重建模块具备高度自由化和可定制化的特点,可根据需求对其进行二次开发和优化。而其源代码公开,也为开发者们提供了丰富的学习和交流资源。 openFrameworks三维重建模块对行业中多个领域都有着广泛的应用,例如:建筑、艺术、游戏、虚拟现实等。在建筑领域,开发者可以利用其进行场景重建和室内设计;在艺术领域,它可以用于三维雕塑和手势识别等方面,逐渐扩展出更多的应用场景;在游戏和虚拟现实领域中,三维重建模块可以用于改善游戏场景和角色模型的真实性和质感等等。因此,openFrameworks三维重建模块不仅是一种方便快捷的三维建模方式,它也为行业带来了更多的应用和发展。 ### 回答2: OpenFrameworks是一个开源的C++跨平台编程框架,它的应用覆盖了音频、视频、3D图形、物理、计算机视觉等各种领域。在三维重建方面,OpenFrameworks提供了丰富的三维图形绘制与处理的函数库,可以有效地将二维图像转化为三维图像,使得模型更加真实、具有立体感。 在使用OpenFrameworks进行三维重建时,首先需要得到原始图像数据,可以通过摄像机、激光扫描等设备获取。然后,通过OpenFrameworks提供的三维图形绘制函数,将二维图像转化为三维模型,并进行建模和优化。同时,OpenFrameworks还提供了一些三维可视化工具,可以帮助设计师更加直观地观察和修改模型。 OpenFrameworks在三维重建方面有着广泛的应用。例如,在游戏开发中使用OpenFrameworks可以将游戏场景中的二维元素转化为三维模型,更加真实地呈现游戏效果。在建筑设计中,OpenFrameworks可以通过图像建模技术,将建筑图纸转化为立体模型,帮助设计师更好地审阅和修改设计方案。在科学研究中,通过三维重建技术可以将实验数据进行可视化处理,使得研究人员能够更直观地了解实验结果。 总之,OpenFrameworks 作为一款跨平台的开源C++编程框架,在三维重建方面有着广泛的应用和优势。它使得三维重建更加快捷、简单,有助于设计师和科研人员更好地进行创作和研究。 ### 回答3: openFrameworks是一个开源的跨平台艺术创作工具,它支持C++编程语言和OpenGL图形引擎,可以用于创建实时交互式的多媒体艺术作品,也可以用于科学计算和数据可视化领域。openFrameworks内置了许多丰富的功能库和插件,可以用于处理图像、视频、音频、网络、物理模拟、虚拟现实、增强现实等领域。 三维重建是指通过摄像机或激光扫描等方式获取物体的三维坐标信息,再通过计算机算法将其转换成三维模型形态的过程。在openFrameworks中,可以使用多种开源库和插件来实现三维重建,如OpenCV、PCL、ofx3DModelLoader等,同时也可以结合深度学习、机器视觉等技术来提高重建的精度和效率。 其中,ofx3DModelLoader插件是一个专用于加载和显示三维模型的工具,可以支持多种模型格式,包括.obj、.stl、.3ds、.blend等,同时也支持自定义材质、贴图、光照等效果。使用ofx3DModelLoader可以方便地在openFrameworks中创建、编辑和显示三维模型,为创作出高质量的三维作品提供了有力支持。 总之,openFrameworks是一款功能强大、易于使用的艺术创作工具,可以用于实现多样化的项目,其中包括三维重建,通过openFrameworks的丰富功能库和插件,我们可以将创意变为现实。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值