/// <summary> /// 提取两个文件都具有的测站名称。 /// </summary> /// <param name="fileA"></param> /// <param name="fileB"></param> /// <returns></returns> public static List <string> GetSameSiteCodes(SinexFile fileA, SinexFile fileB) { List <string> namesA = fileA.GetSiteCods(); List <string> namesB = fileB.GetSiteCods(); return(namesA.FindAll(m => namesB.Contains(m))); }
/// <summary> /// 两个文件合并,本方法只适合计算站点不重复,且不相关的情况。 /// 信息只是简单的叠加。只有两个文件都有的信息块才会被合并。 /// </summary> /// <param name="fileB"></param> /// <param name="eraseNonCoord"> 是否清理非坐标的值和对应矩阵</param> public static SinexFile Merge(SinexFile fileA, SinexFile fileB, bool eraseNonCoord = true) { if (eraseNonCoord) { fileA.CleanNonCoordSolutionValue(); fileB.CleanNonCoordSolutionValue(); } SinexFile newFile = EmergeBasic(fileA, fileB); //合并解算结果,不更新标准差 SinexMerger.MergeSolutionValue(newFile.SolutionEstimateBlock, fileA.SolutionEstimateBlock, fileB.SolutionEstimateBlock); SinexMerger.MergeSolutionValue(newFile.SolutionAprioriBlock, fileA.SolutionAprioriBlock, fileB.SolutionAprioriBlock); //统计数据的合并, 需要做一些叠加工作。 SinexStatistic statisticA = fileA.GetStatistic(); SinexStatistic statisticB = fileB.GetStatistic(); if (fileA.SolutionStattisticsBlock != null && fileB.SolutionStattisticsBlock != null) { newFile.SolutionStattisticsBlock.Items = fileA.GetStatistic().Merge(fileB.GetStatistic()).GetSolutionStatistics(); } SinexStatistic statisticNew = newFile.GetStatistic(); double varFactorA = statisticNew.VarianceOfUnitWeight / statisticA.VarianceOfUnitWeight; double varFactorB = statisticNew.VarianceOfUnitWeight / statisticB.VarianceOfUnitWeight; //合并矩阵,协方差矩阵,前面已经判断并重新布置matrix了,此处只管合并。 MergeSolutionMatrix(newFile.SolutionMatrixEstimateCova, fileA.SolutionMatrixEstimateCova, varFactorA, fileB.SolutionMatrixEstimateCova, varFactorB, newFile.SolutionEstimateBlock); MergeSolutionMatrix(newFile.SolutionMatrixAprioriCova, fileA.SolutionMatrixAprioriCova, varFactorA, fileB.SolutionMatrixAprioriCova, varFactorB, newFile.SolutionAprioriBlock); return(newFile); }
/// <summary> /// 提取两个文件所有的测站编号,如果相同则只返回第一个。 /// 提取顺序为,以 第一个参数 fileA 的编号为基准,fileB 的依次顺序添加。如果 fileA 中已经有的,则略过。 /// 注:顺序做索引用,不可改变。 /// </summary> /// <param name="fileA"></param> /// <param name="fileB"></param> /// <returns></returns> public static List <string> GetDistinctSiteCodes(SinexFile fileA, SinexFile fileB) { List <string> namesA = fileA.GetSiteCods(); List <string> namesB = fileB.GetSiteCods(); foreach (var item in namesB) { if (!namesA.Contains(item)) { namesA.Add(item); } } return(namesA); }
/// <summary> /// 合并两个文件的基础信息,如测站名、接收机、天线等信息。 /// 协方差、平差结果等需要计算后添加进来。 /// 只有两个文件都有的信息块才会被合并。 /// </summary> /// <param name="fileA"></param> /// <param name="fileB"></param> /// <returns></returns> public static SinexFile EmergeBasic(SinexFile fileA, SinexFile fileB) { //创建 Sinex 结果文件 SinexFile result = new SinexFile("Gnsser"); SinexMerger.MergeBlock(result.SiteIdBlock, fileA.SiteIdBlock, fileB.SiteIdBlock); SinexMerger.MergeBlock(result.SiteReceiverBlock, fileA.SiteReceiverBlock, fileB.SiteReceiverBlock); SinexMerger.MergeBlock(result.SiteAntennaBlock, fileA.SiteAntennaBlock, fileB.SiteAntennaBlock); SinexMerger.MergeBlock(result.SiteEccentricityBlock, fileA.SiteEccentricityBlock, fileB.SiteEccentricityBlock); SinexMerger.MergeBlock(result.SatelliteIdBlock, fileA.SatelliteIdBlock, fileB.SatelliteIdBlock); SinexMerger.MergeBlock(result.SatellitePhaseCenterBlock, fileA.SatellitePhaseCenterBlock, fileB.SatellitePhaseCenterBlock); SinexMerger.MergeBlock(result.InputHistoryBlock, fileA.InputHistoryBlock, fileB.InputHistoryBlock); SinexMerger.MergeBlock(result.InputFilesBlock, fileA.InputFilesBlock, fileB.InputFilesBlock); SinexMerger.MergeBlock(result.FileCommentBlock, fileA.FileCommentBlock, fileB.FileCommentBlock); SinexMerger.MergeBlock(result.FileAcknowledgementBlock, fileA.FileAcknowledgementBlock, fileB.FileAcknowledgementBlock); SinexMerger.MergeBlock(result.InputHistoryBlock, fileA.InputHistoryBlock, fileB.InputHistoryBlock); SinexMerger.MergeBlock(result.SiteGpsPhaseCenterBlock, fileA.SiteGpsPhaseCenterBlock, fileB.SiteGpsPhaseCenterBlock); SinexMerger.MergeBlock(result.SolutionEpochBlock, fileA.SolutionEpochBlock, fileB.SolutionEpochBlock); return(result); }
// SinexFile SinexFile { get; set; } /// <summary> /// 转换为文本 /// </summary> /// <param name="SinexFile"></param> /// <returns></returns> public static string ToSinex(SinexFile SinexFile) { string divLine = "*-------------------------------------------------------------------------------"; StringBuilder sb = new StringBuilder(); //line 1 sb.AppendLine(SinexFile.Header.ToString()); sb.AppendLine(divLine); if (SinexFile.FileReferBlock != null) { sb.AppendLine(SinexFile.FileReferBlock.ToString()); sb.AppendLine(divLine); } if (SinexFile.FileCommentBlock != null && SinexFile.FileCommentBlock.HasItems) { sb.AppendLine(SinexFile.FileCommentBlock.ToString()); sb.AppendLine(divLine); } if (SinexFile.InputHistoryBlock != null && SinexFile.InputHistoryBlock.HasItems) { sb.AppendLine(SinexFile.InputHistoryBlock.ToString()); sb.AppendLine(divLine); } if (SinexFile.InputFilesBlock != null && SinexFile.InputFilesBlock.HasItems) { sb.AppendLine(SinexFile.InputFilesBlock.ToString()); sb.AppendLine(divLine); } if (SinexFile.FileAcknowledgementBlock != null && SinexFile.FileAcknowledgementBlock.HasItems) { sb.AppendLine(SinexFile.FileAcknowledgementBlock.ToString()); sb.AppendLine(divLine); } if (SinexFile.SolutionStattisticsBlock != null && SinexFile.SolutionStattisticsBlock.HasItems) { sb.AppendLine(SinexFile.SolutionStattisticsBlock.ToString()); sb.AppendLine(divLine); } if (SinexFile.SatelliteIdBlock != null && SinexFile.SatelliteIdBlock.HasItems) { sb.AppendLine(SinexFile.SatelliteIdBlock.ToString()); sb.AppendLine(divLine); } if (SinexFile.SatellitePhaseCenterBlock != null && SinexFile.SatellitePhaseCenterBlock.HasItems) { sb.AppendLine(SinexFile.SatellitePhaseCenterBlock.ToString()); sb.AppendLine(divLine); } if (SinexFile.SiteIdBlock != null && SinexFile.SiteIdBlock.HasItems) { sb.AppendLine(SinexFile.SiteIdBlock.ToString()); sb.AppendLine(divLine); } if (SinexFile.SiteReceiverBlock != null && SinexFile.SiteReceiverBlock.HasItems) { sb.AppendLine(SinexFile.SiteReceiverBlock.ToString()); sb.AppendLine(divLine); } if (SinexFile.SiteAntennaBlock != null && SinexFile.SiteAntennaBlock.HasItems) { sb.AppendLine(SinexFile.SiteAntennaBlock.ToString()); sb.AppendLine(divLine); } if (SinexFile.SiteGpsPhaseCenterBlock != null && SinexFile.SiteGpsPhaseCenterBlock.HasItems) { sb.AppendLine(SinexFile.SiteGpsPhaseCenterBlock.ToString()); sb.AppendLine(divLine); } if (SinexFile.SiteEccentricityBlock != null && SinexFile.SiteEccentricityBlock.HasItems) { sb.AppendLine(SinexFile.SiteEccentricityBlock.ToString()); sb.AppendLine(divLine); } if (SinexFile.SolutionEpochBlock != null && SinexFile.SolutionEpochBlock.HasItems) { sb.AppendLine(SinexFile.SolutionEpochBlock.ToString()); sb.AppendLine(divLine); } if (SinexFile.SolutionAprioriBlock != null && SinexFile.SolutionAprioriBlock.HasItems) { sb.AppendLine(SinexFile.SolutionAprioriBlock.ToString()); sb.AppendLine(divLine); } if (SinexFile.SolutionEstimateBlock != null && SinexFile.SolutionEstimateBlock.HasItems) { sb.AppendLine(SinexFile.SolutionEstimateBlock.ToString()); sb.AppendLine(divLine); } if (SinexFile.SolutionNormalEquationVectorBlock != null && SinexFile.SolutionNormalEquationVectorBlock.HasItems) { sb.AppendLine(SinexFile.SolutionNormalEquationVectorBlock.ToString()); sb.AppendLine(divLine); } if (SinexFile.SolutionMatrixEstimateCova != null && SinexFile.SolutionMatrixEstimateCova.HasItems) { sb.AppendLine(SinexFile.SolutionMatrixEstimateCova.ToString(BlockTitle.SOLUTION_MATRIX_ESTIMATE_L_COVA)); sb.AppendLine(divLine); } if (SinexFile.SolutionMatrixAprioriCova != null && SinexFile.SolutionMatrixAprioriCova.HasItems) { sb.AppendLine(SinexFile.SolutionMatrixAprioriCova.ToString(BlockTitle.SOLUTION_MATRIX_APRIORI_L_COVA)); sb.AppendLine(divLine); } sb.AppendLine("%ENDSNX"); return(sb.ToString()); }
/// <summary> /// 提取具有的测站名称 /// </summary> /// <param name="fileA">SinexFile</param> /// <param name="namesB">测站名称</param> /// <returns></returns> public static List <string> GetSameSiteCodes(SinexFile fileA, List <string> namesB) { return(fileA.GetSiteCods().FindAll(m => namesB.Contains(m))); }
/// <summary> /// 读取解析 Sinex 文件。 /// </summary> /// <param name="stream"></param> /// <param name="skipMatrix"></param> /// <returns></returns> public static SinexFile Read(Stream stream, string name = "SinexName", bool skipMatrix = false) { SinexFile file = new SinexFile(); file.Name = name; using (StreamReader reader = new StreamReader(stream)) { string line = ""; //第一行 line = reader.ReadLine(); file.Header = SinexFileHeader.Read(line); //第二行后 while ((line = reader.ReadLine()) != null) { if (line.StartsWith(CharDefinition.COMMENT)) { continue; //注释 } if (line.StartsWith(CharDefinition.TITLE_START)) //+ { string title = line.Substring(1).Trim(); switch (title) { case BlockTitle.FILE_REFERENCE: file.FileReferBlock = FileReferBlock.Read(reader); break; case BlockTitle.FILE_COMMENT: file.FileCommentBlock = BlockLineFactory.Read <FileComment>(reader, title); break; case BlockTitle.INPUT_HISTORY: file.InputHistoryBlock = BlockLineFactory.Read <InputHistory>(reader, title); break; case BlockTitle.INPUT_FILES: file.InputFilesBlock = BlockLineFactory.Read <InputFile>(reader, title); break; case BlockTitle.INPUT_ACKNOWLEDGEMENTS: file.FileAcknowledgementBlock = BlockLineFactory.Read <FileAcknowledgement>(reader, title); break; case BlockTitle.SATELLITE_ID: file.SatelliteIdBlock = BlockLineFactory.Read <SatelliteId>(reader, title); break; case BlockTitle.SATELLITE_PHASE_CENTER: file.SatellitePhaseCenterBlock = BlockLineFactory.Read <SatellitePhaseCenter>(reader, title); break; case BlockTitle.SITE_ID: file.SiteIdBlock = BlockLineFactory.Read <SiteId>(reader, title); break; case BlockTitle.SITE_RECEIVER: file.SiteReceiverBlock = BlockLineFactory.Read <SiteReceiver>(reader, title); break; case BlockTitle.SITE_ANTENNA: file.SiteAntennaBlock = BlockLineFactory.Read <SiteAntenna>(reader, title); break; case BlockTitle.SITE_GPS_PHASE_CENTER: file.SiteGpsPhaseCenterBlock = BlockLineFactory.Read <SiteGpsPhaseCenter>(reader, title); break; case BlockTitle.SITE_ECCENTRICITY: file.SiteEccentricityBlock = BlockLineFactory.Read <SiteEccentricity>(reader, title); break; case BlockTitle.SOLUTION_STATISTICS: file.SolutionStattisticsBlock = BlockLineFactory.Read <SolutionStatistic>(reader, title); break; case BlockTitle.SOLUTION_EPOCHS: file.SolutionEpochBlock = BlockLineFactory.Read <SolutionEpoch>(reader, title); break; case BlockTitle.SOLUTION_ESTIMATE: file.SolutionEstimateBlock = BlockLineFactory.Read <SolutionValue>(reader, title); break; case BlockTitle.SOLUTION_APRIORI: file.SolutionAprioriBlock = BlockLineFactory.Read <SolutionValue>(reader, title); break; case BlockTitle.SOLUTION_MATRIX_ESTIMATE_U_COVA: case BlockTitle.SOLUTION_MATRIX_ESTIMATE_L_COVA: if (!skipMatrix) { file.SolutionMatrixEstimateCova = (SolutionMatrixBlock)BlockLineFactory.Read <SolutionMatrixBlock, MatrixLine>(reader, title); } break; case BlockTitle.SOLUTION_MATRIX_APRIORI_U_COVA: case BlockTitle.SOLUTION_MATRIX_APRIORI_L_COVA: if (!skipMatrix) { file.SolutionMatrixAprioriCova = (SolutionMatrixBlock)BlockLineFactory.Read <SolutionMatrixBlock, MatrixLine>(reader, title); } break; case BlockTitle.SOLUTION_NORMAL_EQUATION_VECTOR: if (!skipMatrix) { file.SolutionNormalEquationVectorBlock = BlockLineFactory.Read <SolutionNomalEquationVector>(reader, title); } break; case BlockTitle.SOLUTION_NORMAL_EQUATION_MATRIX_U: case BlockTitle.SOLUTION_NORMAL_EQUATION_MATRIX_L: if (!skipMatrix) { file.SolutionNormalEquationMatrix = (SolutionMatrixBlock)BlockLineFactory.Read <SolutionMatrixBlock, MatrixLine>(reader, title); } break; default: break; } } } } return(file); }