/// <summary> /// 获取指定时刻太阳的位置。 /// </summary> /// <param name="Time">时间</param> /// <returns></returns> public void GetSunPosition(Time time, ErpItem erpv, ref XYZ rsun) { var item2 = GetOrCreate(time, erpv); // sunmoonPosition.GetPosition(Time, erpv); rsun = item2.SunXyz;//.rSun; }
public override void Correct(EpochSatellite epochSatellite) { Time gpsTime = epochSatellite.RecevingTime; IEphemeris sat = epochSatellite.Ephemeris; SatelliteNumber prn = epochSatellite.Prn; //计算太阳位置方法 //XYZ sunPosition = epochSatellite.EpochInfo.DataSouceProvider.UniverseObjectProvider.GetSunPosition(gpsTime); //新的计算太阳位置方法 Time tutc = gpsTime.GpstToUtc(); //查找地球自转信息 Gnsser.Data.ErpItem erpv = null; if (DataSouceProvider.ErpDataService != null) { erpv = DataSouceProvider.ErpDataService.Get(tutc); } if (erpv == null) { erpv = ErpItem.Zero; } XYZ sunPosition = new XYZ(); DataSouceProvider.UniverseObjectProvider.GetSunPosition(gpsTime, erpv, ref sunPosition); //use L1 value IAntenna antenna = DataSouceProvider.AntennaDataSource.Get(prn.ToString(), gpsTime); if (antenna == null) { return; } string AntennaType = antenna.AntennaType; XYZ svPos = sat.XYZ; XYZ receiverPosition = epochSatellite.SiteInfo.EstimatedXyz; if (receiverPosition.Equals(XYZ.Zero)) { return; } bool cycleSlip = epochSatellite.IsUnstable; if (cycleSlip || !PhaseManager.Contains(prn)) //a cycle slip happend { PhaseManager[prn] = new SatVectorPhase(); } double windUpCorrection = GetSatPhaseWindUpCorectValue(prn, gpsTime, svPos, receiverPosition, sunPosition, AntennaType); //double windUpCorrection2 = GetSatPhaseWindUpCorectValue(satelliteType, gpsTime, svPos, receiverPosition, epochSatellite, sunPosition); this.Correction = (windUpCorrection); }
/// <summary> /// 计算 /// </summary> /// <param name="time"></param> /// <param name="erpv"></param> /// <returns></returns> public SunMoonTime GetOrCreate(Time time, ErpItem erpv) { var key = BuildKey(time); if (!SunMoonTimeStorage.Contains(key)) { lock (locker) { if (!SunMoonTimeStorage.Contains(key)) { SunMoonTime item = new SunMoonTime(); sunmoonPosition.GetPosition(time, erpv); item.SunXyz = sunmoonPosition.rSun; item.MoonXyz = sunmoonPosition.rMoon; item.Gmst = sunmoonPosition.gmst; //return key; SunMoonTimeStorage.Add(key, item); } } } var item2 = SunMoonTimeStorage.Get(key); return(item2); }
public override void Correct(EpochInformation epochInformation) { Time gpsTime = epochInformation.ReceiverTime;//.CorrectedTime; XYZ reciverPosition = epochInformation.SiteInfo.EstimatedXyz; //查找地球自转信息 //gpst2utc Time tutc = gpsTime.GpstToUtc(); Gnsser.Data.ErpItem erpv = null; if (DataSouceProvider.ErpDataService != null) { erpv = DataSouceProvider.ErpDataService.Get(tutc); } if (erpv == null) { erpv = ErpItem.Zero; } var pos = DataSouceProvider.UniverseObjectProvider.GetOrCreate(gpsTime, erpv); //Gnsser.Data.ErpItem erpv = epochInformation.DataSouceProvider.ErpDataService.Gete); //XYZ sunPos = new XYZ(); XYZ moonPos = new XYZ(); double gmst = 0.0; //epochInformation.DataSouceProvider.UniverseObjectProvider.GetSunPosition(gpsTime, erpv, ref sunPos, ref moonPos,ref gmst); NEU correction = GetSolidTidesCorrectValue(gpsTime, reciverPosition, pos.SunXyz, pos.MoonXyz); this.Correction = (correction); }
/// <summary> /// 获取指定时刻太阳与月亮的位置 /// </summary> /// <param name="time"></param> /// <param name="erpv"></param> /// <param name="rsun"></param> /// <param name="rmoon"></param> /// <param name="gmst"></param> public void GetSunPosition(Time time, ErpItem erpv, ref XYZ rsun, ref XYZ rmoon, ref double gmst) { var item2 = GetOrCreate(time, erpv); rmoon = item2.MoonXyz; rsun = item2.SunXyz; gmst = item2.Gmst; }
public override void Correct(EpochSatellite epochSatellite) { if (AntennaDataSource == null || SatInfoService == null) { return; } Time gpsTime = epochSatellite.RecevingTime; // XYZ sunPosition = epochSatellite.EpochInfo.DataSouceProvider.UniverseObjectProvider.GetSunPosition(gpsTime);// 这个可以每个历元算一次,有待优化。???czs 2014.10.05 //下面是新的计算太阳位置 Time tutc = gpsTime.GpstToUtc(); //查找地球自转信息 Gnsser.Data.ErpItem erpv = null; if (ErpDataService != null) { erpv = ErpDataService.Get(tutc); } if (erpv == null) { erpv = ErpItem.Zero; } XYZ sunPosition = new XYZ(); UniverseObjectProvider.GetSunPosition(gpsTime, erpv, ref sunPosition); IEphemeris sat = epochSatellite.Ephemeris; XYZ svPos = sat.XYZ; XYZ receiverPosition = epochSatellite.SiteInfo.EstimatedXyz; SatelliteNumber prn = epochSatellite.Prn; SatInfoFile periodSatInfoCollection = SatInfoService.SatInfoFile; IAntenna antenna = AntennaDataSource.Get(prn.ToString(), gpsTime); double correction = GetSatPhaseCenterCorectValue(prn, gpsTime, svPos, receiverPosition, sunPosition, periodSatInfoCollection, antenna); this.Correction = (correction);// }
public override void Correct(EpochInformation epochInformation) { string markerName = epochInformation.SiteInfo.SiteName; // Time gpsTime = epochInformation.CorrectedTime; Time gpsTime = epochInformation.ReceiverTime; //gpst2utc Time tutc = gpsTime.GpstToUtc(); //查找地球自转信息 Gnsser.Data.ErpItem erpv = null; if (DataSouceProvider.ErpDataService != null) { erpv = DataSouceProvider.ErpDataService.Get(tutc); } if (erpv == null) { erpv = ErpItem.Zero; } //GPS时转UTC时,再加上ERP改正 gpsTime = tutc + erpv.Ut12Utc; // Geo.Algorithm.Matrix harmonics = new Geo.Algorithm.Matrix(6, 11, 0.0); // harmonics = epochInformation.AssistantInfo.Harmonics; if (markerName.Length > 4) { markerName = markerName.Substring(0, 4); } Geo.Algorithm.IMatrix harmonics = DataSouceProvider.OceanLoadingDataSource.Get(markerName); //GPSTK模块 // NEU correction = GetOceanTidesCorrectValue(gpsTime, harmonics); //RTKLIB模块 NEU correction = GetOceanTidesCorrectValue1(gpsTime, harmonics); this.Correction = (correction); }
public override void Correct(EpochInformation epochInformation) { Time gpsTime = epochInformation.ReceiverTime;//.CorrectedTime; XYZ reciverPosition = epochInformation.SiteInfo.EstimatedXyz; GeoCoord geoCoord = epochInformation.SiteInfo.ApproxGeoCoord; if (XYZ.IsZeroOrEmpty(reciverPosition)) { this.Correction = NEU.Zero; return; } //GPS时转UTC时 Time tutc = gpsTime.GpstToUtc(); //查找ERP信息 //查找地球自转信息 Gnsser.Data.ErpItem erpv = null; if (DataSouceProvider.ErpDataService != null) { erpv = DataSouceProvider.ErpDataService.Get(tutc); } if (erpv == null) { erpv = ErpItem.Zero; } //EarthPoleDisplacement double xp = erpv.Xpole;//arcsec double yp = erpv.Ypole; //RTKLIB的极潮改正模块 // NEU correction = GetPoleTidesCorrectValue2(reciverPosition, xp, yp); //GPSTK的极潮改正模块 NEU correction = GetPoleTidesCorrectValue(gpsTime, reciverPosition, xp, yp, geoCoord); this.Correction = (correction); }
public override void Correct(EpochInformation epochInformation) { if (XYZ.IsZeroOrEmpty(epochInformation.SiteInfo.EstimatedXyz) || epochInformation.EnabledSatCount == 0 || epochInformation.ReceiverTime.IsZero) { this.Correction = new NEU(); return; } // Time gpsTime = epochInformation.CorrectedTime; Time gpsTime = epochInformation.ReceiverTime; XYZ reciverPosition = epochInformation.SiteInfo.EstimatedXyz; GeoCoord geoPosition = epochInformation.SiteInfo.ApproxGeoCoord; XYZ rsun = new XYZ(); XYZ rmoon = new XYZ(); double gmst = 0; //gpst2utc Time tutc = gpsTime.GpstToUtc(); //查找地球自转信息 Gnsser.Data.ErpItem erpv = null; if (DataSouceProvider.ErpDataService != null) { erpv = DataSouceProvider.ErpDataService.Get(tutc); } if (erpv == null) { erpv = ErpItem.Zero; } Time tut = tutc + erpv.Ut12Utc; //采用RTKLIB的太阳月亮位置计算方法(历书计算方法不同,相关文献表明对最终的定位精度影响差别不大) DataSouceProvider.UniverseObjectProvider.GetSunPosition(gpsTime, erpv, ref rsun, ref rmoon, ref gmst); NEU Correction = GetSolidTidesCorrectValue(geoPosition, reciverPosition, rsun, rmoon, gmst); this.Correction = (Correction); }
/// <summary> /// 读取卫星信息。 /// 由于卫星信息文件较小,这里一次性读取完毕。 /// </summary> /// <returns></returns> public ErpFile Read() { ErpFile ErpFile = new ErpFile(); ErpFile.Name = Path.GetFileName(FilePath); //log.Debug("暂未启用ERP文件!"); //return ErpFile; using (StreamReader sr = new StreamReader(FilePath)) { string line = null; //前四行没有用 line = sr.ReadLine(); line = sr.ReadLine(); line = sr.ReadLine(); line = sr.ReadLine(); //2018.6.7 kyc add if (Path.GetFileName(FilePath).ToString().Contains("cod") || Path.GetFileName(FilePath).ToString().Contains("com")) { line = sr.ReadLine(); line = sr.ReadLine(); } if (Path.GetFileName(FilePath).ToString().Contains("gfz")) { line = sr.ReadLine(); } while ((line = sr.ReadLine()) != null)//czs, 2018.06.09, 改回 { if (String.IsNullOrEmpty(line)) { continue; } //while (!string.IsNullOrEmpty(line = sr.ReadLine()))//kyc: 部分erp文件有无谓的换行符 //{ string[] strs = line.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); double mjd = 0; if (strs.Length < 16 || !double.TryParse(strs[1], out mjd)) { continue; } //此处保留先,ERP加上后,反而精度变得很差//2016.01.29, czs, hongqing //if (strs.Length != 16) // continue; ErpItem item = new ErpItem(); item.Mjd = double.Parse(strs[0]); item.Xpole = double.Parse(strs[1]) * 1E-6; item.Ypole = double.Parse(strs[2]) * 1E-6; item.Ut12Utc = double.Parse(strs[3]) * 1E-7; item.Lod = double.Parse(strs[4]) * 1E-7; item.Xsig = double.Parse(strs[5]) * 1E-6; item.Ysig = double.Parse(strs[6]) * 1E-6; item.UTsig = double.Parse(strs[7]) * 1E-7; item.LODsig = double.Parse(strs[8]) * 1E-7; item.Nr = double.Parse(strs[9]); item.Nf = double.Parse(strs[10]); item.Nt = double.Parse(strs[11]); item.Xrt = double.Parse(strs[12]) * 1E-6; item.Yrt = double.Parse(strs[13]) * 1E-6; item.Xrtsig = double.Parse(strs[14]) * 1E-6; item.Yrtsig = double.Parse(strs[15]) * 1E-6; ErpFile.Add(item.Mjd, item); } } return(ErpFile); }
/// <summary> /// 崔阳老算法。 /// </summary> /// <param name="date"></param> /// <returns></returns> private ErpItem GetErp(Time date) { //以下为具体算法 double mjd = (double)date.MJulianDays; Time ep = new Time(2000, 1, 1, 12); double mjd0 = 51544.5 + (double)(date - ep) / 86400.0; if (mjd != mjd0) { mjd = mjd0; } if (Erps.Count == 0) { return(ErpItem.Zero); } ErpItem erpItem = Erps.ElementAt(0).Value; if (mjd <= Erps.ElementAt(0).Value.Mjd - mjd) { if (Erps.ElementAt(0).Value.Mjd - mjd <= 1.5) { double day = mjd - Erps.ElementAt(0).Value.Mjd; erpItem = Erps.ElementAt(0).Value; erpItem.Xpole += erpItem.Xrt * day; erpItem.Ypole += erpItem.Yrt * day; erpItem.Ut12Utc -= erpItem.Lod * day; return(erpItem); } else { erpItem = new ErpItem(); return(erpItem); } } if (mjd >= Erps.ElementAt(Erps.Count - 1).Value.Mjd) { if (mjd - Erps.ElementAt(0).Value.Mjd <= 1.5) { double day = mjd - Erps.ElementAt(Erps.Count - 1).Value.Mjd; erpItem = Erps.ElementAt(Erps.Count - 1).Value; erpItem.Xpole += erpItem.Xrt * day; erpItem.Ypole += erpItem.Yrt * day; erpItem.Ut12Utc -= erpItem.Lod * day; return(erpItem); } else { erpItem = new ErpItem(); return(erpItem); } } int i = 0, j, k; for (j = 0, k = Erps.Count - 1; j <= k;) { i = (j + k) / 2; if (mjd < Erps.ElementAt(i).Value.Mjd) { k = i - 1; } else { j = i + 1; } } for (i = 0; i < Erps.Count - 1; i++) { double t0 = Erps.ElementAt(i).Value.Mjd; double t1 = Erps.ElementAt(i + 1).Value.Mjd; if (t0 < mjd && t1 > mjd) { j = i; break; } } //add by czs, 2016.06.29 if (j + 1 > 6) { j = 5; } double a = 0.5; if (Erps.ElementAt(j).Value.Mjd == mjd - Erps.ElementAt(j + 1).Value.Mjd) { a = 0.5; } else { a = (mjd - Erps.ElementAt(j + 1).Value.Mjd) / (Erps.ElementAt(j).Value.Mjd - Erps.ElementAt(j + 1).Value.Mjd); } erpItem = Erps.ElementAt(j).Value; erpItem.Xpole = (1.0 - a) * Erps.ElementAt(j).Value.Xpole + a * Erps.ElementAt(j + 1).Value.Xpole; erpItem.Ypole = (1.0 - a) * Erps.ElementAt(j).Value.Ypole + a * Erps.ElementAt(j + 1).Value.Ypole; erpItem.Ut12Utc = (1.0 - a) * Erps.ElementAt(j).Value.Ut12Utc + a * Erps.ElementAt(j + 1).Value.Ut12Utc; erpItem.Lod = (1.0 - a) * Erps.ElementAt(j).Value.Lod + a * Erps.ElementAt(j + 1).Value.Lod; return(erpItem); }
/// <summary> /// 改正 /// </summary> /// <param name="epochSatellite"></param> public override void Correct(EpochSatellite epochSatellite) { if (AntennaDataSource == null || SatInfoService == null) { return; } //Time gpsTime = epochSatellite.RecevingTime; Time emmissiontime = epochSatellite.EmissionTime; // XYZ sunPosition = epochSatellite.EpochInfo.DataSouceProvider.UniverseObjectProvider.GetSunPosition(gpsTime);// 这个可以每个历元算一次,有待优化。???czs 2014.10.05 //下面是新的计算太阳位置 //Time tutc = gpsTime.GpstToUtc(); //查找地球自转信息 Gnsser.Data.ErpItem erpv = null; if (ErpDataService != null) { //erpv = ErpDataService.Get(tutc); erpv = ErpDataService.Get(emmissiontime); } if (erpv == null) { erpv = ErpItem.Zero; } XYZ sunPosition = new XYZ(); UniverseObjectProvider.GetSunPosition(emmissiontime, erpv, ref sunPosition); //UniverseObjectProvider.GetSunPosition(gpsTime, erpv, ref sunPosition); IEphemeris sat = epochSatellite.Ephemeris; XYZ svPos = sat.XYZ; XYZ receiverPosition = epochSatellite.SiteInfo.EstimatedXyz; var prn = epochSatellite.Prn; var satType = prn.SatelliteType; SatInfoFile periodSatInfoCollection = SatInfoService.SatInfoFile; IAntenna antenna = AntennaDataSource.Get(prn.ToString(), emmissiontime); if (antenna == null) { if (!noAntSats.Contains(prn)) { log.Warn(prn + " 没有获取到天线信息!"); noAntSats.Add(prn); } return; } List <RinexSatFrequency> frequences = epochSatellite.RinexSatFrequences; Dictionary <RinexSatFrequency, double> correction = new Dictionary <RinexSatFrequency, double>(); GeoCoord rcvGeoCoord = epochSatellite.SiteInfo.ApproxGeoCoord; int i = 0; foreach (var item in frequences) { double rang = GetSatPhaseCenterCorectValue(prn, item, emmissiontime, svPos, receiverPosition, rcvGeoCoord, sunPosition, periodSatInfoCollection, antenna); if (rang != 0 && frequences.Count > i) { correction.Add(frequences[i], rang); } i++; } this.Correction = (correction);// }