Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        /// <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>());
            }
        }
Пример #4
0
        /// <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);
        }
Пример #5
0
        /// <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);
        }
Пример #6
0
        /// <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>());
        }
Пример #7
0
        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);
            }
        }
Пример #8
0
        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);
        }
Пример #9
0
        /// <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);
        }