/// <summary> /// 里程与修正后的里程做对比,然后根据修正后的里程找到点(文件中的指针) /// </summary> /// <param name="addFileName">idf文件</param> /// <param name="mi">输入的里程(单位为公里)</param> /// <returns>当前点在修正后的里程中相对应的文件指针</returns> private long MeterToPointNew(DataInfoClass dic, float mi, out IndexStaClass indexStaClsout, out int resultType) { List <IndexStaClass> listIndexStaCls = CommonClass.wdp.GetDataIndexInfo(dic.sAddFile); float len = 0; long currentPos = 0; indexStaClsout = new IndexStaClass(); resultType = 0;//代表在校正里程里没有找到里程点,并且在文件原始里程中也找不到。 foreach (IndexStaClass indexStaCls in listIndexStaCls) { if (dic.sKmInc == "增") { if (mi > float.Parse(indexStaCls.lStartMeter) && mi <= float.Parse(indexStaCls.LEndMeter)) { len = mi - float.Parse(indexStaCls.lStartMeter); } } else { if (mi < float.Parse(indexStaCls.lStartMeter) && mi >= float.Parse(indexStaCls.LEndMeter)) { len = float.Parse(indexStaCls.lStartMeter) - mi; } } if (len != 0) { currentPos = indexStaCls.lStartPoint + (long)((float)(len * indexStaCls.lContainsPoint) / float.Parse(indexStaCls.lContainsMeter)) * dic.fScale.Length * 2; indexStaClsout = indexStaCls; resultType = 1;//代表在校正后的里程范围中找到测量点 break; } } if (len == 0) { /* * 遍历结束,里程点不在indexStaClass的范围内。有两种情况: * 一:输入的里程点不在cit文件的里程范围内。返回0. * 二:cit文件还没有经过里程校正,直接寻找文件中的里程,找到则返回,否则返回0. */ currentPos = CommonClass.wdp.MeterToPoint(dic.sFilePath, (long)(mi * 10000), 4, dic.fOffset.Length, dic.bEncrypt); if (currentPos != 0) { resultType = 2;//代表在文件中的原始数据找到测量点 } } //FileStream fs = new FileStream(dic.sFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); //BinaryReader br = new BinaryReader(fs); //br.BaseStream.Position = indexStaClsout.lStartPoint; //Byte[] b = br.ReadBytes(dic.fScale.Length * 2); //if (dic.bEncrypt) //{ // b = WaveformDataProcess.ByteXORByte(b); //} //short km = BitConverter.ToInt16(b, 0); //short count = BitConverter.ToInt16(b, 2); return(currentPos); }
/// <summary> /// idf数据库操作:查询--IndexSta表格 /// </summary> /// <param name="sFile">idf全路径文件名</param> /// <returns>修正索引信息</returns> public List <IndexStaClass> GetDataIndexInfo(string sFile) { List <IndexStaClass> listIC = new List <IndexStaClass>(); try { using (OleDbConnection sqlconn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + sFile + ";Persist Security Info=False")) { OleDbCommand sqlcom = new OleDbCommand("select * from IndexSta order by id", sqlconn); sqlconn.Open(); OleDbDataReader sqloledr = sqlcom.ExecuteReader(); while (sqloledr.Read()) { IndexStaClass ic = new IndexStaClass(); ic.iID = (int)sqloledr.GetInt32(0); ic.iIndexID = (int)sqloledr.GetInt32(1); ic.lStartPoint = long.Parse(sqloledr.GetString(2)); ic.lStartMeter = sqloledr.GetString(3); ic.lEndPoint = long.Parse(sqloledr.GetString(4)); ic.LEndMeter = sqloledr.GetString(5); ic.lContainsPoint = long.Parse(sqloledr.GetString(6)); ic.lContainsMeter = sqloledr.GetString(7); ic.sType = sqloledr.GetString(8); listIC.Add(ic); } sqlconn.Close(); } } catch { } return(listIC); }
/// <summary> /// 把测量半径转化为在cit文件中实际上(里程校正之后)覆盖的测量点的个数(默认是一米4个点) /// </summary> /// <param name="meterageRadius">测量半径(单位为米)</param> /// <param name="indexStaCls">取测量点的区域</param> /// <returns>测量半径覆盖的测量点的个数(默认是一米4个点)</returns> public int GetDotFromMeterageRadius(int m_meterageRadius, IndexStaClass indexStaCls) { int dotNum = 0; dotNum = (int)(m_meterageRadius * indexStaCls.lContainsPoint / (float.Parse(indexStaCls.lContainsMeter) * 1000)); return(dotNum); }