/// <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); }
/// <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); }