Exemplo n.º 1
0
        public string WriteCitFile(string json)
        {
            //公共方法
            ResultInfo resultInfo = new ResultInfo();

            try
            {
                JObject obj = (JObject)JsonConvert.DeserializeObject(json);

                string                   citFile     = Convert.ToString(obj["citFile"]);
                FileInformation          fi          = JsonConvert.DeserializeObject <FileInformation>(obj["fi"].ToString());
                List <ChannelDefinition> channelList = JsonConvert.DeserializeObject <List <ChannelDefinition> >(obj["channelList"].ToString());
                string                   extraInfo   = Convert.ToString(obj["extraInfo"]);
                List <double[]>          arrayDone   = JsonConvert.DeserializeObject <List <double[]> >(obj["arrayDone"].ToString());

                bool data = cfprocess.WriteCitFile(citFile, fi, channelList, extraInfo, arrayDone);

                resultInfo.flag = 1;
                resultInfo.msg  = "";
                resultInfo.data = data.ToString();
            }
            catch (Exception ex)
            {
                resultInfo.flag = 0;
                resultInfo.msg  = ex.Message;
            }

            return(JsonConvert.SerializeObject(resultInfo));
        }
        /// <summary>
        /// 将GEO文件转换为CIT文件
        /// </summary>
        /// <param name="geoFile">GEO文件路径</param>
        /// <param name="citFile">CIT文件路径</param>
        /// <param name="citDataHeadInfo">cit头部信息</param>
        /// <returns>成功:true,失败:false</returns>
        public bool ConvertData(string geoFile, string citFile, FileInformation citDataHeadInfo)
        {
            try
            {
                int type = 1;
                //10号车通道对应表
                if (citDataHeadInfo.sTrain.Contains("999307"))
                {
                    type = 307;//iType=307时,geo转换有特殊情况
                }
                int iPostion = 18;
                QueryDataChannelInfoHead(geoFile);
                string mileageRange = GetExportDataMileageRange(geoFile);
                mileageRange = mileageRange.Substring(2);
                float startMileage = float.Parse(mileageRange.Substring(0, mileageRange.IndexOf("-")));
                float endMileage   = float.Parse(mileageRange.Substring(mileageRange.IndexOf("-") + 1));
                if (citDataHeadInfo.iKmInc == 0)
                {
                    if (endMileage < startMileage)
                    {
                        float temp = startMileage;
                        startMileage = endMileage;
                        endMileage   = temp;
                    }
                }
                else
                {
                    if (endMileage > startMileage)
                    {
                        float temp = startMileage;
                        startMileage = endMileage;
                        endMileage   = temp;
                    }
                }
                citDataHeadInfo.fkmFrom = startMileage;
                citDataHeadInfo.fkmTo   = endMileage;
                using (FileStream fs = new FileStream(geoFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                {
                    using (BinaryReader br = new BinaryReader(fs, Encoding.Default))
                    {
                        br.BaseStream.Position = 0;
                        gfh = GetDataInfoHead(br.ReadBytes(GEO_FILE_HEADER_SIZE));
                        //添加通道信息
                        iChannelLength = BitConverter.ToInt16(br.ReadBytes(2), 0);
                        iChannelCount  = BitConverter.ToInt16(br.ReadBytes(2), 0);

                        citDataHeadInfo.iChannelNumber = 2 + channelMappingList.Count;

                        #region 通道定义

                        dciL = new List <DataChannelInfo>();
                        byte[] bChannelData = br.ReadBytes(iChannelLength - 2);
                        //读取通道
                        for (int j = 0; j < iChannelLength - 2;)
                        {
                            DataChannelInfo dci = GetChannelInfo(bChannelData, ref j);
                            dciL.Add(dci);
                            if (dciL.Count > iChannelCount)
                            {
                                break;
                            }
                            if (type == 10)
                            {
                                if (dci.sNameEn.ToLower().Contains("null"))
                                {
                                    break;
                                }
                            }
                        }

                        //通道匹配
                        int        channelID = 2;
                        List <int> listID    = new List <int>();
                        List <ChannelDefinition> channelList = new List <ChannelDefinition>();
                        channelList.Add(new ChannelDefinition {
                            sID = 1, sNameEn = "Km", sNameCh = "Km", fScale = 1.0f, fOffset = 0.0f, sUnit = ""
                        });
                        channelList.Add(new ChannelDefinition {
                            sID = 2, sNameEn = "Meter", sNameCh = "Meter", fScale = 4.0f, fOffset = 0.0f, sUnit = ""
                        });

                        for (int i = 0; i < channelMappingList.Count; i++)
                        {
                            for (int j = 0; j < dciL.Count; j++)
                            {
                                if (dciL[j].sNameEn.Equals(channelMappingList[i].sGEO))
                                {
                                    listID.Add(j);
                                    ChannelDefinition channelInfoItem = new ChannelDefinition();
                                    channelInfoItem.sID     = channelID;
                                    channelInfoItem.sNameEn = channelMappingList[i].sCIT;
                                    channelInfoItem.sNameCh = channelMappingList[i].sChinese;
                                    channelInfoItem.fScale  = dciL[j].fScale;
                                    channelInfoItem.fOffset = 0.0f;
                                    channelInfoItem.sUnit   = dciL[j].sUnit;

                                    channelList.Add(channelInfoItem);

                                    ++channelID;
                                    break;
                                }
                            }
                        }

                        #endregion

                        #region 通道数据

                        List <byte[]> bytes = GetChannelData(br, gfh, type, listID, iPostion);

                        #endregion

                        citHelper.WriteCitFile(citFile, citDataHeadInfo, channelList, "", bytes);

                        br.Close();
                    }
                    fs.Close();
                }

                return(true);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }