⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 typhooncls.cpp

📁 解析中央气象局下发的台风报文
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include "StdAfx.h"
#include "PicManage.h"
#include ".\typhooncls.h"


CTyphoonCls::CTyphoonCls(void)
{
	this->m_strPath =CParam::GetParam("台风数据","报文目录");
	this->hThread =NULL;
	hMutex=::CreateMutex (NULL,false,"Typhoon");
	cn.m_strConnect=theApp.ConnectionString ;
	
}
CTyphoonCls::~CTyphoonCls(void)
{
	::CloseHandle (hMutex);
	this->TerminateThread ();
	this->Clear ();
}

HANDLE CTyphoonCls::CreteThread()
{
	this->hThread =::CreateThread (NULL,0,ThreadProc,this,0,&this->dwThread );
	return this->hThread ;
}
void CTyphoonCls::TerminateThread()
{
	try
	{
		::TerminateThread (this->hThread ,this->dwThread );
		this->hThread =NULL;
	}
	catch(...)
	{

	}

}
 DWORD CTyphoonCls::ThreadProc(LPVOID lpVoid)
{
	CTyphoonCls*pTyphoonCls=(CTyphoonCls*)lpVoid;
	pTyphoonCls->HandleTyphoon();

	return 0;
}
void CTyphoonCls::Clear()
{
	//释放内存
	for(int i=0;i<this->m_tdArray .GetCount ();i++)
	{
		TYPHOONDATA *pTd= this->m_tdArray [i];
		delete pTd;
	}
	for(int i=0;i<this->m_tsArray .GetCount ();i++)
	{
		TYPHOONSTART *pTs= this->m_tsArray [i];
		delete pTs;
	}
	for(int i=0;i<this->m_tEndArray .GetCount ();i++)
	{
		TYPHOONEND *pTEnd= this->m_tEndArray [i];
		delete pTEnd;
	}
	this->m_tsArray .RemoveAll ();
	this->m_tdArray .RemoveAll();
	this->m_tEndArray .RemoveAll ();
}
void CTyphoonCls::HandleTyphoon()
{
	
	::WaitForSingleObject (hMutex,60000*30);
	try
	{
		CFileFind ff;
		CString strFileName;
		COleDateTime dtLastTime,dtMax;
		CString strSourcePath=CParam::GetParam ("台风资料","源目录");
		CString strLastTime=CParam::GetParam ("台风资料","LastTimewp",INVALID_TIME_STR);
		dtLastTime.ParseDateTime (strLastTime);
		dtMax=dtLastTime;
		BOOL bSucc=ff.FindFile (strSourcePath+"\\wp???????.abj");
		while(bSucc)
		{
			bSucc=ff.FindNextFile ();
			strFileName=ff.GetFileName();
			CTime dtFile;
			ff.GetLastWriteTime(dtFile);
			COleDateTime dtTemp=ChackDateTime(dtFile.GetYear(),dtFile.GetMonth(),atoi(strFileName.Mid(2,2)),atoi(strFileName.Mid(4,2)),atoi(strFileName.Mid(6,2)),0,dtFile);
			if(dtTemp>dtLastTime)
				this->ReadTyphoon (ff.GetFilePath (),dtFile);
			if(dtTemp>dtMax)
				dtMax=dtTemp;
		}
		CParam::WriteParam ("台风资料","LastTimewp",dtMax.Format ("%Y-%m-%d %H:%M:%S"));
		ff.Close();		
	}
	catch(...)
	{
	}

	try
	{
		CFileFind ff;
		CString strFileName;
		COleDateTime dtLastTime,dtMax;
		CString strSourcePath=CParam::GetParam ("台风资料","源目录");
		CString strLastTime=CParam::GetParam ("台风资料","LastTimewx",INVALID_TIME_STR);
		dtLastTime.ParseDateTime (strLastTime);
		dtMax=dtLastTime;
		BOOL bSucc=ff.FindFile (strSourcePath+"\\wx???????.abj");
		while(bSucc)
		{
			bSucc=ff.FindNextFile ();
			strFileName=ff.GetFileName();
			CTime dtFile;
			ff.GetLastWriteTime(dtFile);
			COleDateTime dtTemp=ChackDateTime(dtFile.GetYear(),dtFile.GetMonth(),atoi(strFileName.Mid(2,2)),atoi(strFileName.Mid(4,2)),atoi(strFileName.Mid(6,2)),0,dtFile);
			if(dtTemp>dtLastTime)
				this->ReadTyphoon (ff.GetFilePath (),dtFile);
			if(dtTemp>dtMax)
				dtMax=dtTemp;
		}
		CParam::WriteParam ("台风资料","LastTimewx",dtMax.Format ("%Y-%m-%d %H:%M:%S"));
		ff.Close();		
	}
	catch(...)
	{
	}
	::ReleaseMutex (hMutex);

}

BOOL CTyphoonCls::ReadTyphoon(CString strPath, CTime dtFile)
{
	try
	{
		if(!::PathFileExists  (strPath))
			return false;
		//读取每一行并进行解析
		CStdioFile file;
		if(!file.Open (strPath,CFile::modeRead))
			return false;
		CString strLine;
		int I=0,J=0;
		TYPHOONDATA *pTd=NULL;
		CString strtemp;
		vector<CString>vecOut;
		dtFile=dtFile-CTimeSpan(0,8,0,0);
		while(file.ReadString (strLine))
		{
			if(strLine=="")
				continue;
			//台风开始报文
			if(strLine.Find ("WSCI40 BABJ")>=0)
			{
				CParam::Split (strLine," ",vecOut);
				
				COleDateTime date_time=ChackDateTime (dtFile.GetYear (),dtFile.GetMonth (),atoi(vecOut[2].Mid (0,2)),atoi(vecOut[2].Mid (2,2)),atoi(vecOut[2].Mid (4,2)),0,dtFile);
			
				while(file.ReadString (strLine))
				{
					if(strLine=="")
						continue;
					if(strLine.Find ("(")>=0&&strLine.Find (")")&&strLine.Find (".")<0)
					{
						int I=strLine.Find ("(");
						CString Typhoon_ID =strLine.Mid (I+1,4);
						CString cmdText="insert into TyphoonData(Typhoon_ID,Starting_Time) values("+CParam::ToString (CParam::ToYear (Typhoon_ID))+",'"+date_time.Format ("%Y-%m-%d %H:%M:%S")+"')";
							
						::CoInitialize (NULL);
						cn.ExecuteSql (cmdText);
						::CoUninitialize ();
						break;
					}
				}

				
				

			}
		
			//中央台
			try
			{
				if(strLine.Find ("WTPQ20 BABJ")>=0)
				{
					
					pTd=new TYPHOONDATA;
					pTd->Station_Name ="中央";
					while(file.ReadString (strLine))
					{
						strLine.TrimRight ();
						strLine.TrimLeft ();
						if(strLine=="")
							continue;
						if(strLine.Find ("NNNN")>=0)
							break;
						if(strLine.Find ("INITIAL TIME")>=0)
						{
							//台风类型
							if(strLine.Find ("SUPER TY")>=0)
								I=strLine.Find ("SUPER TY")+8;
							else
								I=strLine.Find (" ");
							pTd->Intensity_EN =strLine.Left (I);
							//台风名称
							J=strLine.Find (" ",I+1);
							pTd->Title_EN =strLine.Mid (I+1,J-I-1);
							//台风编号
							pTd->Typhoon_ID =strLine.Mid (J+1,4);
						

						
							//发布时间
							I=strLine.Find ("TIME ",J+1);
							pTd->Date_Time =ChackDateTime (dtFile.GetYear (),dtFile.GetMonth (),atoi(strLine.Mid (I+5,2)),atoi(strLine.Mid (I+7,2)),atoi(strLine.Mid (I+9,2)),0,dtFile);
							
						}
						else if(strLine.Find ("00HR")>=0)
						{
							pTd->IsValid =true;
							//纬度
							I=strLine.Find ("N");
							J=strLine.Find ("R");
							pTd->Latitude =atof(strLine.Mid (J+1,I-J-1));

							//经度
							J=strLine.Find ("E",I+1);
							pTd->Longitude=atof(strLine.Mid (I+1,J-I-1));
							//气压
							I=strLine.Find ("HPA",J+2);
							pTd->Pressure=atof(strLine.Mid (J+2,I-J-2));
							//风度
							J=strLine.Find ("M/S");
							pTd->Move_Speed=atof(strLine.Mid (I+4,J-I-4));

						}
						else if(strLine.Find ("30KTS")>=0)
						{
							I=strLine.Find ("S");
							J=strLine.Find ("KM");	
							pTd->Radius_7=atof(strLine.Mid (I+2,J-I-2));
						}
						else if(strLine.Find ("50KTS")>=0)
						{
							I=strLine.Find ("S");
							J=strLine.Find ("KM");
							pTd->Radius_10=atof(strLine.Mid (I+2,J-I-2));
						}
						else if(strLine.Find ("P12HR")>=0||strLine.Find ("P+12HR")>=0)
						{
							CParam::Split (strLine," ",vecOut);
							TYPHOONFORCAST *pTf=new TYPHOONFORCAST();
							pTf->Direction=vecOut[1];
							I=vecOut[2].Find("KM");
							pTf->Move_Speed =atof(vecOut[2].Left(I));
							pTf->Predict_Time =pTd->Date_Time +COleDateTimeSpan(0,12,0,0);
							pTd->AddForcast (pTf);
					
						}
						else if(strLine.Find ("P")==0&&strLine.Find ("HR")>=1)
						{
							CParam::Split (strLine," ",vecOut);
							TYPHOONFORCAST *pTf=new TYPHOONFORCAST();
							I=vecOut[1].Find("N");
							pTf->Latitude=atof(vecOut[1].Left(I));

							I=vecOut[2].Find("E");
							pTf->Longitude=atof(vecOut[2].Left(I));

							I=vecOut[3].Find("HPA");
							pTf->Pressure=atof(vecOut[3].Left(I));

							I=vecOut[4].Find("M/S");
							pTf->Wind_Power=atof(vecOut[4].Left(I));

							I=vecOut[0].Find("HR");
							J=vecOut[0].Find("P");
							if(vecOut[0].Find("+")>0)
								J=vecOut[0].Find("+");
							pTf->Predict_Time =pTd->Date_Time +COleDateTimeSpan(0,atoi(vecOut[0].Mid(J+1,I-J-1)),0,0);
							pTd->AddForcast (pTf);	
						}
					}
					this->m_tdArray.Add (pTd);
				}
			}
			catch(...)
			{
			}
			//日本
			try
			{
				if(strLine.Find ("WTPQ20 RJTD")>=0)
				{
					
					pTd=new TYPHOONDATA;
					pTd->Station_Name ="日本";
					while(file.ReadString (strLine))
					{
						strLine.TrimRight ();
						strLine.TrimLeft ();
						if(strLine=="")
							continue;
						if(strLine.Find ("NNNN")>=0)
							break;
						if(strLine.Find ("NAME")>=0)
						{
							I=strLine.Find ("(");
							J=strLine.Find (")");
							pTd->Typhoon_ID =strLine.Mid (I+1,J-I-1);
							strLine=strLine.Left (I);
							strLine.Trim ();
							CParam::Split (strLine," ",vecOut);
							for(I=0;I<vecOut.size ();I++)
							{
								if(vecOut[I]==pTd->Typhoon_ID)
								{
									int t=I+1;
									while(t<vecOut.size ())
									{

										pTd->Title_EN +=vecOut[t]+" ";
										t++;

									}
									pTd->Title_EN.Trim ();
									break;
								}
							}
							

							
						}
						else if(strLine.Find ("PSTN")>=0)
						{
							pTd->IsValid =true;
							
							CParam::Split (strLine," ",vecOut);
							pTd->Date_Time =ChackDateTime(dtFile.GetYear (),dtFile.GetMonth (),atoi(vecOut[1].Mid (0,2)),atoi(vecOut[1].Mid (2,2)),atoi(vecOut[1].Mid (4,2)),0,dtFile);
							//纬度
							/*I=vecOut[2].Find ("N");
							pTd->Latitude =atof(vecOut[2].Left(I));
							//经度
							I=vecOut[3].Find ("E");
							pTd->Longitude =atof(vecOut[3].Left(I));
							//气压
							I=strLine.Find ("HPA",J+2);
							pTd->Pressure=atof(strLine.Mid (J+2,I-J-2));
							//风度
							J=strLine.Find ("M/S");
							pTd->Move_Speed=atof(strLine.Mid (I+4,J-I-4));

							while(file.ReadString (strLine))
							{
								strLine.TrimRight ();
								strLine.TrimLeft ();
								if(strLine=="")
									continue;
								if(strLine.Find ("NNNN")>=0||strLine.Find ("FORECAST")>=0)
									break;
								
								if(strLine.Find ("MOVE")>=0)
								{
									CParam::Split (strLine," ",vecOut);
									pTd->Direction=vecOut[1];
									I=vecOut[2].Find("KT");
									pTd->Move_Speed=atof(vecOut[2].Left(I))*1.852;
								}
								else if(strLine.Find ("PRES")>=0)
								{
									CParam::Split (strLine," ",vecOut);
									I=vecOut[1].Find("HPA");
									pTd->Pressure=atof(vecOut[1].Left(I));
								}
								else if(strLine.Find ("MXWD")>=0)
								{
									CParam::Split (strLine," ",vecOut);
									I=vecOut[1].Find("KT");
									pTd->Wind_Power=atof(vecOut[1].Left(I))*1.852/3.6;

								}
								else if(strLine.Find ("50KT")>=0)
								{
									CParam::Split (strLine," ",vecOut);
									I=vecOut[1].Find("NM");
									pTd->Radius_10=atof(vecOut[1].Left(I))*1.852;

								}
								else if(strLine.Find ("30KT")>=0)
								{
									CParam::Split (strLine," ",vecOut);
									I=vecOut[1].Find("NM");
									pTd->Radius_7=atof(vecOut[1].Left(I))*1.852;

								}

							}
							*/

						}
						else if(strLine.Find ("HF")==2)
	NEXTFORCAST_RJTD:   {
							CParam::Split (strLine," ",vecOut);
							TYPHOONFORCAST *pTf=new TYPHOONFORCAST();
							I=vecOut[2].Find("N");
							pTf->Latitude=atof(vecOut[2].Left(I));
							I=vecOut[3].Find("E");
							pTf->Longitude=atof(vecOut[3].Left(I));

							I=vecOut[4].Find("NM");
							pTf->Affect_affect=vecOut[4]+" "+vecOut[5];

							pTf->Predict_Time =pTd->Date_Time +COleDateTimeSpan(0,atoi(vecOut[0].Left(2)),0,0);

							while(file.ReadString (strLine))
							{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -