CDSLinkF.cpp 16 KB

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