public VD_MinAvgData getOneMinAvgData(System.Data.DataSet ds) { System.Data.DataRow rmain = ds.Tables["tblMain"].Rows[0]; VD_MinAvgData[] laneData = new VD_MinAvgData[ds.Tables["tbllane_count"].Rows.Count]; int invalidcnt = 0; VD_MinAvgData ret = new VD_MinAvgData(this); ret.year = System.DateTime.Now.Year; ret.month = System.DateTime.Now.Month; ret.day = System.Convert.ToInt32(ds.Tables["tblmain"].Rows[0]["day"]); ret.hour = System.Convert.ToInt32(ds.Tables["tblmain"].Rows[0]["hour"]); ret.min = System.Convert.ToInt32(ds.Tables["tblmain"].Rows[0]["minute"]); for (int laneid = 0; laneid < ds.Tables["tbllane_count"].Rows.Count; laneid++) { int small_car_volume = 0, big_car_volume = 0, connect_car_volume = 0; int small_car_speed = 0, big_car_speed = 0, connect_car_speed = 0, average_occupancy = 0, average_car_interval = 0; System.Data.DataRow laneRow = ds.Tables["tbllane_count"].Rows[laneid]; laneData[laneid] = new VD_MinAvgData(this); small_car_volume = System.Convert.ToInt32(laneRow["small_car_volume"]); big_car_volume = System.Convert.ToInt32(laneRow["big_car_volume"]); connect_car_volume = System.Convert.ToInt32(laneRow["connect_car_volume"]); big_car_speed = System.Convert.ToInt32(laneRow["big_car_speed"]); small_car_speed = System.Convert.ToInt32(laneRow["small_car_speed"]); connect_car_speed = System.Convert.ToInt32(laneRow["connect_car_speed"]); average_occupancy = System.Convert.ToInt32(laneRow["average_occupancy"]); average_car_interval = System.Convert.ToInt32(laneRow["average_car_interval"]); // 車道總流量計算 if (small_car_volume == 0xff && big_car_volume == 0xff && connect_car_volume == 0xff) laneData[laneid].vol = -1; else { if (small_car_volume != 0xff) laneData[laneid].vol += small_car_volume; if (big_car_volume != 0xff) laneData[laneid].vol += big_car_volume; if (connect_car_volume != 0xff) laneData[laneid].vol += connect_car_volume; } if (laneData[laneid].vol == -1 || connect_car_speed == 0xff && small_car_speed == 0xff && big_car_speed == 0xff) laneData[laneid].speed = -1; else { if (connect_car_volume != 0xff && connect_car_speed != 0xff) laneData[laneid].speed += connect_car_volume * connect_car_speed; if (small_car_volume != 0xff && small_car_speed != 0xff) laneData[laneid].speed += small_car_volume * small_car_speed; if (big_car_volume != 0xff && big_car_speed != 0xff) laneData[laneid].speed += big_car_volume * big_car_speed; } if (laneData[laneid].speed == -1 || laneData[laneid].vol == -1) laneData[laneid].speed = -1; else if (laneData[laneid].vol == 0) laneData[laneid].speed = 0; else laneData[laneid].speed = laneData[laneid].speed / laneData[laneid].vol; if (average_occupancy == 0xff) laneData[laneid].occupancy = -1; else laneData[laneid].occupancy = average_occupancy; laneData[laneid].interval = average_car_interval; }// for // 記算不分車道總流量 invalidcnt = 0; for (int laneId = 0; laneId < laneData.Length; laneId++) { ret.vol += laneData[laneId].vol; if (laneData[laneId].vol == -1) invalidcnt++; } if (ret.vol == laneData.Length * -1) ret.vol = -1; else ret.vol = ret.vol + invalidcnt + (ret.vol + invalidcnt) / (laneData.Length - invalidcnt) * invalidcnt; //計算平均車速 invalidcnt = 0; int totalvol = 0; for (int laneId = 0; laneId < laneData.Length; laneId++) { if (laneData[laneId].vol != -1 && laneData[laneId].speed != -1) { ret.speed += laneData[laneId].vol * laneData[laneId].speed; totalvol += laneData[laneId].vol; } else invalidcnt++; } if (invalidcnt == laneData.Length) ret.speed = -1; else if (totalvol == 0) ret.speed = 0; else ret.speed = ret.speed / totalvol; //計算平均佔有率 invalidcnt = 0; for (int laneId = 0; laneId < laneData.Length; laneId++) { if (laneData[laneId].occupancy == -1) invalidcnt++; else ret.occupancy += laneData[laneId].occupancy; } if (invalidcnt == laneData.Length) ret.occupancy = -1; else ret.occupancy = ret.occupancy / (laneData.Length - invalidcnt); return ret; }
//public bool CheckVD_DataValid(System.Data.DataSet ds) //{ // System.Data.DataRow r = ds.Tables["tblMain"].Rows[0]; //} public VD_MinAvgData getFiveMinMovingAvgData() { VD_MinAvgData ret = new VD_MinAvgData(this.vdtc); lock (this.queData) { object[] objs= queData.ToArray(); VD_MinAvgData[] OneMinDatas = new VD_MinAvgData[objs.Length]; for (int i = 0; i < OneMinDatas.Length; i++) OneMinDatas[i] = (VD_MinAvgData)objs[i]; // cal five min total vol ret.year = this.maxDateTime.Year; ret.month = this.maxDateTime.Month; ret.day = this.maxDateTime.Day; ret.hour = this.maxDateTime.Hour; ret.min = this.maxDateTime.Minute; ret.vdName = this.vdtc.DeviceName; int invalidCnt = 0; for (int i = 0; i < OneMinDatas.Length; i++) { if (!OneMinDatas[i].IsValid) invalidCnt++; ret.vol += OneMinDatas[i].vol; } if (invalidCnt == OneMinDatas.Length) ret.vol = -1; else ret.vol = ret.vol + invalidCnt + (ret.vol+invalidCnt) / (OneMinDatas.Length - invalidCnt) * invalidCnt; //補足無效資料 // cal 5 min avg speed invalidCnt = 0; int totalvol=0; for (int i = 0; i < OneMinDatas.Length; i++) { if (OneMinDatas[i].speed != -1 || OneMinDatas[i].vol != -1) { ret.speed += OneMinDatas[i].speed * OneMinDatas[i].vol; totalvol += OneMinDatas[i].vol; } else invalidCnt++; } if (invalidCnt == OneMinDatas.Length) ret.speed = -1; else if (totalvol == 0) ret.speed = 0; else ret.speed = ret.speed / totalvol; //cal 5 min occupancy invalidCnt = 0; for (int i = 0; i < OneMinDatas.Length; i++) { if (OneMinDatas[i].occupancy == -1) invalidCnt++; else ret.occupancy += OneMinDatas[i].occupancy; } if (invalidCnt == OneMinDatas.Length) ret.occupancy = -1; else ret.occupancy = ret.occupancy / (OneMinDatas.Length - invalidCnt); return ret; } //throw new NotImplementedException(); }
public void inData(VD_MinAvgData data) { lock (queData) { try { // int day, hour, min; //day=System.Convert.ToInt32(ds.Tables["tblmain"].Rows[0]["day"]); //hour=System.Convert.ToInt32( ds.Tables["tblmain"].Rows[0]["hour"]); //min=System.Convert.ToInt32( ds.Tables["tblmain"].Rows[0]["minute"]); // VD_MinAvgData data = this.getOneMinAvgData( ds); Console.WriteLine(data.ToString()+" enque!"); // System.DateTime dt = new DateTime(System.DateTime.Now.Year,System.DateTime.Now.Month,day, hour,min,0); if (queData.Count == 0) { queData.Enqueue(data); maxDateTime = minDateTime =data.dateTime; } else if (data.dateTime > maxDateTime) { queData.Enqueue(data); maxDateTime = data.dateTime; if (queData.Count > 5) { while (queData.Count > 5) queData.Dequeue(); } data = (VD_MinAvgData)queData.Peek(); // day = System.Convert.ToInt32(ds.Tables["tblmain"].Rows[0]["day"]); // hour = System.Convert.ToInt32(ds.Tables["tblmain"].Rows[0]["hour"]); // min = System.Convert.ToInt32(ds.Tables["tblmain"].Rows[0]["minute"]); minDateTime = data.dateTime; } } catch (Exception ex) { Console.WriteLine(ex.StackTrace); } } }
public void inData(VD_MinAvgData data) { lock (queData) { try { // ConsoleServer.WriteLine(data.ToString()+" enque!"); if (queData.Count == 0) { queData.Enqueue(data); maxDateTime = minDateTime =data.dateTime; } else if (data.dateTime > maxDateTime ) { queData.Enqueue(data); if (System.Math.Abs(((TimeSpan)(data.dateTime - System.DateTime.Now)).TotalMinutes) < 6) maxDateTime = data.dateTime; else maxDateTime = new DateTime(System.DateTime.Now.Year, System.DateTime.Now.Month, System.DateTime.Now.Day, System.DateTime.Now.Hour, System.DateTime.Now.Minute, 0); if (queData.Count > 5) { while (queData.Count > 5) queData.Dequeue(); } data = (VD_MinAvgData)queData.Peek(); // day = System.Convert.ToInt32(ds.Tables["tblmain"].Rows[0]["day"]); // hour = System.Convert.ToInt32(ds.Tables["tblmain"].Rows[0]["hour"]); // min = System.Convert.ToInt32(ds.Tables["tblmain"].Rows[0]["minute"]); minDateTime = data.dateTime; } } catch (Exception ex) { ConsoleServer.WriteLine(ex.StackTrace); } } }
// 主動回報事件 void VDTC_OnTCReport(object tc, TextPackage txt) { System.Data.DataSet ds=null; if (txt.Text[0] == 0x10 ) //cycle data 1 min cycle { try { ds=m_protocol.GetSendDsByTextPackage(txt,CmdType.CmdReport); ds.AcceptChanges(); if (true/*System.Convert.ToInt32(ds.Tables[0].Rows[0]["response_type"]) == 0 || System.Convert.ToInt32(ds.Tables[0].Rows[0]["response_type"]) == 4*/) { VD_MinAvgData data = getOneMinAvgData(ds,System.DateTime.Now.Year,System.DateTime.Now.Month); curr_1_min_data = data; if (dtlast0x10 != data.dateTime) OneMinDataStore.inData(data); // if(dtlast0x10!=data.dateTime) VD_MinAvgData fiveMinData = this.OneMinDataStore.getFiveMinMovingAvgData(); if (this.OnFiveMinAvgData != null) try { this.OnFiveMinAvgData(this, fiveMinData); } catch (Exception ex) { ConsoleServer.WriteLine(this.DeviceName+ex.Message+ex.StackTrace); } if (this.On1MinTrafficData != null) try { if (dtlast0x10 != data.dateTime) this.On1MinTrafficData(this, data); else ConsoleServer.WriteLine(this.DeviceName+"1min data repeat!"); } catch (Exception ex) { ConsoleServer.WriteLine(this.DeviceName+ex.Message+ex.StackTrace); }; dtlast0x10 = data.dateTime; // 顯示取得最近1分鐘資料 // ConsoleServer.WriteLine(this.DeviceName + " " + "Five min AVG:" + fiveMinData.ToString()); } } catch (Exception ex) { ConsoleServer.WriteLine(this.DeviceName+" "+"Five min AVG"+ex.Message); } } else if(txt.Cmd==0x17) // 20 sec 事件資料 { // ConsoleServer.WriteLine(txt.ToString()); try { ds = m_protocol.GetSendDsByTextPackage(txt, CmdType.CmdReport); ds.AcceptChanges(); if (this.On20SecEvent != null) this.On20SecEvent(this, getOneMinAvgData(ds, System.DateTime.Now.Year, System.DateTime.Now.Month)); //if (this.OnRealTimeData != null) // this.OnRealTimeData(this, ds); } catch (Exception ex) { ConsoleServer.WriteLine(this.DeviceName+" "+" 20 sec 事件資料"+ex.Message + "\r\n" + ex.StackTrace); } } else if (txt.Cmd == 0x18) //現點速率 { try { ConsoleServer.WriteLine(txt.ToString()); if (System.DateTime.Now >= m_realEventEndTime) { ConsoleServer.WriteLine(this.DeviceName + "關閉現點速率"); //this.Tc_SetRealData(0); AsyncSend(new SendPackage(CmdType.CmdSet,CmdClass.B,0xffff,new byte[]{0x11,00})); return; } ds = m_protocol.GetSendDsByTextPackage(txt, CmdType.CmdReport); ds.AcceptChanges(); if (this.OnRealTimeData != null) this.OnRealTimeData(this, ds); } catch (Exception ex) { ConsoleServer.WriteLine(this.DeviceName+" "+"現點速率:"+ex.Message + "\r\n" + ex.StackTrace); } } else if (txt.Cmd == 0x1a) //觸動事件 { try { ds = m_protocol.GetSendDsByTextPackage(txt, CmdType.CmdReport); ds.AcceptChanges(); if (this.OnTriggerEvent != null) this.OnTriggerEvent(this, ds); } catch (Exception ex) { ConsoleServer.WriteLine(this.DeviceName+" "+"觸動事件:" + ex.Message + "\r\n" + ex.StackTrace); } } }
public VD_MinAvgData getOneMinAvgData(System.Data.DataSet ds,int year,int month) { System.Data.DataRow rmain = ds.Tables["tblMain"].Rows[0]; VD_MinAvgData[] laneData = new VD_MinAvgData[ds.Tables["tbllane_count"].Rows.Count]; int invalidcnt = 0; VD_MinAvgData ret = new VD_MinAvgData(this.DeviceName); ret.year = year ; ret.month = month; ret.day = System.Convert.ToInt32(ds.Tables["tblmain"].Rows[0]["day"]); ret.hour = System.Convert.ToInt32(ds.Tables["tblmain"].Rows[0]["hour"]); ret.min = System.Convert.ToInt32(ds.Tables["tblmain"].Rows[0]["minute"]); if (ds.Tables[0].Rows[0]["func_name"].ToString() == "report_event_data") // for 20sec event data ret.sec =System.Convert.ToInt32( ds.Tables[0].Rows[0]["second"]); ret.orgds = ds; for (int laneid = 0; laneid < ds.Tables["tbllane_count"].Rows.Count; laneid++) { int small_car_volume = 0, big_car_volume = 0, connect_car_volume = 0; int small_car_speed = 0, big_car_speed = 0, connect_car_speed = 0, average_occupancy = 0, average_car_interval = 0; int small_car_length = 0, big_car_length = 0, connect_car_length = 0; System.Data.DataRow laneRow = ds.Tables["tbllane_count"].Rows[laneid]; laneData[laneid] = new VD_MinAvgData(this.DeviceName); laneData[laneid].year = ret.year; laneData[laneid].month = ret.month; laneData[laneid].day = ret.day; laneData[laneid].hour = ret.hour; laneData[laneid].min= ret.min; laneData[laneid].sec = ret.sec; small_car_volume = System.Convert.ToInt32(laneRow["small_car_volume"]); big_car_volume = System.Convert.ToInt32(laneRow["big_car_volume"]); connect_car_volume = System.Convert.ToInt32(laneRow["connect_car_volume"]); big_car_speed = System.Convert.ToInt32(laneRow["big_car_speed"]); small_car_speed = System.Convert.ToInt32(laneRow["small_car_speed"]); connect_car_speed = System.Convert.ToInt32(laneRow["connect_car_speed"]); average_occupancy = System.Convert.ToInt32(laneRow["average_occupancy"]); //if (average_occupancy == 255) // average_occupancy = -1; average_car_interval = System.Convert.ToInt32(laneRow["average_car_interval"]); if (average_car_interval == 65535 ) average_car_interval = -1; //if (average_car_interval == 255) // average_car_interval = -1; small_car_length = System.Convert.ToInt32(laneRow["small_car_length"]); big_car_length = System.Convert.ToInt32(laneRow["big_car_length"]); connect_car_length = System.Convert.ToInt32(laneRow["connect_car_length"]); if (small_car_volume == 0 && small_car_speed > 0 || small_car_volume == 0 && small_car_length > 0) { laneData[laneid].small_car_volume = -1; } else { laneData[laneid].small_car_volume = (small_car_volume == 255) ? -1 : small_car_volume; if (!Comm.TC.VDDataValidCheck.SpeedVolumnRangeCheck(laneData[laneid].speed, laneData[laneid].vol)) { laneData[laneid].small_car_volume = -1; // laneData[laneid].small_car_speed = -1; } } if (big_car_volume == 0 && big_car_speed > 0 || big_car_volume == 0 && big_car_length > 0) { laneData[laneid].big_car_volume = -1; } else { laneData[laneid].big_car_volume = (big_car_volume == 255) ? -1 : big_car_volume; if (!Comm.TC.VDDataValidCheck.SpeedVolumnRangeCheck(laneData[laneid].speed, laneData[laneid].vol)) { laneData[laneid].big_car_volume = -1; // laneData[laneid].big_car_speed = -1; } } if (connect_car_volume == 0 && connect_car_speed > 0 || connect_car_volume == 0 && connect_car_length > 0) { laneData[laneid].connect_car_volume = -1; } else { laneData[laneid].connect_car_volume = (connect_car_volume == 255) ? -1 : connect_car_volume; if (!Comm.TC.VDDataValidCheck.SpeedVolumnRangeCheck(laneData[laneid].speed, laneData[laneid].vol)) { laneData[laneid].connect_car_volume = -1; // laneData[laneid].connect_car_speed = -1; } } laneData[laneid].small_car_speed = (small_car_speed == 255 || small_car_volume==-1) ? -1 : small_car_speed; laneData[laneid].big_car_speed=(big_car_speed==255 || big_car_volume==-1)?-1:big_car_speed; laneData[laneid].connect_car_speed = (connect_car_speed == 255) ? -1 : connect_car_speed; laneData[laneid].occupancy = (average_occupancy == 255) ? -1 : average_occupancy; //if(average_car_interval==65535 || average_car_interval==255) // Console.WriteLine("wild!"); laneData[laneid].interval = average_car_interval; laneData[laneid].small_car_length = (small_car_length == 255) ? -1 : small_car_length; laneData[laneid].big_car_length = (big_car_length == 255) ? -1 : big_car_length; laneData[laneid].connect_car_length = (connect_car_length == 255) ? -1 : connect_car_length; /* ret.small_car_volume+=(small_car_volume==-1)?0:small_car_volume; ret.big_car_volume+=(big_car_volume == -1) ? 0 : big_car_volume; ret.connect_car_volume += (connect_car_volume == -1) ? 0 : connect_car_volume; * */ /* ret.connect_car_speed += (laneData[laneid].connect_car_speed == -1) ? 0 : laneData[laneid].connect_car_speed; ret.small_car_speed += (laneData[laneid].small_car_speed == -1) ? 0 : laneData[laneid].small_car_speed; ret.big_car_speed += (laneData[laneid].big_car_speed == -1) ? 0 : laneData[laneid].big_car_speed; ret.connect_car_length += (laneData[laneid].connect_car_length == -1) ? 0 : laneData[laneid].connect_car_length; ret.small_car_length += (laneData[laneid].small_car_length == -1) ? 0 : laneData[laneid].small_car_length; ret.big_car_length += (laneData[laneid].big_car_length == -1) ? 0 : laneData[laneid].big_car_length; * */ // 車道總流量計算 if ( laneData[laneid].small_car_volume == -1 || laneData[laneid].big_car_volume ==-1 || laneData[laneid].connect_car_volume == -1 ) { laneData[laneid].vol = -1; laneData[laneid].big_car_volume = laneData[laneid].small_car_volume = laneData[laneid].connect_car_volume = -1; } else { //if (small_car_volume != 0xff) //{ laneData[laneid].vol += small_car_volume; //} //else // laneData[laneid].small_car_volume = -1; //if (big_car_volume != 0xff) //{ laneData[laneid].vol += big_car_volume; //} //else // laneData[laneid].big_car_volume = -1; //if (connect_car_volume != 0xff) //{ laneData[laneid].vol += connect_car_volume; //} //else // laneData[laneid].connect_car_volume = -1; } if (laneData[laneid].vol == -1 || laneData[laneid].connect_car_speed == -1 || laneData[laneid].small_car_speed ==-1 || laneData[laneid].big_car_speed == -1) { laneData[laneid].speed = -1; connect_car_speed = small_car_speed = big_car_speed = -1; } else { // if (connect_car_volume != 0xff && connect_car_speed != 0xff) laneData[laneid].speed += connect_car_volume * connect_car_speed; // if (small_car_volume != 0xff && small_car_speed != 0xff) laneData[laneid].speed += small_car_volume * small_car_speed; // if (big_car_volume != 0xff && big_car_speed != 0xff) laneData[laneid].speed += big_car_volume * big_car_speed; } if (laneData[laneid].speed == -1 || laneData[laneid].vol == -1) laneData[laneid].speed = -1; else if (laneData[laneid].vol == 0) laneData[laneid].speed = 0; else laneData[laneid].speed = laneData[laneid].speed / laneData[laneid].vol; //車道平均車長計算 if (laneData[laneid].vol == -1 || connect_car_length == 0xff || small_car_length == 0xff || big_car_length == 0xff) { laneData[laneid].length = -1; connect_car_length = small_car_length = big_car_length = -1; } else { // if (connect_car_length != 0xff && connect_car_volume != 0xff) laneData[laneid].length += connect_car_volume * connect_car_length; // if (small_car_volume != 0xff && small_car_length != 0xff) laneData[laneid].length += small_car_volume *small_car_length; // if (big_car_volume != 0xff && big_car_length != 0xff) laneData[laneid].length += big_car_volume * big_car_length; } if (laneData[laneid].length == -1 || laneData[laneid].vol == -1) laneData[laneid].length= -1; else if (laneData[laneid].vol == 0) laneData[laneid].length = 0; else laneData[laneid].length = laneData[laneid].length / laneData[laneid].vol; if (average_occupancy == 0xff) laneData[laneid].occupancy = -1; else laneData[laneid].occupancy = average_occupancy; // laneData[laneid].interval = average_car_interval; }// for // 記算不分車道總流量 invalidcnt = 0; ret.vol = 0; for (int laneId = 0; laneId < laneData.Length; laneId++) { // ret.vol += laneData[laneId].vol; if (laneData[laneId].vol == -1) invalidcnt++; else ret.vol += laneData[laneId].vol; } if (invalidcnt == laneData.Length) ret.vol = -1; else { ret.vol = ret.vol + invalidcnt + (ret.vol + invalidcnt) / (laneData.Length - invalidcnt) * invalidcnt; if(invalidcnt!=0) ret.isReCalculate = true; // this.is } //計算平均車速 invalidcnt = 0; int totalvol = 0; for (int laneId = 0; laneId < laneData.Length; laneId++) { if (laneData[laneId].vol != -1 && laneData[laneId].speed != -1) { ret.speed += laneData[laneId].vol * laneData[laneId].speed; totalvol += laneData[laneId].vol; } else invalidcnt++; } if (invalidcnt == laneData.Length) ret.speed = -1; else if (totalvol == 0) ret.speed = 0; else ret.speed = ret.speed / totalvol; //計算平均佔有率 invalidcnt = 0; totalvol = 0; for (int laneId = 0; laneId < laneData.Length; laneId++) { if (laneData[laneId].vol == -1) invalidcnt++; else { ret.occupancy += laneData[laneId].occupancy * laneData[laneId].vol; totalvol += laneData[laneId].vol; } } if (invalidcnt == laneData.Length) ret.occupancy= -1; else if (totalvol == 0) ret.occupancy = 0; else ret.occupancy = ret.occupancy / totalvol; //invalidcnt = 0; //for (int laneId = 0; laneId < laneData.Length; laneId++) //{ // if (laneData[laneId].occupancy == -1) // invalidcnt++; // else // ret.occupancy += laneData[laneId].occupancy; //} //if (invalidcnt == laneData.Length) // ret.occupancy = -1; //else // ret.occupancy = ret.occupancy / (laneData.Length - invalidcnt); //計算平均車長 invalidcnt = 0; totalvol = 0; for (int laneId = 0; laneId < laneData.Length; laneId++) { if (laneData[laneId].vol == -1 ) invalidcnt++; else { ret.length += laneData[laneId].length * laneData[laneId].vol; totalvol += laneData[laneId].vol; } } if (invalidcnt == laneData.Length) ret.length = -1; else if (totalvol == 0) ret.length = 0; else ret.length = ret.length / totalvol; //計算平均interval invalidcnt = 0; totalvol = 0; for (int laneId = 0; laneId < laneData.Length; laneId++) { if (laneData[laneId].vol == -1) invalidcnt++; else { ret.interval += laneData[laneId].interval * laneData[laneId].vol; totalvol += laneData[laneId].vol; } } if (invalidcnt == laneData.Length) ret.interval = -1; else if (totalvol == 0) ret.interval = 0; else ret.interval = ret.interval / totalvol; //計算平均interval ret.orgVDLaneData = laneData; //計算平均 各車種 車流 invalidcnt = 0; totalvol = 0; for (int laneId = 0; laneId < laneData.Length; laneId++) { if (laneData[laneId].small_car_volume == -1) invalidcnt++; else { ret.small_car_volume += laneData[laneId].small_car_volume ; // totalvol += laneData[laneId].small_car_volume; } } if (invalidcnt == laneData.Length) ret.small_car_volume = -1; invalidcnt = 0; totalvol = 0; for (int laneId = 0; laneId < laneData.Length; laneId++) { if (laneData[laneId].big_car_volume == -1) invalidcnt++; else { ret.big_car_volume += laneData[laneId].big_car_volume; // totalvol += laneData[laneId].small_car_volume; } } if (invalidcnt == laneData.Length) ret.big_car_volume = -1; invalidcnt = 0; totalvol = 0; for (int laneId = 0; laneId < laneData.Length; laneId++) { if (laneData[laneId].connect_car_volume== -1) invalidcnt++; else { ret.connect_car_volume += laneData[laneId].connect_car_volume; // totalvol += laneData[laneId].small_car_volume; } } if (invalidcnt == laneData.Length) ret.connect_car_volume = -1; // 各車種長度 invalidcnt = 0; totalvol = 0; for (int laneId = 0; laneId < laneData.Length; laneId++) { if (laneData[laneId].small_car_volume== -1) invalidcnt++; else { ret.small_car_length += laneData[laneId].small_car_length*laneData[laneId].small_car_volume; // totalvol += laneData[laneId].small_car_volume; } } if (invalidcnt == laneData.Length) ret.small_car_length = -1; else if( ret.small_car_volume==0) ret.small_car_length =0; else ret.small_car_length = ret.small_car_length / ret.small_car_volume; invalidcnt = 0; totalvol = 0; for (int laneId = 0; laneId < laneData.Length; laneId++) { if (laneData[laneId].big_car_volume == -1) invalidcnt++; else { ret.big_car_length += laneData[laneId].big_car_length * laneData[laneId].big_car_volume; } } if (invalidcnt == laneData.Length) ret.big_car_length = -1; else if( ret.big_car_volume==0) ret.big_car_length=0; else ret.big_car_length = ret.big_car_length / ret.big_car_volume; invalidcnt = 0; totalvol = 0; for (int laneId = 0; laneId < laneData.Length; laneId++) { if (laneData[laneId].connect_car_volume == -1) invalidcnt++; else { ret.connect_car_length += laneData[laneId].connect_car_length * laneData[laneId].connect_car_volume; } } if (invalidcnt == laneData.Length) ret.connect_car_length = -1; else if(ret.connect_car_volume==0) ret.connect_car_length=0; else ret.connect_car_length = ret.connect_car_length / ret.connect_car_volume; //計算平均 車束 invalidcnt = 0; totalvol = 0; for (int laneId = 0; laneId < laneData.Length; laneId++) { if (laneData[laneId].small_car_volume == -1) invalidcnt++; else { ret.small_car_speed += laneData[laneId].small_car_speed * laneData[laneId].small_car_volume; // totalvol += laneData[laneId].small_car_volume; } } if (invalidcnt == laneData.Length) ret.small_car_length = -1; else if(ret.small_car_volume==0) ret.small_car_speed=0; else ret.small_car_speed = ret.small_car_speed / ret.small_car_volume; //------------big car speed invalidcnt = 0; totalvol = 0; for (int laneId = 0; laneId < laneData.Length; laneId++) { if (laneData[laneId].big_car_volume == -1) invalidcnt++; else { ret.big_car_speed += laneData[laneId].big_car_speed * laneData[laneId].big_car_volume; // totalvol += laneData[laneId].small_car_volume; } } if (invalidcnt == laneData.Length) ret.big_car_speed = -1; else if(ret.big_car_volume==0) ret.big_car_speed=0; else ret.big_car_speed = ret.big_car_speed / ret.big_car_volume; invalidcnt = 0; totalvol = 0; for (int laneId = 0; laneId < laneData.Length; laneId++) { if (laneData[laneId].connect_car_volume == -1) invalidcnt++; else { ret.connect_car_speed += laneData[laneId].connect_car_speed * laneData[laneId].connect_car_volume; // totalvol += laneData[laneId].small_car_volume; } } if (invalidcnt == laneData.Length) ret.big_car_speed = -1; else if (ret.connect_car_volume == 0) ret.connect_car_speed = 0; else ret.connect_car_speed = ret.connect_car_speed / ret.connect_car_volume; return ret; }