CDSLinkF.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. //---------------------------------------------------------------------------
  2. #pragma hdrstop
  3. #include "CDSLinkF.h"
  4. #include "CDSLayerF.h"
  5. #include "ITSUtilF.h"
  6. #include "AppGlobalF.h"
  7. //---------------------------------------------------------------------------
  8. #pragma package(smart_init)
  9. TItsLink::TItsLink()
  10. {
  11. IFSC_ID = "";
  12. ROAD_ID = "";
  13. Clear();
  14. }
  15. //---------------------------------------------------------------------------
  16. void TItsLink::Clear()
  17. {
  18. }
  19. //---------------------------------------------------------------------------
  20. TItsLink::~TItsLink()
  21. {
  22. }
  23. //---------------------------------------------------------------------------
  24. void TItsLink::InitTraffic()
  25. {
  26. TRAF->InitTraffic();
  27. }
  28. //---------------------------------------------------------------------------
  29. //---------------------------------------------------------------------------
  30. TItsLinkManager *ItsLinkManager = NULL;
  31. //---------------------------------------------------------------------------
  32. /*
  33. * Link Manager
  34. */
  35. TItsLinkManager::TItsLinkManager()
  36. {
  37. }
  38. //---------------------------------------------------------------------------
  39. TItsLinkManager::~TItsLinkManager()
  40. {
  41. FLists.RemoveAll();
  42. FClctSystStts.RemoveAll();
  43. }
  44. //---------------------------------------------------------------------------
  45. void TItsLinkManager::InitTraffic()
  46. {
  47. try
  48. {
  49. FLists.Lock();
  50. FOR_STL(TItsLink*, pObj, FLists)
  51. {
  52. pObj->InitTraffic();
  53. }
  54. }
  55. __finally
  56. {
  57. FLists.UnLock();
  58. }
  59. }
  60. //---------------------------------------------------------------------------
  61. bool TItsLinkManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
  62. {
  63. String sQry;
  64. TADOQuery *pADO = NULL;
  65. sQry = "SELECT LINK_ID, F_NODE_ID, T_NODE_ID, ROAD_USE, LANES, \r\n"
  66. " ROAD_RANK, TRIM(ROAD_TYPE) AS ROAD_TYPE, ROAD_NO, TRIM(ROAD_NAME) ROAD_NAME, \r\n"
  67. " MULTI_LINK, TRIM(LINK_CONNECT) AS LINK_CONNECT, MAX_SPD, \r\n"
  68. " TRIM(REST_VEH) AS REST_VEH, REST_W, REST_H, LINK_LENG, RMRK, \r\n"
  69. " DEL_YN, DFLT_SPED, DFLT_SPED_USE_YN, \r\n"
  70. " SECT_GRAD_CD, AREA_CD, \r\n"
  71. " DECODE(AREA_CD, 'LAT001', 'Y', 'N') REGN_YN, PARA_ID \r\n"
  72. " FROM TB_LINK \r\n";
  73. FLists.Lock();
  74. try
  75. {
  76. FLists.RemoveAll();
  77. try
  78. {
  79. pADO = new TADOQuery(NULL);
  80. pADO->Close();
  81. pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
  82. pADO->SQL->Clear();
  83. pADO->SQL->Text = sQry;
  84. pADO->Prepared = true;
  85. pADO->Open();
  86. //int nRows = pADO->RecordCount;
  87. for( ; !pADO->Eof; pADO->Next())
  88. {
  89. TItsLink *pLink = new TItsLink();
  90. pLink->IsVertex = false;
  91. pLink->LINK_ID = pADO->FieldByName("LINK_ID")->AsString; //'링크ID';;
  92. pLink->F_NODE_ID = pADO->FieldByName("F_NODE_ID")->AsString; //'시작노드ID';;
  93. pLink->T_NODE_ID = pADO->FieldByName("T_NODE_ID")->AsString; //'종료노드ID';;
  94. pLink->ROAD_USE = pADO->FieldByName("ROAD_USE")->AsString; //'도로사용여부';;
  95. pLink->LANES = pADO->FieldByName("LANES")->AsString; //'차로수';;
  96. pLink->ROAD_RANK = pADO->FieldByName("ROAD_RANK")->AsString; //'도로등급';;
  97. pLink->ROAD_TYPE = pADO->FieldByName("ROAD_TYPE")->AsString; //'도로유형';;
  98. pLink->ROAD_NO = pADO->FieldByName("ROAD_NO")->AsString; //'도로번호';;
  99. pLink->ROAD_NAME = pADO->FieldByName("ROAD_NAME")->AsString.Trim(); //'도로명';;
  100. pLink->MULTI_LINK = pADO->FieldByName("MULTI_LINK")->AsString; //'중용구간여부';;
  101. pLink->LINK_CONNECT = pADO->FieldByName("LINK_CONNECT")->AsString; //'연결로코드';;
  102. pLink->MAX_SPD = pADO->FieldByName("MAX_SPD")->AsString; //'최고제한속도';;
  103. pLink->REST_VEH = pADO->FieldByName("REST_VEH")->AsString; //'통행제한차량';;
  104. pLink->REST_W = pADO->FieldByName("REST_W")->AsString; //'통과제한하중';;
  105. pLink->REST_H = pADO->FieldByName("REST_H")->AsString; //'통과제한높이';;
  106. pLink->LINK_LENG = pADO->FieldByName("LINK_LENG")->AsString; //'연장';;
  107. pLink->RMRK = pADO->FieldByName("RMRK")->AsString.Trim(); //'비고';;
  108. pLink->DEL_YN = pADO->FieldByName("DEL_YN")->AsString; //'삭제 여부';;
  109. pLink->DFLT_SPED = pADO->FieldByName("DFLT_SPED")->AsString; //'디폴트 속도';;
  110. pLink->DFLT_SPED_USE_YN = pADO->FieldByName("DFLT_SPED_USE_YN")->AsString; //'디폴트 속도 사용 여부';;
  111. pLink->SECT_GRAD_CD = pADO->FieldByName("SECT_GRAD_CD")->AsString; //'구간 등급 코드';;
  112. pLink->AREA_CD = pADO->FieldByName("AREA_CD")->AsString; //'지역 코드';;
  113. pLink->REGN_YN = pADO->FieldByName("REGN_YN")->AsString; //'로컬지역여부';
  114. pLink->PARA_ID = pADO->FieldByName("PARA_ID")->AsString; //'파라미터ID
  115. //pLink->REGN_YN = "Y";
  116. FLists.Push(pLink->LINK_ID, pLink);
  117. pLink->Completed = true;
  118. pLink->TRAF = new TCDSTraffic();
  119. }
  120. }
  121. catch(EDatabaseError &E)
  122. {
  123. ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
  124. DBERRORMSG("TItsLinkManager::LoadFromDb", String(E.ClassName()), E.Message, sQry);
  125. throw Exception(String(E.ClassName()) + E.Message);
  126. }
  127. catch(Exception &exception)
  128. {
  129. ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
  130. DBERRORMSG("TItsLinkManager::LoadFromDb", String(exception.ClassName()), exception.Message, sQry);
  131. throw Exception(String(exception.ClassName()) + exception.Message);
  132. }
  133. }
  134. __finally
  135. {
  136. if (pADO)
  137. {
  138. pADO->Close();
  139. delete pADO;
  140. }
  141. FLists.UnLock();
  142. }
  143. return LoadVrtxFromDb(ADbConn);
  144. }
  145. //---------------------------------------------------------------------------
  146. bool TItsLinkManager::LoadVrtxFromDb(TADOConnection *ADbConn/*=NULL*/)
  147. {
  148. String sQry;
  149. TADOQuery *pADO = NULL;
  150. #if 0
  151. sQry = "SELECT A.LINK_ID, A.LEVL, \r\n"
  152. " A.X_CRDN_ARR, A.Y_CRDN_ARR \r\n"
  153. " FROM TB_LINK_VRTX_ARR A, \r\n"
  154. " TB_LINK B \r\n"
  155. " WHERE B.DEL_YN = 'N' \r\n"
  156. " AND B.LINK_ID = A.LINK_ID \r\n"
  157. " AND A.LEVL = 1 \r\n";
  158. #else
  159. sQry = "SELECT * \r\n"
  160. " FROM VW_LINK_VRTX_ARR \r\n";
  161. #endif
  162. TItsLink* pObj;
  163. FLists.Lock();
  164. try
  165. {
  166. try
  167. {
  168. pADO = new TADOQuery(NULL);
  169. pADO->Close();
  170. pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
  171. pADO->SQL->Clear();
  172. pADO->SQL->Text = sQry;
  173. pADO->Prepared = true;
  174. pADO->Open();
  175. for( ; !pADO->Eof; pADO->Next())
  176. {
  177. String LINK_ID = pADO->FieldByName("LINK_ID")->AsString;
  178. pObj = FLists.Find(LINK_ID);
  179. if (!pObj) continue;
  180. #if 0
  181. LEVL = pADO->FieldByName("LEVL")->AsInteger;
  182. TItsVrtx* pVrtx = new TItsVrtx();
  183. pVrtx->X_CRDN_ARR = pADO->FieldByName("X_CRDN_ARR")->AsString;
  184. pVrtx->Y_CRDN_ARR = pADO->FieldByName("Y_CRDN_ARR")->AsString;
  185. pObj->Vrtxs.Push(LEVL, pVrtx);
  186. #else
  187. pObj->IsVertex = true;
  188. pObj->X_CRDN_ARR = pADO->FieldByName("X_CRDN_ARR")->AsString;
  189. pObj->Y_CRDN_ARR = pADO->FieldByName("Y_CRDN_ARR")->AsString;
  190. #endif
  191. }
  192. }
  193. catch(EDatabaseError &E)
  194. {
  195. ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
  196. DBERRORMSG("TItsLinkManager::LoadVrtxFromDb", String(E.ClassName()), E.Message, sQry);
  197. throw Exception(String(E.ClassName()) + E.Message);
  198. }
  199. catch(Exception &exception)
  200. {
  201. ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
  202. DBERRORMSG("TItsLinkManager::LoadVrtxFromDb", String(exception.ClassName()), exception.Message, sQry);
  203. throw Exception(String(exception.ClassName()) + exception.Message);
  204. }
  205. }
  206. __finally
  207. {
  208. if (pADO)
  209. {
  210. pADO->Close();
  211. delete pADO;
  212. }
  213. FLists.UnLock();
  214. }
  215. return true;
  216. }
  217. //---------------------------------------------------------------------------
  218. bool TItsLinkManager::LoadRegionVertexFromDb(TADOConnection *ADbConn/*=NULL*/)
  219. {
  220. String sQry;
  221. TADOQuery *pADO = NULL;
  222. sQry = "SELECT * FROM TB_REGION_VRTX WHERE CENTERID = 'L01'";
  223. try
  224. {
  225. try
  226. {
  227. pADO = new TADOQuery(NULL);
  228. pADO->Close();
  229. pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
  230. pADO->SQL->Clear();
  231. pADO->SQL->Text = sQry;
  232. pADO->Prepared = true;
  233. pADO->Open();
  234. for( ; !pADO->Eof; pADO->Next())
  235. {
  236. String CENTERID = pADO->FieldByName("CENTERID")->AsString;
  237. FRegionPointCnt = pADO->FieldByName("POINTCNT")->AsInteger;
  238. FRegionVertex = pADO->FieldByName("VERTEX")->AsString;
  239. }
  240. }
  241. catch(EDatabaseError &E)
  242. {
  243. DBERRORMSG("TItsLinkManager::LoadRegionVertexFromDb", String(E.ClassName()), E.Message, sQry);
  244. throw Exception(String(E.ClassName()) + E.Message);
  245. }
  246. catch(Exception &exception)
  247. {
  248. DBERRORMSG("TItsLinkManager::LoadRegionVertexFromDb", String(exception.ClassName()), exception.Message, sQry);
  249. throw Exception(String(exception.ClassName()) + exception.Message);
  250. }
  251. }
  252. __finally
  253. {
  254. if (pADO)
  255. {
  256. pADO->Close();
  257. delete pADO;
  258. }
  259. FLists.UnLock();
  260. }
  261. return true;
  262. }
  263. //---------------------------------------------------------------------------
  264. bool TItsLinkManager::LoadTraffic(TADOConnection *ADbConn/*=NULL*/)
  265. {
  266. bool bResult = true;
  267. String sQry;
  268. TADOQuery *pADO = NULL;
  269. InitTraffic();
  270. sQry = "SELECT A.LINK_ID, PRCN_DT, TFVL, SPED, OCPY_RATE, TRVL_HH, CMTR_GRAD_CD, MISS_YN, \r\n"
  271. " PRCN_SPED, SMTH_SPED, ADJS_SPED, PTRN_SPED, PRCN_SORC, ADJS_SORC, DATA_NUM, \r\n"
  272. " (CASE WHEN PRCN_DT <= TO_CHAR(SYSDATE - 10/1440, 'YYYYMMDDHH24MISS') \r\n"
  273. " THEN 'Y' ELSE 'N' END) AS MISSING, \r\n"
  274. " (CASE WHEN PRCN_DT >= TO_CHAR(SYSDATE - 15/1440, 'YYYYMMDDHH24MISS') \r\n"
  275. " THEN 'Y' ELSE 'N' END) AS LASTANS, \r\n"
  276. " (SELECT MAX(PRCN_DT) FROM TB_LINK_TRAF) MPRCN_DT \r\n"
  277. " FROM TB_LINK_TRAF A, TB_LINK B \r\n"
  278. " WHERE A.LINK_ID = B.LINK_ID \r\n";
  279. FLists.Lock();
  280. try
  281. {
  282. try
  283. {
  284. pADO = new TADOQuery(NULL);
  285. pADO->Close();
  286. pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
  287. pADO->SQL->Clear();
  288. pADO->SQL->Text = sQry;
  289. pADO->Prepared = true;
  290. pADO->Open();
  291. for( ; !pADO->Eof; pADO->Next())
  292. {
  293. String ID = pADO->FieldByName("LINK_ID")->AsString;
  294. TItsLink *pObj = FLists.Find(ID);
  295. if (!pObj) continue;
  296. pObj->TRAF->PRCN_DT = pADO->FieldByName("PRCN_DT")->AsString;
  297. pObj->TRAF->TFVL = pADO->FieldByName("TFVL")->AsInteger;
  298. pObj->TRAF->SPED = pADO->FieldByName("SPED")->AsInteger;
  299. pObj->TRAF->OCPY_RATE = pADO->FieldByName("OCPY_RATE")->AsFloat;
  300. pObj->TRAF->TRVL_HH = pADO->FieldByName("TRVL_HH")->AsInteger;
  301. pObj->TRAF->CMTR_GRAD_CD = pADO->FieldByName("CMTR_GRAD_CD")->AsString;
  302. pObj->TRAF->MISSING = pADO->FieldByName("MISSING")->AsString; // 결측여부
  303. pObj->TRAF->LASTANS = pADO->FieldByName("LASTANS")->AsString; // 최근 15분 이내 가공
  304. pObj->TRAF->MPRCN_DT = pADO->FieldByName("MPRCN_DT")->AsString; // 가공시각(최신)
  305. pObj->TRAF->DATA_NUM = pADO->FieldByName("DATA_NUM")->AsInteger;
  306. pObj->TRAF->PTRN_SPED = pADO->FieldByName("PTRN_SPED")->AsInteger;
  307. if (pObj->TRAF->CMTR_GRAD_CD == "LTC1") pObj->TRAF->TRAF_GRAD = 1;
  308. else if (pObj->TRAF->CMTR_GRAD_CD == "LTC2") pObj->TRAF->TRAF_GRAD = 2;
  309. else if (pObj->TRAF->CMTR_GRAD_CD == "LTC3") pObj->TRAF->TRAF_GRAD = 3;
  310. else pObj->TRAF->TRAF_GRAD = 0;
  311. pObj->TRAF->MISS_YN = pADO->FieldByName("MISS_YN")->AsString; // '결측 여부';
  312. pObj->TRAF->PRCN_SPED = pADO->FieldByName("PRCN_SPED")->AsInteger; // '가공 속도';
  313. pObj->TRAF->SMTH_SPED = pADO->FieldByName("SMTH_SPED")->AsInteger; // '평활화 속도';
  314. pObj->TRAF->ADJS_SPED = pADO->FieldByName("ADJS_SPED")->AsInteger; // '보정 속도';
  315. pObj->TRAF->PRCN_SORC = pADO->FieldByName("PRCN_SORC")->AsString; // '가공 소스';
  316. pObj->TRAF->ADJS_SORC = pADO->FieldByName("ADJS_SORC")->AsString; // '보정 소스';
  317. if (pObj->TRAF->CMTR_GRAD_CD == "LTC0" && pObj->TRAF->MISS_YN == "Y") pObj->TRAF->MISSING = "Y";
  318. }
  319. }
  320. catch(EDatabaseError &E)
  321. {
  322. ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
  323. DBERRORLOG("TItsLinkManager::LoadTraffic", String(E.ClassName()), E.Message, sQry);
  324. return false;
  325. throw Exception(String(E.ClassName()) + E.Message);
  326. }
  327. catch(Exception &exception)
  328. {
  329. ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
  330. DBERRORLOG("TItsLinkManager::LoadTraffic", String(exception.ClassName()), exception.Message, sQry);
  331. return false;
  332. throw Exception(String(exception.ClassName()) + exception.Message);
  333. }
  334. }
  335. __finally
  336. {
  337. if (pADO)
  338. {
  339. pADO->Close();
  340. delete pADO;
  341. }
  342. FLists.UnLock();
  343. }
  344. return bResult;
  345. }
  346. //---------------------------------------------------------------------------
  347. bool TItsLinkManager::LoadClctSystStts(TADOConnection *ADbConn/*=NULL*/)
  348. {
  349. bool bResult = true;
  350. String sQry;
  351. TADOQuery *pADO = NULL;
  352. FOR_STL(TClctSystStts*, pObj, FClctSystStts)
  353. {
  354. pObj->IsCollected = false;
  355. }
  356. sQry = "SELECT A.PRCN_DT, A.CLCT_SYST_CD, B.CLCT_SYST_NM, A.CLCT_NUM, A.FLTR_NUM, A.FUSN_NUM \r\n"
  357. " FROM TB_CLCT_SYST_STTS_HS A, \r\n"
  358. " TB_CLCT_SYST_STUP B \r\n"
  359. " WHERE A.PRCN_DT = (SELECT MAX(PRCN_DT) \r\n"
  360. " FROM TB_CLCT_SYST_STTS_HS \r\n"
  361. " WHERE PRCN_DT >= TO_CHAR(SYSDATE - 1/24, 'YYYYMMDDHH24MISS') \r\n"
  362. " ) \r\n"
  363. " AND B.CLCT_SYST_CD = A.CLCT_SYST_CD(+) \r\n"
  364. " AND B.USE_YN = 'Y' \r\n";
  365. FLists.Lock();
  366. try
  367. {
  368. try
  369. {
  370. pADO = new TADOQuery(NULL);
  371. pADO->Close();
  372. pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
  373. pADO->SQL->Clear();
  374. pADO->SQL->Text = sQry;
  375. pADO->Prepared = true;
  376. pADO->Open();
  377. for( ; !pADO->Eof; pADO->Next())
  378. {
  379. String CLCT_SYST_CD = pADO->FieldByName("CLCT_SYST_CD")->AsString;
  380. TClctSystStts *pObj = FClctSystStts.Find(CLCT_SYST_CD);
  381. if (!pObj)
  382. {
  383. pObj = new TClctSystStts();
  384. pObj->CLCT_SYST_CD = CLCT_SYST_CD;
  385. FClctSystStts.Push(pObj->CLCT_SYST_CD, pObj);
  386. }
  387. pObj->CLCT_SYST_NM = pADO->FieldByName("CLCT_SYST_NM")->AsString;
  388. pObj->PRCN_DT = pADO->FieldByName("PRCN_DT")->AsString;
  389. pObj->CLCT_NUM = pADO->FieldByName("CLCT_NUM")->AsInteger;
  390. pObj->FLTR_NUM = pADO->FieldByName("FLTR_NUM")->AsInteger;
  391. pObj->FUSN_NUM = pADO->FieldByName("FUSN_NUM")->AsInteger;
  392. pObj->IsCollected = true;
  393. }
  394. }
  395. catch(EDatabaseError &E)
  396. {
  397. ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
  398. DBERRORLOG("TItsLinkManager::LoadTraffic", String(E.ClassName()), E.Message, sQry);
  399. return false;
  400. throw Exception(String(E.ClassName()) + E.Message);
  401. }
  402. catch(Exception &exception)
  403. {
  404. ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
  405. DBERRORLOG("TItsLinkManager::LoadTraffic", String(exception.ClassName()), exception.Message, sQry);
  406. return false;
  407. throw Exception(String(exception.ClassName()) + exception.Message);
  408. }
  409. }
  410. __finally
  411. {
  412. if (pADO)
  413. {
  414. pADO->Close();
  415. delete pADO;
  416. }
  417. FLists.UnLock();
  418. }
  419. return bResult;
  420. }
  421. //---------------------------------------------------------------------------