protected void OnObsHeaderUpdated(RinexObsFileHeader obj) { if (obj == null) { return; } if (ObsHeaderUpdated != null) { ObsHeaderUpdated(obj); } }
/// <summary> /// 生成头部文件。此处采用一个观测历元生成是有缺陷的!!后续观测可能会增加卫星!czs, 2015.12.25 /// </summary> /// <param name="epochInfo"></param> /// <returns></returns> public RinexObsFileHeader BuildHeader(EpochInformation epochInfo) { RinexObsFileHeader header = new RinexObsFileHeader( epochInfo.ObsInfo.Clone() as IObsInfo, epochInfo.SiteInfo.Clone() as ISiteInfo ); header.ObsCodes = BuildObsCodes(epochInfo); header.Comments.Add("obs codes built from the epoch " + epochInfo.ReceiverTime); return(header); }
public void ReWriteHeader(RinexObsFileHeader obj) { if (!IsObsHeaderWrited) { WriteHeader(obj); } else { RinexObsFileWriter.ReWriteHeader(obj); } }
/// <summary> /// 构建子时段名称,精确到分钟,以示区别。 /// </summary> /// <param name="current"></param> /// <param name="header"></param> /// <returns></returns> private string BuildSectionFileName(RinexEpochObservation current, RinexObsFileHeader header) { RinexFileNameBuilder nameBuilder = new RinexFileNameBuilder(); return(nameBuilder.Build(header)); var fileName = Path.GetFileNameWithoutExtension(this.FilePath); var extension = Path.GetExtension(this.FilePath); return(fileName + current.ReceiverTime.Hour.ToString("00") + "." + current.ReceiverTime.Minute.ToString("00") + extension); }
/// <summary> /// 构造函数 /// </summary> /// <param name="header"></param> public ObsAnalysisInfo(RinexObsFileHeader header) { this.SiteObsInfo = header; WidthFixedParamReader reader = new WidthFixedParamReader(); var paramDic = reader.GetParamFromHeader(header); this.MultipathFactors = new Dictionary <FrequenceType, double>(); if (paramDic.ContainsKey("A_MP")) { this.MultipathFactors.Add(FrequenceType.A, Double.Parse(paramDic["A_MP"])); this.MultipathFactors.Add(FrequenceType.B, Double.Parse(paramDic["B_MP"])); } }
/// <summary> /// 创建头部信息 默认 3.02 版本 /// </summary> /// <returns></returns> protected RinexObsFileHeader CreateOFileHeader(double version = 3.02) { RinexObsFileHeader header = new RinexObsFileHeader(); header.Version = version; header.MarkerName = SiteName; header.SetTypeOfObserves(SatelliteType.G, new List <string>() { "C1X", "L1X", "P2X", "L2X" }); header.ApproxXyz = new Geo.Coordinates.XYZ(); header.Hen = new Geo.Coordinates.HEN(); return(header); }
/// <summary> /// 构建头部信息 /// </summary> /// <param name="table"></param> /// <returns></returns> public RinexObsFileHeader BuidHeader(ObjectTableStorage table) { var colNames = table.ParamNames; var indexName = table.GetIndexColName(); var secondColName = colNames[1]; var startEpochTime = (DateTime)table.FirstIndex; var endEpoch = (DateTime)table.LastIndex; var interval = (int)((DateTime)table.SecondIndex - startEpochTime).TotalSeconds; RinexObsFileHeader header = new RinexObsFileHeader(); header.Interval = interval; header.StartTime = new Geo.Times.Time(startEpochTime); header.EndTime = new Geo.Times.Time(endEpoch); header.Version = secondColName.Length >= 7 ? 3.02 : 2.11; header.Comments.Add("Build from " + table.Name); var obsCodes = new Dictionary <SatelliteType, List <string> >(); foreach (var name in colNames) { if (indexName == name) { continue; } var prn = SatelliteNumber.Parse(name); if (!obsCodes.ContainsKey(prn.SatelliteType)) { obsCodes[prn.SatelliteType] = new List <string>(); } var list = obsCodes[prn.SatelliteType]; var code = name.Substring(4); if (!list.Contains(code)) { list.Add(code); } } header.ObsCodes = obsCodes; header.MarkerType = obsCodes.Count > 1 ? "M" : header.SatelliteTypes[0] + ""; header.SiteInfo.SiteName = table.Name.Substring(0, 4); return(header); }
/// <summary> /// 从头部对象中提取参数 /// </summary> /// <param name="header"></param> /// <returns></returns> public Dictionary <string, string> GetParamFromHeader(RinexObsFileHeader header) { Dictionary <string, string> data = new Dictionary <string, string>(); var str = ExtractParamStringFromRinexComments(header.Comments); var paires = str.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); foreach (var paramPair in paires) { if (String.IsNullOrWhiteSpace(paramPair)) { continue; } var strs = paramPair.Split('='); data.Add(strs[0], strs[1]); } return(data); }
/// <summary> /// 读取数据 /// </summary> private List <RinexObsFileHeader> ReadFileHeaders(string[] filePathes) { List <RinexObsFileHeader> headers = new List <RinexObsFileHeader>(); foreach (var obsPath in filePathes) { RinexObsFileHeader header = null; RinexObsFileReader obsFileReader; string lastChar = Geo.Utils.StringUtil.GetLastChar(obsPath); string lastChar3 = Geo.Utils.StringUtil.GetLastChar(obsPath, 3); string lastChar5 = Geo.Utils.StringUtil.GetLastChar(obsPath, 5); if (String.Equals(lastChar, "o", StringComparison.CurrentCultureIgnoreCase) || String.Equals(lastChar3, "rnx", StringComparison.CurrentCultureIgnoreCase)) { obsFileReader = new RinexObsFileReader(obsPath); header = obsFileReader.GetHeader(); } if (String.Equals(lastChar, "z", StringComparison.CurrentCultureIgnoreCase) || String.Equals(lastChar3, "crx", StringComparison.CurrentCultureIgnoreCase) || String.Equals(lastChar5, "crx.gz", StringComparison.CurrentCultureIgnoreCase) ) { Geo.IO.InputFileManager inputFileManager = new Geo.IO.InputFileManager(Setting.TempDirectory); var obsPathes = inputFileManager.GetLocalFilePath(obsPath, "*.*o;*.rnx", "*.*"); obsFileReader = new RinexObsFileReader(obsPathes); header = obsFileReader.GetHeader(); } if (header == null) { log.Error("不支持输入文件格式!" + obsPath); } else { headers.Add(header); log.Info("成功读入:" + obsPath); } } return(headers); }
protected override void Run(string[] inputPathes) { this.ProgressBar.Init(new List <string> { "统计", "复制或移动" }, inputPathes.Length); foreach (var path in inputPathes) { RinexObsFileHeader header = RinexObsFileReader.ReadHeader(path); var name = Geo.Utils.StringUtil.SubString(header.MarkerName, 0, LabelCharCount); if (IsIgnoreCase) { name = name.ToUpper(); } Result.GetOrCreate(name).Add(path); this.ProgressBar.PerformProcessStep(); } this.ProgressBar.PerformClassifyStep(Result.Data.Count); int counter = 0; foreach (var item in Result.Data) { if (item.Value.Count > 1) { foreach (var path in item.Value) { var toPath = Path.Combine(OutputDirectory, item.Key, Path.GetFileName(path)); Geo.Utils.FileUtil.CopyOrMoveFile(path, toPath, !IsMoveOrCopy, true); counter++; } } this.ProgressBar.PerformProcessStep(); } var info = "发现了 " + counter + " 个同名测站。已 " + (IsMoveOrCopy ? " 移动!!如在默认临时文件夹,请及时移出!!否则重启后将被清空。 " : " 复制 "); log.Info(info); }
protected override void dataProvider_ObsHeaderCreated(RinexObsFileHeader obj) { this.ObsFile.Header = obj; }
/// <summary> /// 构造函数 /// </summary> /// <param name="header"></param> public RinexEpochInfoBuilder(RinexObsFileHeader header) { this.SatelliteTypes = header.SatelliteTypes; this.RinexVersion = header.Version; }
/// <summary> ///构造函数 /// </summary> /// <param name="header"></param> public ObsAnalysisInfoCollection(RinexObsFileHeader header, string FileName = null) { this.FilePath = FileName; this.SiteObsInfo = header; }
public RtcmMsmMessageConverter(RinexObsFileHeader ObsHeader) { // TODO: Complete member initialization this.ObsHeader = ObsHeader; }
/// <summary> /// 写头部信息 /// </summary> /// <param name="obj"></param> public void WriteHeader(RinexObsFileHeader obj) { RinexObsFileWriter.WriteHeader(obj); IsObsHeaderWrited = true; }
/// <summary> /// 构建子时段名称,精确到分钟,以示区别。 /// </summary> /// <param name="current"></param> /// <returns></returns> private string BuildSectionFileName(EpochInformation current, RinexObsFileHeader header) { RinexFileNameBuilder nameBuilder = new RinexFileNameBuilder(); return(nameBuilder.Build(header)); }
/// <summary> /// 默认构造函数。 /// </summary> /// <param name="TempSubDirectory"></param> /// <param name="header"></param> public ObsSiteInfo(RinexObsFileHeader header, string TempSubDirectory = "Temp") { this.TempSubDirectory = TempSubDirectory; this.SiteObsInfo = header; }
/// <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); }
protected virtual void dataProvider_ObsHeaderUpdated(RinexObsFileHeader obj) { }
protected virtual void dataProvider_ObsHeaderCreated(RinexObsFileHeader obj) { //throw new NotImplementedException(); }
/// <summary> /// 写头部 /// </summary> /// <param name="header"></param> private void WriteHeader(RinexObsFileHeader header) { Writer.WriteHeader(header); }
void RtcmDataParser_ObsHeaderUpdated(RinexObsFileHeader obj) { // RtGnssDataWriter.ReWriteHeader(obj); }
protected override void dataProvider_ObsHeaderUpdated(RinexObsFileHeader obj) { this.ReWriteHeader(obj); }
/// <summary> /// 写头部 /// </summary> /// <param name="header"></param> private void WriteHeader(RinexObsFileHeader header) { Writer.WriteHeader(header); IsHeaderWrited = true; }
/// <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); }