/// <summary> /// 计算 /// </summary> /// <param name="geoCoord"></param> /// <param name="Time"></param> /// <returns></returns> public DopValue Calculate(GeoCoord geoCoord, Time Time) { // var prns = this.EphemerisService.Prns.FindAll(m=>this.SatelliteTypes.Contains(m.SatelliteType)); this.Time = Time; List <Ephemeris> ephs = new List <Ephemeris>(); foreach (var prn in Prns) { if (SatWeights != null && !SatWeights.Contains(prn)) { continue; } ephs.Add(this.EphemerisService.Get(prn, Time)); } var sats = EphemerisUtil.GetSatsInVisible(geoCoord, ephs, CutOffAngle); var xyz = CoordTransformer.GeoCoordToXyz(geoCoord); if (sats.Count == 0) { return(null); } if (sats.Count < 4) { return(new DopValue() { StationXYZ = xyz, Time = sats[0].Time, SatCount = sats.Count }); } return(GetDopValue(xyz, sats)); }
/// <summary> 获取湿分量的系数 ///对流层延迟,第一个是干分量的延迟量,第二个值是湿分量的映射函数系数 /// 高精度的对流层改正 /// 对流层延迟由干、湿分量组成,常用天顶方向的干、湿分量和相应的映射函数表示:detDtrop=detDdry*Mdry(E)+detDwet*Mwet(E) /// 采用Saastamoinen模型改正对流层延迟干分量,将湿延迟分量作为未知参数进行估计,计算湿分量的系数 /// 对流层映射函数采用NMF映射函数 /// lat:测站纬度(弧度),h:测站高程(km),P:测站大气压强(mbar),TProduct:测站温度(k),e:大气中的水汽压(mbar) /// </summary> /// <returns></returns> public static double[] GetDryTropCorrectValue(Time gpsTime, XYZ satPos, XYZ receiverXyz) { Polar p = CoordTransformer.XyzToGeoPolar(satPos, receiverXyz); Geo.Coordinates.GeoCoord geoCoord = Geo.Coordinates.CoordTransformer.XyzToGeoCoord(receiverXyz, Geo.Coordinates.AngleUnit.Radian); //double troCorect = MeteorologyInfluence.TroposphereDelay(geoCoord.Lat, geoCoord.Height, info.ElevatAngle, gpsTime) //double SS = Math.Asin(1); //double SSS = Math.Asin(0); double[] NMF = NeillMF(gpsTime.DayOfYear, geoCoord.Lat, geoCoord.Height, p.Elevation); double zpd = tropol(90, geoCoord.Height / 1000d); double zpd1 = tropol(geoCoord.Lat, geoCoord.Height / 1000d); double zpd11 = tropol1(geoCoord.Lat, geoCoord.Height / 1000.0); double dryZpd = MetSeason(geoCoord.Height, geoCoord.Lat, gpsTime); double TropE = dryZpd * NMF[0];//干分量改正 double[] DryWet = new double[2]; DryWet[0] = TropE; double wetCo = NMF[2];//湿分量系数 DryWet[1] = wetCo; //return wetCo; return(DryWet); }
/// <summary> /// 获取卫星在指定时刻,相对于测站的信息 /// </summary> /// <param name="service"></param> /// <param name="prn"></param> /// <param name="time"></param> /// <returns></returns> public StationSatInfo GetInstantSatInfo(IEphemerisService service, SatelliteNumber prn, Time time) { Geo.Coordinates.XYZ satPos = service.Get(prn, time).XYZ; GeoCoord coord = CoordTransformer.XyzToGeoCoord(satPos); Geo.Coordinates.Polar p = CoordTransformer.XyzToGeoPolar(satPos, StationPos); if (p.Elevation < EleAngle) { return(null); } this.LonLats.Add(new Vector(coord.Lon, coord.Lat) { Tag = prn.ToString() }); //显示到表格 return(new StationSatInfo() { PRN = prn, Time = time, Azimuth = p.Azimuth, ElevatAngle = p.Elevation, Distance = p.Range, Lat = coord.Lat, Lon = coord.Lon, Height = coord.Height, X = satPos.X, Y = satPos.Y, Z = satPos.Z }); }
private void Looper_Looping(Geo.Times.Time time) { TableObject.NewRow(); TableObject.AddItem("Epoch", time); string prefix = ""; int satCount = Prns.Count; foreach (var prn in Prns) { var eph = EphemerisService.Get(prn, time); if (eph == null) { continue; } var satXyz = eph.XYZ; var polar = CoordTransformer.XyzToGeoPolar(satXyz, siteXyz, AngleUnit.Degree); if (cutOff > polar.Elevation) { continue; } prefix = prn.ToString() + "_"; TableObject.AddItem(prefix + "Elevation", polar.Elevation); TableObject.AddItem(prefix + "Azimuth", polar.Azimuth); } }
private void button_showOnMap_Click(object sender, EventArgs e) { if (ShowLayer != null && BaseLineNet != null) { List <AnyInfo.Geometries.Point> pts = new List <AnyInfo.Geometries.Point>(); int netIndex = 0; List <string> addedNames = new List <string>(); foreach (var kv in BaseLineNet.KeyValues) { foreach (var line in kv.Value) { var name = netIndex + "-" + line.BaseLineName.RovName; if (!addedNames.Contains(name)) { pts.Add(new AnyInfo.Geometries.Point(line.EstimatedGeoCoordOfRov, null, name)); addedNames.Add(name); } name = netIndex + "-" + line.BaseLineName.RefName; if (!addedNames.Contains(name)) { var geoCoord = CoordTransformer.XyzToGeoCoord(line.ApproxXyzOfRef); pts.Add(new AnyInfo.Geometries.Point(geoCoord, null, name)); addedNames.Add(name); } } netIndex++; } AnyInfo.Layer layer = AnyInfo.LayerFactory.CreatePointLayer(pts); ShowLayer(layer); } }
private void button_xyzTogeo_Click(object sender, EventArgs e) { try { string splliter = "\t"; AngleUnit unit = AngleUnit; Geo.Referencing.Ellipsoid ellipsoid = Ellipsoid; List <XYZ> xyzs = new List <XYZ>(); foreach (var item in this.textBox_xyz.Lines) { if (item == "") { continue; } xyzs.Add(XYZ.Parse(item)); } StringBuilder sb = new StringBuilder(); var spliter = IsOutSplitByTab ? "\t" : ", "; foreach (var item in xyzs) { GeoCoord geeCoord = CoordTransformer.XyzToGeoCoord(item, ellipsoid, unit); sb.AppendLine(geeCoord.ToString("0.0000000000", spliter)); } this.textBox_geo.Text = sb.ToString(); } catch (Exception ex) { MessageBox.Show(ex.Message); } }
private void button_xyzToNeu_Click(object sender, EventArgs e) { try { List <XYZ> originEcefXyz = GetOriginEcefXyz(); List <XYZ> targetEcefXyz = GetTargetEcefXyz(); ObjectTableManager manager = new ObjectTableManager(); var table = manager.AddTable("ENU"); int count = originEcefXyz.Count; for (int i = 0; i < count; i++) { var oXyz = originEcefXyz[i]; var tXyz = targetEcefXyz[i]; var enu = CoordTransformer.XyzToEnu(tXyz, oXyz); table.NewRow(); table.AddItem("Index", i); table.AddItem("E", enu.E); table.AddItem("N", enu.N); table.AddItem("U", enu.U); } this.objectTableControl1.DataBind(table); }catch (Exception ex) { Geo.Utils.FormUtil.ShowErrorMessageBox(ex.Message); } }
private void button_read_Click(object sender, EventArgs e) { if (fileOpenControl1.FilePathes.Length == 0) { Geo.Utils.FormUtil.ShowWarningMessageBox("文件不存在!"); return; } Headers = ReadFileHeaders(fileOpenControl1.FilePathes); ObjectTableStorage table = new ObjectTableStorage(); foreach (var header in Headers) { table.NewRow(); table.AddItem("Name", header.FileName); table.AddItem("StartEpoch", header.StartTime); table.AddItem("ObsCodes", header.GetReadableObsCodes()); var geocoord = CoordTransformer.XyzToGeoCoord(header.ApproxXyz); table.AddItem("GeoCoord", geocoord); table.AddItem("Interval", header.Interval); table.AddItem("Version", header.Version); table.AddItem("ReceiverType", header.SiteInfo.ReceiverType); table.AddItem("ReceiverNumber", header.SiteInfo.ReceiverNumber); table.AddItem("AntennaType", header.SiteInfo.AntennaType); table.AddItem("AntennaNumber", header.SiteInfo.AntennaNumber); table.AddItem("ApproxXyz", header.ApproxXyz); table.AddItem("EndEpoch(MayBe)", header.EndTime); } BindDataSource(table); }
/// <summary> /// 电离层模型改正。返回时间延迟,单位:秒。 /// broadcast iono (coeff.v. icd-200) /// input time: fraction of ut (or gps time of secondOfWeek) (machts nicht) /// </summary> /// <param name="weekSecond">周秒</param> /// <param name="satXyz">卫星位置</param> /// <param name="rcvXyz">接收机位置</param> /// <returns>time delay in fraction</returns> public static double IonoCorrection(double weekSecond, XYZ satXyz, XYZ rcvXyz, IIonoParam ionParam) { //*** divide by pi to funcKeyToDouble radians to semicircles Polar p = CoordTransformer.XyzToGeoPolar(satXyz, rcvXyz, AngleUnit.Radian); //myV.GetLocalPolar(rxPos); //azimuth angle between the user and satellite, measured clockwise positive from the true North (semi-circles) double A = p.Azimuth; // 只参与三角计算,故单位为弧度radians here //elevation angle between the user and satellite (semi-circles) double E = p.Elevation / PI; //半周 GeoCoord geo = CoordTransformer.XyzToGeoCoord(rcvXyz, AngleUnit.Radian); double rcvLat = geo.Lat / PI; //半周 double rcvLon = geo.Lon / PI; //半周 //earth's central angle between the user position and the earth projection of ionospheric intersection point (semi-circles) double psi = GetEarthsCentralAngle(E); double inoLat = GetIonLat(A, rcvLat, psi); double inoLon = GetIonLon(A, rcvLon, psi, inoLat); double ionMLat = GetMeanIonLat(inoLat, inoLon); //*** local time from gps or ut time double tlocal = GetLocalTime(weekSecond, inoLon); //*** magnification factor, amplitude, and period double f = GetF(E); double amp = GetAMP(ionParam, ionMLat); double x = GetX(ionParam, ionMLat, tlocal); return(GetTimeDelay(f, amp, x)); }
private void button_showOnMap_Click(object sender, EventArgs e) { if (ShowLayer != null && this.param != null) { double time = 0; OrbitParamCaculator caculator = new OrbitParamCaculator(); List <XYZ> xyzs = new List <XYZ>(); for (int i = 0; i < 500; i++) { time = i * 10000; XYZ xyz = caculator.GetSatPos(param, time); xyzs.Add(xyz); } List <AnyInfo.Geometries.Point> lonlats = new List <AnyInfo.Geometries.Point>(); int j = 0; foreach (var item in xyzs) { GeoCoord geoCoord = CoordTransformer.XyzToGeoCoord(item); lonlats.Add(new AnyInfo.Geometries.Point(geoCoord, j + "")); j++; } Layer layer = LayerFactory.CreatePointLayer(lonlats); ShowLayer(layer); } }
private void button1_Click(object sender, EventArgs e) { Time time = new Time(this.dateTimePicker1.Value); MoonPosition moon = new MoonPosition(); XYZ moonPos = moon.GetPosition(time); moonGeo = CoordTransformer.XyzToGeoCoord(moonPos); StringBuilder moonSb = new StringBuilder(); moonSb.AppendLine("XYZ:" + moonPos.ToString()); moonSb.AppendLine("GeoCoord:" + moonGeo.ToString()); this.textBox_moon.Text = moonSb.ToString(); SunPosition sun = new SunPosition(); XYZ sunPos = sun.GetPosition(time); sunGeo = CoordTransformer.XyzToGeoCoord(sunPos); StringBuilder sunSb = new StringBuilder(); sunSb.AppendLine("XYZ:" + sunPos.ToString()); sunSb.AppendLine("GeoCoord:" + sunGeo.ToString()); this.textBox_sun.Text = sunSb.ToString(); }
/// <summary> /// 对流程改正。 对流程的改正符号为负数。 /// </summary> /// <param name="gpsTime"></param> /// <param name="satPos"></param> /// <param name="receiverXyz"></param> /// <returns></returns> public static double GetTropoCorrectValue(Time gpsTime, XYZ satPos, XYZ receiverXyz) { Polar p = CoordTransformer.XyzToGeoPolar(satPos, receiverXyz, Geo.Coordinates.AngleUnit.Radian); Geo.Coordinates.GeoCoord geoCoord = Geo.Coordinates.CoordTransformer.XyzToGeoCoord(receiverXyz, Geo.Coordinates.AngleUnit.Radian); double troCorect = MeteorologyInfluence.TroposphereDelay(geoCoord.Lat, geoCoord.Height, p.Elevation, gpsTime); return(troCorect); }
/// <summary> /// 斜距 /// </summary> /// <param name="time"></param> /// <param name="siteXyz"></param> /// <param name="satXyz"></param> /// <returns></returns> public RmsedNumeral GetSlope(Time time, XYZ siteXyz, XYZ satXyz) { var punctPoint = XyzUtil.GetIntersectionXyz(siteXyz, satXyz, HeightOfModel); var geocentricLonLat = Geo.Coordinates.CoordTransformer.XyzToSphere(punctPoint); var SpherePolar = CoordTransformer.XyzToSpherePolar(satXyz, siteXyz, AngleUnit.Degree); var tec = GetSlope(time, geocentricLonLat, SpherePolar.Elevation); return(tec); }
private void button_read_Click(object sender, EventArgs e) { entities = new List <SP3ViewEntity>(); string path = this.textBox_Path.Text; Sp3Reader r = new Sp3Reader(path); sp3 = r.ReadAll(); this.textBox_headInfo.Text = sp3.Header.ToString(); List <SatelliteNumber> Prns = new List <SatelliteNumber>(); foreach (Sp3Section sec in sp3) { foreach (var rec in sec) { if (!Prns.Contains(rec.Prn)) { Prns.Add(rec.Prn); } SP3ViewEntity ent = new SP3ViewEntity(); ent.Time = sec.Time; ent.PRN = rec.Prn; ent.X = rec.XYZ.X; ent.Y = rec.XYZ.Y; ent.Z = rec.XYZ.Z; GeoCoord coord = CoordTransformer.XyzToGeoCoord(rec.XYZ); ent.Lon = coord.Lon; ent.Lat = coord.Lat; ent.Height = coord.Height; if (rec.XyzDot != null) { ent.Xdot = rec.XyzDot.X; ent.Ydot = rec.XyzDot.Y; ent.Zdot = rec.XyzDot.Z; } ent.ClockRate = rec.ClockDrift; ent.Clock = rec.ClockBias; entities.Add(ent); } } this.bindingSource_prns.DataSource = Prns; this.bindingSource1.DataSource = entities; ////设置时间间隔 this.dateTimePicker_from.Value = entities[0].Time.DateTime; this.dateTimePicker_to.Value = entities[entities.Count - 1].Time.DateTime; }
public XYZ GetSiteCoord() { var coordStr = this.textBox_siteCoord.Text; if (this.radioButton_geo.Checked) { var geoCoord = GeoCoord.Parse(coordStr); return(CoordTransformer.GeoCoordToXyz(geoCoord)); } return(XYZ.Parse(coordStr)); }
private void button_xyzToNeu_Click(object sender, EventArgs e) { var siteXYZ = GetSiteCoord(); StringBuilder sb = new StringBuilder(); foreach (var item in GetXyzs()) { var neu = CoordTransformer.XyzToEnu(item, siteXYZ); sb.AppendLine(neu.ToString()); } this.richTextBox_neu.Text = sb.ToString(); }
private void button_neuToXyz_Click(object sender, EventArgs e) { var siteXYZ = GetSiteCoord(); StringBuilder sb = new StringBuilder(); foreach (var item in GetEnus()) { var xyz = CoordTransformer.EnuToXyz(item, siteXYZ); sb.AppendLine(xyz.ToString()); } this.richTextBox_ecefXyz.Text = sb.ToString(); }
private void button_getLonLatFromObsFile_Click(object sender, EventArgs e) { if (openFileDialog_obs.ShowDialog() == DialogResult.OK) { RinexObsFileHeader h = new Data.Rinex.RinexObsFileReader(openFileDialog_obs.FileName).GetHeader(); this.textBox_stationCoord.Text = CoordTransformer.XyzToGeoCoord(h.ApproxXyz, Ellipsoid.WGS84).ToString(); Init(); this.sathelper.StationPos = StationPos; } }
private void button_exportSatHeight_Click(object sender, EventArgs e) { if (!CheckOrInit()) { return; } Time from = new Time(this.dateTimePicker_from.Value); Time to = new Time(this.dateTimePicker_to.Value); StringBuilder sb = new StringBuilder(); sb.Append("Time"); sb.Append("\t"); int i = 0; foreach (var item in this.navFile.Prns) { if (i != 0) { sb.Append("\t"); } sb.Append(item); i++; } sb.AppendLine(); for (Time time = from; time < to; time = time + TimeSpan.FromMinutes(10)) { sb.Append(time.ToString()); sb.Append("\t"); i = 0; foreach (var item in this.navFile.Prns) { if (i != 0) { sb.Append("\t"); } var satPos = navFile.Get(item, time); // GeoCoord coord = CoordTransformer.XyzToGeoCoord(satPos.XYZ); Polar p = CoordTransformer.XyzToGeoPolar(satPos.XYZ, StationPos); sb.Append(p.Elevation); // sb.Append(satPos.XYZ.Radius()); i++; } sb.AppendLine(); } string path = "D:\\satElevation.xls"; File.WriteAllText(path, sb.ToString()); Geo.Utils.FormUtil.ShowOkAndOpenFile(path); }
/// <summary> /// 根据卫星位置,计算可视卫星 /// </summary> /// <param name="xyz"></param> /// <param name="geoCoord"></param> /// <param name="Ephemeries"></param> /// <param name="cutOffAngle">高度截止角</param> /// <returns></returns> public static List <Ephemeris> GetSatsInVisible(XYZ xyz, GeoCoord geoCoord, IEnumerable <Ephemeris> Ephemeries, double cutOffAngle = 5) { List <Ephemeris> list = new List <Ephemeris>(); foreach (var item in Ephemeries) { var polar = CoordTransformer.XyzToPolar(item.XYZ, xyz, geoCoord.Lon, geoCoord.Lat); if (polar.Elevation > cutOffAngle) { list.Add(item); } } return(list); }
/// <summary> /// 解析实时计算行结果。相隔一个字符串为内部,2个为外部。 /// </summary> /// <param name="line"></param> /// <returns></returns> public static RtkrcvResultItem Parse(string line) { line = line.Replace(" ", "\t"); string[] items = line.Split(new char[] { '\t' }, StringSplitOptions.RemoveEmptyEntries); var dateString = items[0]; string one = items[1]; string two = (items[2]); string three = (items[3]); RtkrcvResultItem item = new RtkrcvResultItem(); item.Time = DateTime.Parse(dateString); double lon = 0; double lat = 0; double height = 0; if (one.Trim().Contains(' '))//查看坐标内部是否有空格,如果有,则是度分秒格式。 { lat = DMS.Parse(one).Degrees; lon = DMS.Parse(two).Degrees; height = Double.Parse(three); } else { //查看是否是XYZ坐标,如果是,则需要转换 //通过离地心距离判断 double oneDouble = Double.Parse(one); double twoDouble = Double.Parse(two); double threeDouble = Double.Parse(three); //经纬度如(180, 180, 8848) 到地心的距离小于6000 000(地球下400 000米) 则认为是经纬度,不是米 if (Math.Sqrt(oneDouble * oneDouble + twoDouble * twoDouble + threeDouble * threeDouble) < 6000000) { lat = oneDouble; lon = twoDouble; height = threeDouble; } else { var geoCoord = CoordTransformer.XyzToGeoCoord(new XYZ(oneDouble, twoDouble, threeDouble)); lon = geoCoord.Lon; lat = geoCoord.Lat; height = geoCoord.Height; } } item.Coords = new double[] { lon, lat, height }; return(item); }
private LineString BuildLineString(int netIndex, EstimatedBaseline baseLine) { var name = netIndex + "-" + baseLine.BaseLineName.RovName; var ptA = new AnyInfo.Geometries.Point(baseLine.EstimatedGeoCoordOfRov, null, name); name = netIndex + "-" + baseLine.BaseLineName.RefName; var geoCoord = CoordTransformer.XyzToGeoCoord(baseLine.ApproxXyzOfRef); var ptB = new AnyInfo.Geometries.Point(geoCoord, null, name); var lineString = new LineString(new List <AnyInfo.Geometries.Point>() { ptA, ptB }, netIndex + "-" + baseLine.Name); return(lineString); }
public List <AnyInfo.Geometries.Point> GetPoints(List <RinexObsFileHeader> Headers) { List <AnyInfo.Geometries.Point> coords = new List <AnyInfo.Geometries.Point>(); int i = 0; foreach (var item in Headers) { var xyz = item.ApproxXyz; var geocoord = CoordTransformer.XyzToGeoCoord(xyz); coords.Add(new AnyInfo.Geometries.Point(geocoord, i + "", item.MarkerName)); i++; } return(coords); }
private void button_showOnMap_Click(object sender, EventArgs e) { if (ShowLayer != null && this.xyzs.Count > 0) { List <AnyInfo.Geometries.Point> lonlats = new List <AnyInfo.Geometries.Point>(); int j = 0; foreach (var item in xyzs) { GeoCoord geoCoord = CoordTransformer.XyzToGeoCoord(item.Position); lonlats.Add(new AnyInfo.Geometries.Point(geoCoord, j + "")); j++; } Layer layer = LayerFactory.CreatePointLayer(lonlats); ShowLayer(layer); } }
private void button_showOnMap_Click(object sender, EventArgs e) { var path = this.fileOpenControl_input.FilePath; if (!File.Exists(path)) { Geo.Utils.FormUtil.ShowWarningMessageBox("没有文件!在下无能为力!"); return; } if (BaseLineNets != null) { BaseLineNets = LoadBaseLineNets(); } if (ShowLayer != null && BaseLineNets != null) { List <AnyInfo.Geometries.Point> pts = new List <AnyInfo.Geometries.Point>(); int netIndex = 0; List <string> addedNames = new List <string>(); foreach (var kv in BaseLineNets.KeyValues) { foreach (var line in kv.Value) { var name = netIndex + "-" + line.BaseLineName.RovName; if (!addedNames.Contains(name)) { pts.Add(new AnyInfo.Geometries.Point(line.EstimatedGeoCoordOfRov, null, name)); addedNames.Add(name); } name = netIndex + "-" + line.BaseLineName.RefName; if (!addedNames.Contains(name)) { var geoCoord = CoordTransformer.XyzToGeoCoord(line.ApproxXyzOfRef); pts.Add(new AnyInfo.Geometries.Point(geoCoord, null, name)); addedNames.Add(name); } } netIndex++; } if (pts.Count == 0) { return; } AnyInfo.Layer layer = AnyInfo.LayerFactory.CreatePointLayer(pts); ShowLayer(layer); } }
private void button_extractcoords_Click(object sender, EventArgs e) { sinexfile = SinexReader.Read(textBox_sinexFile.Text); List <string> sites = sinexfile.GetSiteCods(); double[] CoordArray = sinexfile.GetEstimateVector(); sitecood = new Dictionary <string, xyzblh>(); for (int i = 0; i < sites.Count; i++) { string tmpsite = sites[i]; XYZ tmpxyz = new XYZ(CoordArray[3 * i + 0], CoordArray[3 * i + 1], CoordArray[3 * i + 2]); GeoCoord tmplonlat = CoordTransformer.XyzToGeoCoord(tmpxyz, Ellipsoid.WGS84); if (!sitecood.Keys.Contains(tmpsite)) { sitecood.Add(tmpsite, new xyzblh()); sitecood[tmpsite].truexyz = tmpxyz; sitecood[tmpsite].lon = tmplonlat.Lon; sitecood[tmpsite].lat = tmplonlat.Lat; } } SavePath = this.textBox_uotputpath.Text + "\\sinexcoord" + ".txt"; //"C:\\Users\\lilinyang\\Desktop\\sinexcoord" + ".txt"; FileInfo aFile = new FileInfo(SavePath); StreamWriter SW = aFile.CreateText(); System.Globalization.NumberFormatInfo GN = new System.Globalization.CultureInfo("zh-CN", false).NumberFormat; GN.NumberDecimalDigits = 6; foreach (var item in sitecood) { SW.Write(item.Key.ToString()); SW.Write(" "); SW.Write(item.Value.truexyz.X.ToString()); SW.Write(" "); SW.Write(item.Value.truexyz.Y.ToString()); SW.Write(" "); SW.Write(item.Value.truexyz.Z.ToString()); SW.Write(" "); SW.Write(item.Value.lon.ToString()); SW.Write(" "); SW.Write(item.Value.lat.ToString()); SW.Write("\n"); } SW.Close(); }
/// <summary> /// 生成一个表格 /// </summary> /// <param name="startTime"></param> /// <param name="endTime"></param> /// <param name="interval"></param> /// <param name="siteXyz"></param> /// <param name="SatelliteTypes"></param> /// <param name="AngleCut"></param> /// <param name="EphemerisService"></param> /// <param name="tableName"></param> /// <returns></returns> public static ObjectTableStorage BuildTable( Time startTime, Time endTime, double interval, XYZ siteXyz, List <SatelliteType> SatelliteTypes, double AngleCut = 10, IEphemerisService EphemerisService = null, string tableName = "卫星高度角") { var table = new ObjectTableStorage(tableName); if (siteXyz == null) { return(null); } for (Time time = startTime; time <= endTime; time += interval) { table.NewRow(); table.AddItem("Epoch", time); foreach (var sat in EphemerisService.Prns) { if (!SatelliteTypes.Contains(sat.SatelliteType)) { continue; } var eph = EphemerisService.Get(sat, time); if (eph == null) { continue; } var p = CoordTransformer.XyzToGeoPolar(eph.XYZ, siteXyz); var ele = p.Elevation; if (ele >= AngleCut) { table.AddItem(sat, ele); } } table.EndRow(); } return(table); }
private void button_solve_Click(object sender, EventArgs e) { TwoLineElement tle = GetTwoLineElement(); Gnsser.Orbits.Orbit orbit = new Gnsser.Orbits.Orbit(tle); double intervalMin = Double.Parse(this.textBox_intervalMin.Text); double count = Int32.Parse(this.textBox_count.Text); List <TimedMotionState> sateStates = new List <TimedMotionState>(); for (int i = 0; i < count; i++) { double time = i * intervalMin; TimedMotionState eciSDP4 = orbit.PositionEci(time); sateStates.Add(eciSDP4); } if (sateStates.Count == 0) { return; } StringBuilder sb = new StringBuilder(); sb.AppendLine(orbit.ToString()); sb.AppendLine(tle.ToString()); foreach (var item in sateStates) { sb.AppendLine(item.ToString()); } this.textBox_show.Text = sb.ToString(); int j = 0; lonlats = new List <AnyInfo.Geometries.Point>(); foreach (var item in sateStates) { GeoCoord geoCoord = CoordTransformer.XyzToGeoCoord(item.Position * 1000, AngleUnit.Degree); lonlats.Add(new AnyInfo.Geometries.Point(geoCoord, j + "", item.Date.ToTime().ToString("hh:mm:ss"))); j++; } }
private void button_showOnMap_Click(object sender, EventArgs e) { GeoCoords = new System.Collections.Generic.List <GeoCoord>(); foreach (var item in AllPointsApproXyz) { var geoCoord = CoordTransformer.XyzToGeoCoord(item.Value); GeoCoords.Add(geoCoord); } if (showPointLayer != null && GeoCoords != null) { List <AnyInfo.Geometries.Point> lonlats = new List <AnyInfo.Geometries.Point>(); foreach (GeoCoord g in GeoCoords) { lonlats.Add(new AnyInfo.Geometries.Point(g, "1")); } Layer layer = LayerFactory.CreatePointLayer(lonlats); showPointLayer(layer); } }
/// <summary> /// 创建点图元素 /// </summary> /// <param name="layer">图层</param> /// <param name="xyz">坐标</param> /// <param name="name">名称</param> /// <returns></returns> private static SimpleFeature CreatePtFeature(Layer layer, XYZ xyz, string name) { AnyInfo.Geometries.Point p = new AnyInfo.Geometries.Point(CoordTransformer.XyzToGeoCoord(xyz)); p.Name = name; p.Id = name + new Random().Next(10000); SimpleFeatureBuilder b = new SimpleFeatureBuilder(layer.FeatureSource.FeatureCollection.Schema); b.SetGeometry(p); b.SetName(p.Name); b.SetFeatureId(p.Id); b.SetStyle(new AnyInfo.Styles.PointStyle() { Color = System.Drawing.Color.Red, Diameter = 12 }); SimpleFeature sf = b.Build(); layer.FeatureSource.FeatureCollection.Add(sf); layer.Extent.Expands(sf.Envelope); return(sf); }