/// <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;
        }
Beispiel #2
0
        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);
        }
Beispiel #4
0
        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;
        }
Beispiel #6
0
        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);//
        }
Beispiel #7
0
        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);
        }
Beispiel #8
0
        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);
        }
Beispiel #9
0
        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);
        }
Beispiel #10
0
        /// <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);
        }
Beispiel #11
0
        /// <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);
        }
Beispiel #12
0
        /// <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);//
        }