/// <summary>
        /// 格式化输出的头部。若启用 删除观测值为 0 的数据。 则需要缓存。
        /// </summary>
        /// <param name="OldHeader"></param>
        /// <returns></returns>
        private RinexObsFileHeader BuildOutputHeader(RinexObsFileHeader OldHeader)
        {
            RinexObsFileHeader newHeader = (RinexObsFileHeader)OldHeader.Clone();

            //输出版本
            if (Option.IsEnableRinexVertion)
            {
                newHeader.Version = this.Option.Version;
                log.Info("输出版本:" + Option.Version);
            }
            if (Option.IsUseFileNameAsSiteName)
            {
                newHeader.SiteInfo.SiteName = Gdp.Utils.StringUtil.SubString(newHeader.FileName.ToUpper(), 0, Option.SiteNameLength.Value);
            }
            if (Option.SiteNameLength.Enabled)
            {
                newHeader.SiteInfo.SiteName = Gdp.Utils.StringUtil.SubString(newHeader.SiteInfo.SiteName, 0, Option.SiteNameLength.Value);
            }
            if (Option.IsUpperSiteName)
            {
                newHeader.SiteInfo.SiteName = newHeader.SiteInfo.SiteName.ToUpper();
            }

            //采用间隔
            if (Option.IsEnableInterval)
            {
                newHeader.Interval = Option.Interval;
                log.Info("指定的采样率:" + Option.Interval);
            }

            //是否启用卫星系统过滤, 为修改 header.ObsCodes,不仅如此,内容也要及时删除,以免多余劳动
            if (Option.IsEnableSatelliteTypes)
            {
                newHeader.RemoveOther(Option.SatelliteTypes);
                log.Info("将移除非此系统:" + Gdp.Utils.StringUtil.ToString(Option.SatelliteTypes));
            }

            //移除对于无电离层组合多余的观测量
            if (Option.IsRemoveRedundantObsForIonoFree)
            {
                newHeader.IsRemoveRedundantObsForIonoFree();
                log.Info("移除对于双频无电离层组合多余的观测值");
            }

            //删除观测值为 0 的数据。
            if (Option.IsEnableMinObsCodeAppearRatio)
            {
                //缓存
                var tables = BuildObsCodeTables(newHeader.ObsCodes); //采用新头部的

                var ratios = GetObsCodeRatios(tables);

                //出现率低于 x 的代码
                var minRatio = Option.MinObsCodeAppearRatio;
                this.ObsCodesToBeRemove = new Dictionary <SatelliteType, List <string> >();
                var ObsCodes = new Dictionary <SatelliteType, List <string> >();

                foreach (var kv in ratios)
                {
                    List <string> okCodes  = new List <string>();
                    List <string> badCodes = new List <string>();
                    foreach (var item in kv.Value)
                    {
                        if (item.Value > minRatio)
                        {
                            okCodes.Add(item.Key);
                        }
                        else
                        {
                            badCodes.Add(item.Key);
                        }
                        if (item.Value != 1)
                        {
                            log.Info(FileName + "  " + kv.Key + " " + item.Key + " 出勤率 " + item.Value);
                        }
                    }
                    ObsCodes.Add(kv.Key, okCodes);
                    ObsCodesToBeRemove.Add(kv.Key, badCodes);
                }

                newHeader.ObsCodes = ObsCodes;
            }

            //删除其它观测码
            if (Option.IsReomveOtherCodes)
            {
                foreach (var collection in newHeader.ObsCodes)
                {
                    List <string> tobeRemoves = new List <string>();
                    foreach (var item in collection.Value)
                    {
                        if (!Option.OnlyCodes.Contains(item))
                        {
                            tobeRemoves.Add(item);
                        }
                    }
                    foreach (var item in tobeRemoves)
                    {
                        collection.Value.Remove(item);
                    }
                }
                log.Info("将移除非此观测码:" + Gdp.Utils.StringUtil.ToString(Option.ObsCodes));
            }

            if (Option.IsEnableObsTypes)
            {
                newHeader.RemoveOther(Option.ObsTypes);
            }


            //删除观测频率
            if (Option.IsEnableRemoveIndicatedFrequence)
            {
                foreach (var collection in newHeader.ObsCodes)
                {
                    List <string> tobeRemoves = new List <string>();
                    foreach (var item in collection.Value)
                    {
                        foreach (var freqNum in Option.FrequenceNumToBeRemoved)
                        {
                            if (item.Contains(freqNum.ToString()))
                            {
                                tobeRemoves.Add(item); break;
                            }
                        }
                    }
                    foreach (var item in tobeRemoves)
                    {
                        collection.Value.Remove(item);
                    }
                }
                log.Info("将移除频率:" + Gdp.Utils.StringUtil.ToString(Option.FrequenceNumToBeRemoved));
            }


            return(newHeader);
        }
예제 #2
0
        /// <summary>
        /// 格式化输出的头部。
        /// </summary>
        /// <param name="OldHeader"></param>
        /// <returns></returns>
        private RinexObsFileHeader BuildOutputHeader(RinexObsFileHeader OldHeader)
        {
            RinexObsFileHeader newHeader = (RinexObsFileHeader)OldHeader.Clone();

            //输出版本
            if (Option.IsEnableRinexVertion)
            {
                newHeader.Version = this.Option.Version;
                log.Info("输出版本:" + Option.Version);
            }

            //采用间隔
            if (Option.IsEnableInterval)
            {
                newHeader.Interval = Option.Interval;
                log.Info("指定的采样率:" + Option.Interval);
            }

            //是否启用卫星系统过滤, 为修改 header.ObsCodes,不仅如此,内容也要及时删除,以免多余劳动
            if (Option.IsEnableSatelliteTypes)
            {
                newHeader.RemoveOther(Option.SatelliteTypes);
                log.Info("将移除非此系统:" + Geo.Utils.StringUtil.ToString(Option.SatelliteTypes));
            }

            //观测类型过滤
            if (Option.IsEnableObsTypes)
            {
                newHeader.RemoveOther(Option.ObsTypes);
                log.Info("将移除非此观测值:" + Geo.Utils.StringUtil.ToString(Option.ObsTypes));
            }


            //删除观测值为 0 的数据。
            if (Option.IsEnableMinObsCodeAppearRatio)
            {
                //缓存
                var tables = BuildObsCodeTables(newHeader.ObsCodes); //采用新头部的

                var ratios = GetObsCodeRatios(tables);

                //出现率低于 x 的代码
                var minRatio = Option.MinObsCodeAppearRatio;
                this.ObsCodesToBeRemove = new Dictionary <SatelliteType, List <string> >();
                var ObsCodes = new Dictionary <SatelliteType, List <string> >();

                foreach (var kv in ratios)
                {
                    List <string> okCodes  = new List <string>();
                    List <string> badCodes = new List <string>();
                    foreach (var item in kv.Value)
                    {
                        if (item.Value > minRatio)
                        {
                            okCodes.Add(item.Key);
                        }
                        else
                        {
                            badCodes.Add(item.Key);
                        }
                        if (item.Value != 1)
                        {
                            log.Info(FileName + "  " + kv.Key + " " + item.Key + " 出勤率 " + item.Value);
                        }
                    }
                    ObsCodes.Add(kv.Key, okCodes);
                    ObsCodesToBeRemove.Add(kv.Key, badCodes);
                }

                newHeader.ObsCodes = ObsCodes;
            }

            //删除其它观测码
            if (Option.IsReomveOtherCodes)
            {
                foreach (var collection in newHeader.ObsCodes)
                {
                    List <string> tobeRemoves = new List <string>();
                    foreach (var item in  collection.Value)
                    {
                        if (!Option.OnlyCodes.Contains(item))
                        {
                            tobeRemoves.Add(item);
                        }
                    }
                    foreach (var item in tobeRemoves)
                    {
                        collection.Value.Remove(item);
                    }
                }
                log.Info("将移除非此观测码:" + Geo.Utils.StringUtil.ToString(Option.ObsCodes));
            }

            return(newHeader);
        }