📄 typhooncls.cpp
字号:
#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 + -