/// <summary> /// 比较 /// </summary> /// <param name="netA"></param> /// <param name="netB"></param> /// <returns></returns> public static List <NamedXyzEnu> Compare(BaseLineNet netA, BaseLineNet netB) {//提取和转换,有的方向不一致 List <NamedXyz> netBlines = new List <NamedXyz>(); foreach (var item in netB) { var line = netA.GetOrReversed(item.BaseLineName); if (line == null) { continue; } var namedXyz = new NamedXyz(line.BaseLineName.Name, line.EstimatedVector); netBlines.Add(namedXyz); } var CoordsB = netB.GetNamedXyzs(); var Compared = NamedXyz.Compare(netBlines, CoordsB); var CompareResults = new List <NamedXyzEnu>(); foreach (var localXyz in Compared) { GnssBaseLineName name = new GnssBaseLineName(localXyz.Name); var staXyz = netA.GetSiteCoord(name.RefName); if (staXyz == null) { continue; } var item = NamedXyzEnu.Get(localXyz.Name, localXyz.Value, staXyz); CompareResults.Add(item); } return(CompareResults); }
/// <summary> /// 4 conponents /// </summary> /// <param name="content"></param> /// <returns></returns> private static NamedXyz ParseNamedXyz(string content) { var strs = Geo.Utils.StringUtil.Split(content, new char[] { ' ' }, true); var name = strs[0]; var xyz = new XYZ(Convert.ToDouble(strs[1]), Convert.ToDouble(strs[2]), Convert.ToDouble(strs[3])); var namedXyz = new NamedXyz(name, xyz); return(namedXyz); }
/// <summary> /// 坐标解析 /// </summary> /// <param name="path"></param> /// <returns></returns> public static List <NamedXyz> GetCoords(string path) { try { string extension = Path.GetExtension(path).ToLower(); switch (extension) { case ".snx": SinexFile fileA = SinexReader.Read(path, true); return(fileA.GetSiteEstimatedCoords()); case ".xls": return(NamedXyz.ReadNamedXyz(path)); case ".txt": return(NamedXyz.ReadNamedXyztxt(path)); case ".org": GamitOrgFileService service = new GamitOrgFileService(path); return(service.GetNamedXyzs()); case ".rep": var p = new PinnacleRepFileService(path); return(p.GetNamedXyzs()); case ".pos": //"Rtklib 结果|*.pos { var pp = Gnsser.Interoperation.RtkpostResult.Load(path); return(pp.GetNamedXyzs()); } case ".clk": case ".clk_30s": case ".clk_05s": ClockFileHeader a = ClockFileReader.ReadHeader(path); List <NamedXyz> results = new List <NamedXyz>(); foreach (var item in a.ClockSolnStations) { NamedXyz bb = new NamedXyz(); bb.Name = item.Name; bb.Value = item.XYZ; results.Add(bb); } return(results); default: break; } return(new List <NamedXyz>()); }catch (Exception ex) { new Log(ex.Message).Error(ex.Message + ", 解析出错!"); return(new List <NamedXyz>()); } }
/// <summary> /// 解析坐标 /// </summary> /// <param name="content"></param> /// <returns></returns> public static LgoAscPoint ParsePoint(string content) { NamedXyz namedXyz = ParseNamedXyz(content); LgoAscPoint result = new LgoAscPoint() { Name = namedXyz.Name, XYZ = namedXyz.Value, // CoordinateType = strs[6] }; return(result); }
/// <summary> /// 测站和估值坐标 /// </summary> /// <returns></returns> public List <NamedXyz> GetSiteEstimatedCoords() { List <NamedXyz> results = new List <NamedXyz>(); var list = GetSinexSites(); foreach (var item in list) { var xyz = new NamedXyz(item.Name, item.EstimateXYZ); results.Add(xyz); } return(results); }
/// <summary> /// 根据坐标文件读取坐标 /// </summary> /// <param name="path"></param> /// <returns></returns> public static BaseDictionary <string, NamedRmsXyz> GetCoords(string path) { string extension = Path.GetExtension(path).ToLower(); switch (extension) { case ".snx": var SinexFile = SinexReader.Read(path); // SinexFileReader return(SinexFile.GetSiteEstimateRmsdCoords()); break; case ".xls": BaseDictionary <string, NamedRmsXyz> dic = new BaseDictionary <string, NamedRmsXyz>(); var list = NamedXyz.ReadNamedXyz(path); foreach (var item in list) { dic[item.Name.Trim().ToUpper()] = new NamedRmsXyz(item.Name, new RmsedXYZ(item.Value)); } return(dic); break; case ".txt": BaseDictionary <string, NamedRmsXyz> dic2 = new BaseDictionary <string, NamedRmsXyz>(); var list2 = NamedXyz.ReadNamedXyztxt(path); foreach (var item in list2) { dic2[item.Name.Trim().ToUpper()] = new NamedRmsXyz(item.Name, new RmsedXYZ(item.Value)); } return(dic2); break; default: break; } return(new BaseDictionary <string, NamedRmsXyz>()); }
private void button_run_Click(object sender, EventArgs e) { try { var lines = this.textBox_aXyz.Lines; NamedXyz baseXyz = null; List <NamedXyz> rovXyzs = new List <NamedXyz>(); int i = 1; foreach (var line in lines) { if (String.IsNullOrWhiteSpace(line)) { continue; } if (baseXyz == null) { baseXyz = NamedXyz.Parse(line); if (String.IsNullOrWhiteSpace(baseXyz.Name)) { baseXyz.Name = i + ""; } continue; } var rovXyz = NamedXyz.Parse(line); if (String.IsNullOrWhiteSpace(rovXyz.Name)) { rovXyz.Name = i + ""; } rovXyzs.Add(rovXyz); i++; } StringBuilder sb = new StringBuilder(); i = 1; foreach (var rovXyz in rovXyzs) { XYZ vector = rovXyz.Value - baseXyz.Value; var baseGeoCoord = Geo.Coordinates.CoordTransformer.XyzToGeoCoord(baseXyz.Value); var neu = Geo.Coordinates.CoordTransformer.XyzToNeu(vector, baseGeoCoord); var polar = Geo.Coordinates.CoordTransformer.NeuToPolar(neu); sb.AppendLine(" " + i + " -------------------- "); var vecName = baseXyz.Name + "->" + rovXyz.Name; sb.AppendLine(vecName); sb.AppendLine("Vector:\t" + vector.ToString()); sb.AppendLine("NEU:\t" + neu.ToString()); sb.AppendLine("Height Differ:\t" + polar.Height.ToString()); sb.AppendLine("Plain Distance:\t" + polar.PlainRange.ToString()); sb.AppendLine("Length:\t" + vector.Length); i++; } this.textBox_result.Text = sb.ToString(); } catch (Exception ex) { Geo.Utils.FormUtil.ShowWarningMessageBox("出错了,多半是数据格式问题,请仔细检查!" + ex.Message); } }
private void Read() { string pathA = fileOpenControlA.FilePath; if (!File.Exists(pathA)) { FormUtil.ShowFileNotExistBox(pathA); return; } string pathB = this.fileOpenControlB.FilePath; if (!File.Exists(pathB)) { FormUtil.ShowFileNotExistBox(pathB); return; } bool isBaseLine = checkBox_isBaseline.Checked; if (!isBaseLine)//坐标的比较 { this.CoordsA = NamedXyzParser.GetCoords(pathA); this.CoordsB = NamedXyzParser.GetCoords(pathB); //此用于地图显示 this.ShowCoordsA = this.CoordsA; this.ShowCoordsB = this.CoordsB; ObjectTableStorage tableA = BuildObjectTable(CoordsA); ObjectTableStorage tableB = BuildObjectTable(CoordsB); objectTableControl_tableA.DataBind(tableA); objectTableControl_tableB.DataBind(tableB); this.Compared = NamedXyz.Compare(CoordsA, CoordsB, NameLength.Enabled, NameLength.Value); CompareResults = new List <NamedXyzEnu>(); var nameLen = NameLength; foreach (var localXyz in Compared) { // var name = GetCuttedName(localXyz.Name, nameLen); var staXyz = CoordsA.Find(m => String.Equals(GetCuttedName(m.Name, nameLen), GetCuttedName(localXyz.Name, nameLen), StringComparison.CurrentCultureIgnoreCase)); if (staXyz == null) { continue; } var item = NamedXyzEnu.Get(localXyz.Name, localXyz.Value, new XYZ(staXyz.X, staXyz.Y, staXyz.Z)); CompareResults.Add(item); } } else//基线选择与输出 { try { var path = pathA; ObjectTableStorage tableA = ParseLineTable(pathA); ObjectTableStorage tableB = ParseLineTable(pathB); if (tableA == null || tableB == null) { Geo.Utils.FormUtil.ShowWarningMessageBox("不支持的基线格式!"); return; } this.CoordsA = PareToNamedXyz(tableA); this.CoordsB = PareToNamedXyz(tableB); objectTableControl_tableA.DataBind(tableA); objectTableControl_tableB.DataBind(tableB); var netA = MultiPeriodBaseLineNet.Parse(tableA); var netB = MultiPeriodBaseLineNet.Parse(tableB); //此用于地图显示 this.ShowCoordsA = netA.GetSiteCoords(); this.ShowCoordsB = netB.GetSiteCoords(); var compared = MultiPeriodBaseLineNet.Compare(netA, netB); CompareResults = new List <NamedXyzEnu>(); foreach (var item in compared) { CompareResults.AddRange(item.Value); } } catch (Exception ex) { Geo.Utils.FormUtil.ShowErrorMessageBox(ex.Message + ",发生了错误\r\n注意:文件内只能有一条同名基线!"); return; } } ObjectTableStorage table = BuildObjectTable(CompareResults); //转换为毫米单位 if (IsInUnitMm) { table.UpdateAllBy(1000, NumeralOperationType.乘); } ; this.objectTableControl_result.DataBind(table); //更进一步,计算偏差RMS var residualRms = table.GetResidualRmse(); var meanError = table.GetAbsMean(); var vector = table.GetAveragesWithStdDev(); StringBuilder sb = new StringBuilder(); sb.AppendLine("参数\t平均误差\t互差中误差\t系统偏差\t系统差中误差"); var format = "G4"; foreach (var item in vector) { sb.AppendLine(item.Key + "\t" + meanError[item.Key][0].ToString(format) + "\t" + residualRms[item.Key][0].ToString(format) + "\t" + item.Value[0].ToString(format) + "\t" + item.Value[1].ToString(format)); } var info = sb.ToString(); MessageBox.Show(info); log.Info(info); ObjectTableStorage summeryTable = new ObjectTableStorage("结果汇总"); summeryTable.NewRow(); summeryTable.AddItem("Name", "MeanError"); foreach (var item in meanError) { summeryTable.AddItem(item.Key, item.Value[0].ToString(format)); } summeryTable.NewRow(); summeryTable.AddItem("Name", "MutualDevRms"); foreach (var item in residualRms) { summeryTable.AddItem(item.Key, item.Value[0].ToString(format)); } summeryTable.NewRow(); summeryTable.AddItem("Name", "AveOrSysDev"); foreach (var item in vector) { summeryTable.AddItem(item.Key, item.Value[0].ToString(format)); } summeryTable.NewRow(); summeryTable.AddItem("Name", "AveDevRms"); foreach (var item in vector) { summeryTable.AddItem(item.Key, item.Value[1].ToString(format)); } summeryTable.EndRow(); objectTableControl_ave.DataBind(summeryTable); }
/// <summary> /// 根据路径选择独立基线 /// </summary> /// <param name="coords"></param> /// <returns></returns> private string[] IndepentBaselineProcess(List <NamedXyz> coords) { string[] IndepentBaselinesInfo = new string[coords.Count - 1]; //存储基线 Dictionary <string, Edge> graphRound = new Dictionary <string, Edge>(); int n = coords.Count; mgraph = new MGraph(); mgraph.n = n; mgraph.e = n * (n - 1) / 2; mgraph.vex = new VertexType[n]; mgraph.edges = new double[n][]; road = new Road[n * (n - 1) / 2]; v = new int[n * (n - 1) / 2]; int ii = 0; for (int i = 0; i < n; i++) { // SiteEpochSatData dataA = DataOfAllSites.ElementAt(i).Value; //SiteEpochSatData dataA = DataOfAllSites[i]; NamedXyz dataA = coords[i]; mgraph.vex[i] = new VertexType(); mgraph.vex[i].no = i; mgraph.vex[i].name = dataA.Name; //.SiteName; v[i] = i; //顶点ver[i]初始时表示各在不同的连通分支v[i]中,父结点依次为v[i] for (int j = i + 1; j < n; j++) { mgraph.edges[i] = new double[n]; // SiteEpochSatData dataB = DataOfAllSites[j];//.ElementAt (j).Value; NamedXyz dataB = coords[j]; //double toleranceSeccond = 3.5; //限差 单位:秒 double count = (dataA.Value - dataB.Value).Length; mgraph.edges[i][j] = count; road[ii] = new Road(); road[ii].a = i; road[ii].b = j; road[ii].w = count; ii++; ////写入 //string sb = dataA.SiteName + "-" + dataB.SiteName + " " + count.ToString(); //writer.WriteLine(sb); Node NodeA = new Node(); NodeA.Name = i; NodeA.strName = dataA.Name; NodeA.Visited = false; Node NodeB = new Node(); NodeB.Name = j; NodeB.strName = dataB.Name; NodeB.Visited = false; Edge edge = new Edge(); edge.NodeA = NodeA; edge.NodeB = NodeB; edge.Weight = count; string baselineName = dataA.Name + dataB.Name; graphRound.Add(baselineName, edge); } } //sort 排序 由大到小 List <KeyValuePair <string, Edge> > graphPair = new List <KeyValuePair <string, Edge> >(graphRound); graphPair.Sort(delegate(KeyValuePair <string, Edge> s1, KeyValuePair <string, Edge> s2) { return(s1.Value.Weight.CompareTo(s2.Value.Weight)); }); //存储排序基线 Dictionary <string, Edge> graph = new Dictionary <string, Edge>(); for (int index = 0; index < graphPair.Count; index++) { var item = graphPair.ElementAt(index); Edge edge = new Edge(); edge.NodeA = item.Value.NodeA; edge.NodeB = item.Value.NodeB; edge.Weight = item.Value.Weight; graph.Add(item.Key, edge); //重新排序 road[mgraph.e - 1 - index].a = item.Value.NodeA.Name; road[mgraph.e - 1 - index].b = item.Value.NodeB.Name; road[mgraph.e - 1 - index].w = item.Value.Weight; } //根据Kruskal算法生成最小生成树 GetMinCostSpanTree List <Edge> findedMinCostSpanTree = new List <Edge>(); List <List <Node> > findedNodes = new List <List <Node> >(); findedNodes.Add(new List <Node>() { graph.ElementAt(0).Value.NodeA, graph.ElementAt(0).Value.NodeB }); findedMinCostSpanTree.Add(graph.ElementAt(0).Value); for (int index = 1; index < graph.Count; index++) { var item = graph.ElementAt(index); int i = 0, indexA = -1, indexB = -1; Node nodeA = item.Value.NodeA; Node nodeB = item.Value.NodeB; foreach (var nodes in findedNodes) { foreach (var node in nodes) { if (!item.Value.NodeB.Visited && node.Name == nodeB.Name && node.Visited == nodeB.Visited) { item.Value.NodeB.Visited = true; indexB = i; } if (!item.Value.NodeA.Visited && node.Name == nodeA.Name && node.Visited == nodeA.Visited) { item.Value.NodeA.Visited = true; indexA = i; } } i++; } // if (item.Value.NodeA.Visited && item.Value.NodeB.Visited && (indexA != indexB)) { //连接不同的联通分量,则这两个连通分量可以合并成一个了。 int minId = Math.Min(indexA, indexB); int maxId = Math.Max(indexA, indexB); findedNodes[minId].AddRange(findedNodes[maxId]); findedNodes.RemoveAt(maxId); findedMinCostSpanTree.Add(item.Value); } else if (!item.Value.NodeA.Visited && !item.Value.NodeB.Visited) { //都不包含,直接添加新列表 findedNodes.Add(new List <Node>() { nodeA, nodeB }); findedMinCostSpanTree.Add(item.Value); } else if (item.Value.NodeA.Visited && !item.Value.NodeB.Visited) { //包含A,则将B添加到A的集合中去 findedNodes[indexA].Add(nodeB); findedMinCostSpanTree.Add(item.Value); } else if (!item.Value.NodeA.Visited && item.Value.NodeB.Visited) { //包含B,则将A添加到B的集合中去 findedNodes[indexB].Add(nodeA); findedMinCostSpanTree.Add(item.Value); } item.Value.NodeA.Visited = false; item.Value.NodeB.Visited = false; } //writer.WriteLine("\n"); //writer.WriteLine("根据最大观测量选择的独立基线: "); int jj = 0; foreach (var item in findedMinCostSpanTree) { string tmp = item.NodeA.strName + "-" + item.NodeB.strName;// + " " + key.Weight; IndepentBaselinesInfo[jj] = tmp; //写入 //writer.WriteLine(tmp); jj++; } //writer.Close(); //关闭 return(IndepentBaselinesInfo); }