项目实战-电力光缆辅助分析系统(C#,Mysql,Gmap.Net)Visual Studio 2019 Winform开发

一、系统目的:

现有存在问题

电力光缆故障不断增加,没有针对电力光缆状态的专业统计分析机制,导致电力光缆信息掌握不准确,且故障处理结果未能统一管理。

功能描述

针对现有的光传输网络,利用成熟的微软.NET开发技术实现对电力光缆传输网络物理连接拓扑图展示;对电力光缆基本信息进行智能分析,综合光传输系统数据、光功率数据及历史告警信息进行光缆状态分析,实现异常预警

预期结果

通过电力光缆辅助分析管理工具的实施,

  1. 能清楚的展示所在辖区光缆拓扑图;
  2. 可以准确掌握并分析电力光缆状态信息,及时发现光缆缺陷,
  3. 可以筛选光缆历史故障,提供光缆线路异常预警功能。

二、系统概况:

1.总述:

本项目在设计上采用模块化的方法进行分层开发,管理工具界面采用.Net技术开发,业务逻辑使用C#语言进行编写,数据库层采用MySql存储数据,利用Matlab和C#混合编程实现预测算法的建模,地图信息采用Gamp插件进行开发。

2. 技术需求:

  1. 项目在界面层采取.Net技术开发,
  2. 在业务逻辑层采用C#编程语言,
  3. 底层的预测算法使用Matlab开发,并在.Net调用
  4. 数据库层采用MySql数据库存储数据,
  5. 地图信息采用Gmap插件开发。对于各层采用模块化开发的完成。

3. 环境介绍:

  1. .Net Framework 4.7.2
  2. Mysql 5.5.62
  3. Win 10 x64
  4. Visual Studio 2019
  5. Gmap.net

4. 功能概述

(1) 光纤线路管理:实现对光纤线路的线路管理,包括向数据库中增加线路,从数据库中删除线路,查看线路信息情况。
① 增加线路:
② 删除线路:
③ 查看线路

(2) 光纤线路节点管理
① 增加节点:。
② 删除节点:
③ 查看节点:

(3) 统计分析
① 空芯率统计分析:
② 故障统计分析:
③ 故障信息录入:

(4) 光功率预测
① 录入光功率:
② 预测光功率:

5. 整体功能概述图

电力光缆维护系统整体功能

三、数据库设计:

1.sql模式下的数据库结构设计:

  1. 库名:Mappoint
  2. 表:故障信息表,光功率表,节点信息表,线路-节点表和线路基本信息表
  3. 节点信息表(point):id:编号(主键,自动递增),pid:节点编号,lat:节点维度,lng:节点经度,pname:节点名称,rid:节点所属的线路编号
    节点信息表

2. 数据库连接设计:

  1. 数据库连接
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using MySql.Data.MySqlClient;
using System.Data.SqlClient;
using System.Windows.Forms;  
using WindowsFormsApp1.数据实体类;
namespace WindowsFormsApp1.工具类
{
    
    
    //将数据库连接功能,单独定义为一个类来执行
    class DBlink
    {
    
    
        MySqlConnection sqlCnn = new MySqlConnection();//创建数据库连接对象
        MySqlCommand sqlCmd = new MySqlCommand();//创建执行sql对象

        //创建数据库连接
        public Boolean DBcon()
        {
    
    
            Boolean tag = false;
            sqlCnn.ConnectionString = "server='127.0.0.1';uid='root';pwd='root';database='mappoint';";//连接字符串
            sqlCmd.Connection = sqlCnn;
            try
            {
    
    
                sqlCnn.Open();
                tag = true;
            }
            catch (Exception ex)
            {
    
    
                MessageBox.Show(ex.Message, "error");
            }
            return tag;
        }

        //关闭数据库连接
        public void DBclose()
        {
    
    
            sqlCnn.Close();
        }

上述包含了连接Mysql和关闭Mysql操作
连接字符串:

sqlCnn.ConnectionString =
"server=‘127.0.0.1’;uid=‘root’;pwd=‘root’;database=‘mappoint’;

根据自己的mysql的情况配置。
2. 数据库查询

 //执行查询的sql
        public Boolean search(String str)
        {
    
    
            Boolean tag = false;
            sqlCmd.CommandText = str;
            MySqlDataReader rec = sqlCmd.ExecuteReader();//创建结果集
            if (rec.HasRows)
            {
    
    
                tag = true;     // 查询到数据
            }
            return tag;
        }

        //查询刚添加路径的序号,好进行添加
        public string search_id(String str)
        {
    
    
            string id = null;
            sqlCmd.CommandText = str;
            MySqlDataReader rec = sqlCmd.ExecuteReader();//创建结果集
            while (rec.Read())
            {
    
    
                id = rec.GetString(0);     // 查询到数据
            }
            return id;
        }
  1. 数据库的增删改:
 //执行增删改的sql
        public Boolean UpdataDeletAdd(string str)
        {
    
    
            sqlCmd.CommandText = str;
            return sqlCmd.ExecuteNonQuery() > 0;
        }

四、程序模块的设计与实现

基于C#的Winform开发有较多的控件,能够很快生成界面便于展示操作,很多功能基于控件的编程操作

1.光缆线路管理

1) 光缆线路展示与更新

#region 地图初始化
            String mapPath = Application.StartupPath + "ares.gmdb";
            gMap1.CacheLocation = System.Windows.Forms.Application.StartupPath;//指定地图缓存存放路径
            gMap1.MapProvider = GMapProviders.GoogleChinaMap;//指定地图类型
            this.gMap1.MinZoom = 1;   //最小比例
            this.gMap1.MaxZoom = 23; //最大比例
            this.gMap1.Zoom = 12; //当前比例
            this.gMap1.ShowCenter = false; //不显示中心十字点
            this.gMap1.DragButton = System.Windows.Forms.MouseButtons.Left;//左键拖拽地图
            this.gMap1.Position = new PointLatLng(40.8456789180537, 111.618702219065); //地图中心位置
            this.gMap1.Show();                                                                         //form.AddLocation("huhehaote");
            #endregion

“ares.gmdb” 是利用Gmap离线生成的地图。
如何生成离线地图?见:https://blog.csdn.net/yearheaven/article/details/80873183
1.对Gmap的操作:

  void mapControl_MouseUp(object sender, MouseEventArgs e)     
            {
    
    

                if (e.Button == System.Windows.Forms.MouseButtons.Right)
                {
    
    

                    //在拖拽地图后地图原点和视窗原点的偏移量
                    DragOffsetX = DragOffsetX + e.X - RightBDPoint.X;
                    DragOffsetY = DragOffsetY + e.Y - RightBDPoint.Y;
                    if (Route != null)
                    {
    
    
                        //设置Route的中心偏移
                        Route.OriginOffset.X = DragOffsetX;
                        Route.OriginOffset.Y = DragOffsetY;
                    }
                }

            }//鼠标拖拽地图实现上下移动
            void mapControl_MouseDown(object sender, MouseEventArgs e)  //画线
            {
    
    
                if (e.Button == System.Windows.Forms.MouseButtons.Left)
                {
    
    
                    PointLatLng point = gMap1.FromLocalToLatLng(e.X, e.Y);
                    if (Route == null)
                    {
    
    
                        Route = new GMapMarkerRoute(point);
                        Route.Origin.X = gMap1.Size.Width / 2;
                        Route.Origin.Y = gMap1.Size.Height / 2;
                        Route.OriginOffset.X = DragOffsetX;
                        Route.OriginOffset.Y = DragOffsetY;
                        routes.Markers.Add(Route as GMapMarker);//划线

                        //Route.AddPoint();
                    }
                    Route.AddPoint(point);
                }
                else if (e.Button == System.Windows.Forms.MouseButtons.Right)
                {
    
    
                    //记录鼠标按下位置
                    RightBDPoint.X = e.X;
                    RightBDPoint.Y = e.Y;
                }

            }//鼠标按下左键,进行画线
            void mapControl_OnMarkerEnter(GMapMarker item)//选中边框变红
            {
    
    
                if (item is GMapMarkerImage)//自定义图标变红
                {
    
    
                    currentMarker = item as GMapMarkerImage;
                    currentMarker.Pen = new Pen(Brushes.Red, 2);
                }

                Debug.WriteLine("OnMarkerEnter: " + item.Position);
            }//OnMarkerEnter中设置选中的Marker,同时设置Pen的值,实现高亮
            void mapControl_OnMarkerLeave(GMapMarker item
            {
    
    
                if (item is GMapMarkerImage)
                {
    
    
                    currentMarker = null;
                    GMapMarkerImage m = item as GMapMarkerImage;
                    m.Pen.Color = Color.Blue;
                    Debug.WriteLine("OnMarkerLeave: " + item.Position);
                }
            })//OnMarkerLeave中取消选中的Marker,取消Pen的值,取消高亮      
            void mapControl_OnMapZoomChanged()
            {
    
    
                //在进行地图的缩放后,视图的原点会重新回到MapControl控件的中心点
                DragOffsetX = 0;
                DragOffsetY = 0;

                if (Route != null)
                {
    
    
                    Route.IsZoomChanged = true;
                }

            }//地图缩放

2. 如何利用Gmap.net在地图上更新现有的线路数据?

/// <summary>
        /// 实现“线路初始化”,把数据库中的线路绘制出来
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Route_init_Click(object sender, EventArgs e)//线路初始化
        {
    
    
            if(!gMapOverlay.IsVisibile)
            {
    
    
                gMapOverlay.IsVisibile = true;
            }

            if (!chushi|| drawLined)
            {
    
    
                //6-28 15 20-修改
                int[] rid = new int[50];//定义一个整型数组存线路编号
                string[] pname = new string[50];//定义字符型的存名字 

                int j;
                int n;
                int temp = 0;
                int count = 0;
                int[] count1 = new int[20];
                DBlink db = new DBlink();
                string lng1, lat1;
                if (db.DBcon())  //得到id序列
                {
    
    
                    db.Get_rid();
                }
                db.DBclose();
                for (int i = 0; i < r_p.rid.Count; i++)//遍历画线
                {
    
    
                    try
                    {
    
    
                        rid[i] = Convert.ToInt32(r_p.rid[i]);
                        if (db.DBcon())  //填充id 数组
                        {
    
    
                            db.Get_lng_lat_pname(rid[i]);//得到经度维度,节点名称
                        }
                        db.DBclose();

                        for (j = temp, n = 0; j < r_p.pname.Count && rid[i] == Convert.ToInt32(r_p.rid[i]); j++, n++)
                        {
    
    
                            lng1 = Convert.ToString(r_p.lng[j]);
                            lat1 = Convert.ToString(r_p.lat[j]);
                            b[j] = draw_Line.S_Turn_P(lng1, lat1);//a[j]存放某一条线路上坐标
                            a[n] = b[j];
                            pname[n] = Convert.ToString(r_p.pname[j]);

                        }

                        temp = j;//2019年6月28日20:53
                        count1[i] = r_p.pname.Count;//取中间值
                        if (i > 0) {
    
     count = count1[i] - count1[i - 1]; }//6.29--17:05 修改,使count值为该行的数
                        else if (i == 0) {
    
     count = count1[0]; }
                        draw_Line.DrawLine(a, count, pname, gMapOverlay, gMap1);//画a[j]中的坐标
                        Array.Clear(a, 0, a.Length);//把a清空,等待画另一条线
                    }

                    catch
                    {
    
    

                    }
                }

                Array.Clear(a, 0, a.Length);
                Array.Clear(count1, 0, count1.Length);
                Array.Clear(b, 0, b.Length);
                Array.Clear(pname, 0, pname.Length);
                Array.Clear(rid, 0, rid.Length);
                chushi = true;
            }

        }

3. 输入两个点的坐标在地图上实现划线功能:

 /// <summary>
        /// 实现在两点之间画线功能,输入节点的起始和终止坐标
        /// </summary>
        /// <param name="pointLatLng_S"> 节点起始坐标</param>
        /// <param name="pointLatLng_E">节点终止坐标</param>
        private void DrawrouteBetweenTowPoint(PointLatLng pointLatLng_S, PointLatLng pointLatLng_E)//输入两个坐标在地图上画线
        {
    
    
            RoutingProvider rp = gMap1.MapProvider as RoutingProvider;
            if (rp != null)
            {
    
    
                rp = GMapProviders.GoogleChinaMap;
            }
            MapRoute route = rp.GetRoute(pointLatLng_S, pointLatLng_E, false, false, (int)gMap1.Zoom);
            if (route != null)
            {
    
    
                GMapRoute r = new GMapRoute(route.Points, route.Name);
                gMapOverlay.Routes.Add(r);
                gMap1.ZoomAndCenterRoute(r);
            }
        }

4. 输入两个节点的经纬度和节点名称信息在Gamp图层上绘制如下

 public void DrawLine(PointLatLng a, PointLatLng b, string sname, string ename, GMapOverlay gMapOverlay, GMapControl gMap1)
        {
    
    
            GMapMarker gMapMarker = new GMarkerGoogle(a, GMarkerGoogleType.green);//起点

            gMapMarker.ToolTipText = "Start:" + sname;   //标记设置6-18-22:00
            gMapMarker.ToolTipMode = MarkerTooltipMode.OnMouseOver; //标记模式鼠标放上面显示

            gMapOverlay.Markers.Add(gMapMarker);
            gMap1.Overlays.Add(gMapOverlay);

            GMapMarker gMapMarker1 = new GMarkerGoogle(b, GMarkerGoogleType.blue);//;终点类型为蓝色
            gMapMarker1.ToolTipText = "End:" + ename;   //标记设置
            gMapMarker1.ToolTipMode = MarkerTooltipMode.OnMouseOver; //标记模式

            gMapOverlay.Markers.Add(gMapMarker1);

            gMap1.Overlays.Add(gMapOverlay);
            DrawLineBetweenTwoPoint(a, b, gMapOverlay);
        }

2) 光缆线路的添加与删除

 private void 增加线路确认_Click(object sender, EventArgs e)//TabControl1 
        {
    
    
           
            if (rn1.Text == "")
                return;
            DBlink db = new DBlink();//建立新的数据连接
            Boolean tag = true;
            string str = "select rn from route1 where rn ='" + rn1.Text + "'";//sql查询语句
            string id = ID;
            if (db.DBcon())   //连接数据库成功
            {
    
    
                if (db.search(str))
                {
    
    
                    tishi.Text = "该路径已存在";
                    tag = false;
                }
            }
            db.DBclose();//避免多线程操作数据库,影响系统报错,先关闭数据连接

            if (db.DBcon())//填充route_list数组
            {
    
    
                db.Get_route();
            }
            db.DBclose();

            if (db.DBcon())  //填充id 数组
            {
    
    
                db.Get_Id();
            }
            db.DBclose();
            if (tag)
            {
    
    
                str = "insert into route1(rid,rn,rl,voltage_level,cable_type,total_num_optical_cable,left_optical_cable) values ('" + rid1.Text + "','" + rn1.Text + "','" + rl1.Text + "','" + g_dengji + "','" +g_leixing + "','" +g_zongxin + "','" + txt_left_optical_cable.Text + "');";
                if (db.DBcon())   //连接数据库成功
                {
    
    
                    if (!db.UpdataDeletAdd(str))//检查能否添加数据
                    {
    
    
                        DialogResult dr = MessageBox.Show("线路添加失败!", "标题", MessageBoxButtons.OK, MessageBoxIcon.Question);
                    }
                    else
                    {
    
    
                        DialogResult dr = MessageBox.Show("线路添加成功!", "标题", MessageBoxButtons.OK, MessageBoxIcon.None);
                    }
                }
                db.DBclose();
             }
        }

删除线路:
删除线路

3) 光缆线路信息的查看

在这里插入图片描述

2.光缆线路节点管理

1)光缆线路节点的增加与删除

节点添加
节点删除

2) 光缆线路节点信息查看

在这里插入图片描述

3.线路光缆统计分析

1)光缆空芯率统计分析

空芯率统计分析新建了一个类
在这里插入图片描述
包含光缆空芯数统计和空芯率分析
光缆空芯数统计:
线路空芯数统计
光缆空芯率分析:通过输入空芯率的范围可以分析在该范围内的光缆数目
光缆线路负载统计

2)故障统计分析

分为“年份故障统计分析”:分析在一年内各个类型故障发生的次数所占的百分比。饼状图
“月份故障统计分析”:分析各个月份各自发生故障的次数。柱状图
故障统计分析

4. 光功率预测

1)光功率录入

在这里插入图片描述

2)光功率预测

光功率预测采用了一元线性回归的方法,利用C#和Matlab混合编程生成.dll文件,见博客https://blog.csdn.net/daining424/article/details/102887613
并在程序中输入相应的参数的到预测结果
核心:

						ydpj_yuce.yuce myyuce1 = new yuce();
                        MWNumericArray yy1 = y;
                        MWNumericArray xx1 = Nday;
                        MWArray result = myyuce1.ydpj_yuce(yy1, xx1);
                        MWNumericArray temp = (MWNumericArray)result;//强制转换成MWNumericArray
                        Array mm = temp.ToArray(MWArrayComponent.Real); //temp转化成Array类型的mm

展开:

 /// <summary>
        /// 预测功能,首先选定线路,再选全部时间段还是局部时间段,选定日期区间在需在7日以上
        /// 能够完成预测功能
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button1_Click_1(object sender, EventArgs e)//光功率预测
        {
    
    
            this.Cursor = Cursors.WaitCursor;//鼠标进入等待状态
            chart1.Visible = true;
            guanggonglv_dataGridView.Visible = true;
            zhanshi_title.Visible = true;
            label2.Visible = true;
            try
            {
    
    
                chart1.Series.Clear();//每次输入之后清空
                Series ser = new Series(rn);// 实例化序列图对象
                ser.IsValueShownAsLabel = true;//显示每个节点信息
               
                chart1.Series.Add(ser);//向chart1中添加序列对象
                zhanshi_title.Visible = true;
                if (rb_special.Checked)//特定时间被选中
                {
    
    
                    #region 数据库连接操作,得到日期差值和光功率数值
                    DBlink db1 = new DBlink();
                    if (db1.DBcon())
                    {
    
    
                        db1.Get_datediff(time2,time1); //输入线路名,得到对应的光功率和日期
                    }
                    db1.DBclose();
                    DBlink db = new DBlink();
                    if (db.DBcon())
                    {
    
    
                        db.Get_gonglv1(rn,time1,time2);//输入线路名,起止时间得到对应的光功率和日期
                    }
                    db.DBclose();
                    #endregion
                    rqcz = date.rqcz[0]+1;//得到选中的日期差值 比如10月20日与10月19日差值为1 但是2天所以差值应该加一
                    if (rqcz <= 1)
                    {
    
    
                        MessageBox.Show("日期选择有误请重新选择!", "!");
                    }

                    if (rqcz < 4)
                    {
    
    
                        MessageBox.Show("日期区间选择过短,不能预测,请选择大于4天!", "日期选择问题!");

                    }
                    else
                    {
    
    
                        for (int i = 0; i < rqcz; i++)//统计日期的个数
                        {
    
    
                            x[i] = (DateTime)date.dateset[i];//日期
                            y[i] = date.gglv[i];//将光功率赋给y轴
                        }
                        //预测部分 得到预测的光功率值
                        int Nday = rqcz;//时间周期为10天
                        ydpj_yuce.yuce myyuce = new yuce();
                        MWNumericArray yy1 = y;
                        MWNumericArray xx1 = Nday;
                        MWArray result = myyuce.ydpj_yuce(yy1, xx1);
                        MWNumericArray temp = (MWNumericArray)result;//强制转换成MWNumericArray
                        Array mm = temp.ToArray(MWArrayComponent.Real); //temp转化成Array类型的mm对象
                        double[] outRes = new double[mm.Length];  //计算mm的长度作为输出的个数
                        for (int i = 0; i < mm.Length; i++)
                        {
    
    
                            guangyuce = string.Format("{0:N4}", mm.GetValue(0, i));//?
                            outRes[i] = Convert.ToDouble(guangyuce);        
                        }
                        yucezhi = outRes[0];//得到预测的光功率值

                        //绘制预测曲线
                        for (int i = 0; i < rqcz+1; i++)//统计日期的个数
                        {
    
    
                            if (i < rqcz)//将当前的选择的数据存储
                            {
    
    
                                x[i] = (DateTime)date.dateset[i];
                                y[i] = date.gglv[i];//将光功率赋给y轴
                            }
                            else//预测的数据,主要要时间
                            {
    
    
                                x[i] = (DateTime)date.dateset[i-1].AddDays(1);
                                y[i] = yucezhi;
                            }
                        }
                        for (int i = 0; i < rqcz+1; i++)//rqcz=7 x[0-6] x[7] y[7]预测
                        {
    
    
                            ser.Points.AddXY(x[i], y[i]);
                        }//向xy轴添加元素}
                        show_now_gglv_dataGridView1(time1,time2);//展示光功率;
                                                      ///图样式设计
                        chart1.Series[0].ChartType = SeriesChartType.Spline; //第一条样条图类型 
                        chart1.Series[0].Color = Color.Red;//颜色设为红色局部
                        chart1.Titles[0].Text = string.Format("{0}光功率显示", rn); //设置标题
                        chart1.Titles[0].ForeColor = Color.RoyalBlue;
                        MessageBox.Show(x[rqcz]+"预测的光功率值为:" + guangyuce, "当前所选区间预测值");
                        #region 调用并获取预测点结果
                    }
                    #endregion
                }

                ///<summary>
                ///所有时间段的光功率
                ///</summary>
                if (rb3_all.Checked)
                {
    
    
                    DBlink db = new DBlink();
                    if (db.DBcon())
                    {
    
    
                        db.Get_gonglv(rn);//输入线路名,得到对应的光功率和日期
                    }
                    db.DBclose();
                    //所有日期及光功率
                    for (int i = 0; i < date.dateset.Count; i++)//统计日期的个数
                        {
    
    
                            x[i] = (DateTime)date.dateset[i];
                            y[i] = date.gglv[i];//将光功率赋给y轴
                            start=x[0];
                            end = x[date.dateset.Count - 1];
                        }
                    date1_comboBox.Text = Convert.ToString(start.Date);
                    date2_comboBox.Text = Convert.ToString(end.Date);

                    //预测部分
                    int Nday = date.dateset.Count;//时间全部的日子
                   
                    if (Nday < 4)
                    {
    
    
                        MessageBox.Show("当前日期区间小于4天,不能预测!", "日期选择问题!");

                    }
                    else
                    {
    
    
                        ydpj_yuce.yuce myyuce1 = new yuce();
                        MWNumericArray yy1 = y;
                        MWNumericArray xx1 = Nday;
                        MWArray result = myyuce1.ydpj_yuce(yy1, xx1);
                        MWNumericArray temp = (MWNumericArray)result;//强制转换成MWNumericArray
                        Array mm = temp.ToArray(MWArrayComponent.Real); //temp转化成Array类型的mm对象
                        double[] outRes = new double[mm.Length];  //计算mm的长度作为输出的个数
                        for (int i = 0; i < mm.Length; i++)
                        {
    
    
                            guangyuce = string.Format("{0:N4}", mm.GetValue(0, i));//?
                            outRes[i] = Convert.ToDouble(guangyuce);
                        }
                        yucezhi = outRes[0];//得到预测的光功率值

                        //绘制预测曲线
                        for (int i = 0; i < Nday + 1; i++)//统计日期的个数
                        {
    
    
                            if (i < Nday)//将当前的选择的数据存储
                            {
    
    
                                x[i] = (DateTime)date.dateset[i];
                                y[i] = date.gglv[i];//将光功率赋给y轴
                            }
                            else//预测的数据,主要要时间
                            {
    
    
                                x[i] = (DateTime)date.dateset[i - 1].AddDays(1);
                                y[i] = yucezhi;
                            }
                        }
                        for (int i = 0; i < Nday + 1; i++)
                        {
    
    
                            ser.Points.AddXY(x[i], y[i]);//向xy轴添加元素
                        }
                        show_now_gglv_dataGridView1(start, end);
                        //chart样式
                        chart1.Series[0].ChartType = SeriesChartType.Spline; //第一条样条图类型
                                                                             //设置标题
                        chart1.Titles[0].Text = string.Format("{0}光功率显示", rn);
                        chart1.Titles[0].ForeColor = Color.RoyalBlue;
                        chart1.Titles[0].ForeColor = Color.RoyalBlue;

                        //设置图标显示样式

                        MessageBox.Show(x[Nday] + "预测的光功率值为:" + guangyuce, "总体预测值");
                    }
                }//将时间赋给x轴}强制类型转换
                 //draw(x,y);//调用函数,画出折线图}
                guanggonglv_dataGridView.Visible = true;
                this.Cursor = Cursors.Default;
            }
            catch (System.Exception ex) {
    
     }
        }

实现结果如下所示:
全部时间段的

5. 工具类

含有数据库连接类和地图绘制类
在这里插入图片描述

DBLink.cs(数据库连接类)

  1. 数据库的连接与关闭,上面以已叙述不再赘述
  2. 数据库表的增加与删除
  3. 数据库信息的查看
    a. 现有节点信息的查看
public void Get_dataGridView3_nowpoint_data(string str)//展示现有节点
        {
    
    
            sqlCmd.CommandText = str;
            MySqlDataReader rec = sqlCmd.ExecuteReader();
            //初始化数据;
            point_data.pid.Clear();
            point_data.lat.Clear();
            point_data.lng.Clear();
            point_data.pname.Clear();
            point_data.rid.Clear();
            while (rec.Read())
            {
    
    
                point_data.pid.Add(rec.GetString(0));
                point_data.lat.Add(rec.GetString(1));
                point_data.lng.Add(rec.GetString(2));
                point_data.pname.Add(rec.GetString(3));
                point_data.rid.Add(rec.GetString(4));
            }
        }

b. 故障类型的查看(带参数)

public void Gettype_count(double year)//输入年份得到所有故障的类型和数目
        {
    
    
            sqlCmd.CommandText = "select guzhang_type,count(guzhang_type)from guzhang where  year(date)=" + year + " group by guzhang_type";  //查找route表
            MySqlDataReader rec = sqlCmd.ExecuteReader();
            guzhang.guzhang_type.Clear();
            guzhang.count.Clear();

            while (rec.Read())
            {
    
    
                guzhang.guzhang_type.Add(rec.GetString(0));//得到故障类型
                guzhang.count.Add(rec.GetInt32(1));//得到故障数量

            }
        }

绘制点和线.cs(Gmap地图绘制类)

输入多个节点,绘制一条线路,并把线路名称传递进去

 public void DrawRoute(PointLatLng s,int pid)//6-18 21:00,实现功能将画线将路径名显示出来
        {
    
    
            List<PointLatLng> points = new List<PointLatLng>();
            points.Add(s); //将s点坐标加入points点集,不断

            DBlink db = new DBlink();  //连接数据库,得到路径名和id的关联关系
            if (db.DBcon())//填充route_list数组
            {
    
    
                db.Get_route();
            }
            db.DBclose();
            if (db.DBcon())  //填充id 数组
            {
    
    
                db.Get_Id();
            }
            db.DBclose();
            string[] routes_name = new string[20];
            string route_name;
            int[] routes_id = new int[20];
            int i;
            GMapRoute r;
            for (i = 0; i < route.route_list.Count; i++)
               routes_name[i] =route.route_list[i].ToString();
               int.TryParse(route.id.ToString(), out routes_id[i]);
                if (routes_id[i] == pid)
                {
    
    
                    route_name = routes_name[i];
                     r = new GMapRoute(points, route_name);
                 }
             
            

        }

注意事项:

1、在使用Gmap.net实现地图绘制之前需要在项目中添加“引用”
在这里插入图片描述/2、
2、Matlab 和C#混合编程时,需要加载:using MathWorks.MATLAB.NET.Arrays;
在这里插入图片描述
并且在C#的添加引用ydpj_yuce.dll文件,此文件是Matlab编写生成的便于C#调用的动态链接文件

小结

本项目是第一个自己独立完成开发的项目,从不熟悉C#,不了解Gmap.Net,到进行需求分析,代码设计,代码调试,分模块完成,历尽艰辛,困难重重,虽然项目的完成度和可扩展性还有待提高,这期间学习到了如何实现客户端与数据库的交互,如何设计客户端的按钮触发响应,如何利用Matlab写的预测程序去在平台上预测数据,遇到问题了,免不得百度。

在此期间也学会了一定的编码风格,虽然看起来还是那么野路子,创建一些类去存储结构性代码,对于如何调试查找bug并进行修正也上了不止一课。
技术为王,且行且珍惜,愿你我共同努力。
谨以此记,共勉。

欢迎对项目感兴趣的朋友,到评论区讨论。如果有建议或疑惑,欢迎指正。

猜你喜欢

转载自blog.csdn.net/daining424/article/details/107188580