Beispiel #1
0
        /// <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)));
        }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
        /// <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);
        }
Beispiel #4
0
        /// <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);
        }
Beispiel #5
0
        //  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());
        }
Beispiel #6
0
 /// <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)));
 }
Beispiel #7
0
        /// <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);
        }