指揮電子沙盤虛擬數字沙盤教程第29課

指揮電子沙盤虛擬數字沙盤教程第29課

在SDK中爲了方便三方數據的接入,引入了一個用戶層接口。主要是完成三方數據的接入,含動態數據(如GPS),用戶可自行控制UI及UI的交互,可實現如滴滴打車的車輛控制,公安應用中的UI按屬性控制顯示,並且該用戶層的顯示是由核心部分直接調用,在需要顯示數據的調用下面的接口,這樣可防止因爲用戶是從外部接入。而卡頓,影響用戶使用體驗。而UI的回收是由核心負責,不需要用戶干預,二次開發時用戶只用關心自己要承現的UI,及UI的交互:

     public interface UserGisData : INotifyPropertyChanged
    {
 
 
        NewGisBiao.Base.JunBiao.CenteType BiaoCenterType
        {
            get;  //這個UI對象的中心點類型
        }
 
        string LayName {
            get; //用戶層名稱
         
        }
 
     
 
 
        /// <summary>
        /// 標籤整體縮放
        /// </summary>
        double  MScal
        {
            get; //UI整體縮放參數
        }
 
 
        Dictionary <string, GisLib.DrawPointData> DrawObject
       {
           get;  //訪問當前已經存在UI對象
           set;
       }
 
        /// <summary>
        /// 是否顯示
        /// </summary>
       bool ISShow
       {
           get;  //隱藏和顯示該用戶層
           set;
       }
 
        /// <summary>
        /// 最小顯示層
        /// </summary>
       int MinZoom
       {
           get;  //該用戶層的最小顯示層
           set;
       }
 
        /// <summary>
        /// 最大顯示層
        /// </summary>
       int MaxZoom
       {
           get; //該用戶層的最大顯示層
           set;
       }
 
 
 
 
        /// <summary>
        /// 返回一個圖標表示這個層的圖標
        /// </summary>
        System.Windows.Media.Imaging.BitmapImage MICon
        {
            get;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="centerx">查詢中心點經度(如果沒有會傳入null) </param>
        /// <param name="centery">查詢中心點緯度(如果沒有會傳入null)</param>
        /// <param name="info">查詢的信息(如果是全部會傳入*)</param>
        /// <param name="length">範圍(如果沒有會傳入null)</param>
        /// <returns></returns>
        Dictionary<SechData, Point> SechPro(double centerx, double centery, string info, double length);
 
        Dictionary<SechData, Point> SechForLine(List<Point> Line, string info, double length);
        Dictionary<SechData, Point> SechForRect(List<Point> Line, string info, double length);
 
        /// <summary>
        /// 畫用戶物體
        /// </summary>
        /// <param name="centerx"></param>
        /// <param name="centery"></param>
        /// <returns></returns>
        List<DrawPointData> DrawData(double centerx, double centery);
 
 
        void OnUserBiaoClick(DrawPointData va); //UI點擊的事件,現已作廢,UI可自行響應所有交互事件
 
 
 
    }
 

List<DrawPointData> DrawData(double centerx, double centery); 爲該接口的核心部分,傳入參數爲當前地圖的中心 點經緯度,根據這個經緯度,二次開發用戶需要從 數據(如mysql或者其它三方數據中)查詢當前需要顯示範圍的 數據,並連通UI一起返回:例子如下:

 List<DrawPointData> UserGisData.DrawData(double centerx, double centery)
        {
 
            if (Con == null)
            {
                Con = new MySql.Data.MySqlClient.MySqlConnection(IniRead.IniReadWrite.GetMySqlDataConnstring());
                Con.Open();
            }
 
            int mmzoom = IniRead.IniReadWrite.MPareant.Zoom;
            int drawfanwei = 5;
            double bx, by, ex, ey;
            Int64 cx, cy;
            NewGisBiao.Help.MathHelp.MyConver(centerx, centery, out cx, out cy, (int)mmzoom - 1);
            NewGisBiao.Help.MathHelp.MyConver2(cx - drawfanwei, cy - drawfanwei, (int)mmzoom - 1, out bx, out by);
            NewGisBiao.Help.MathHelp.MyConver2(cx + drawfanwei, cy + drawfanwei, (int)mmzoom - 1, out ex, out ey);
            string t6 = " where (jingdu > " + bx.ToString() + " and jingdu<"
                               + ex.ToString() + " and weidu > "
                               + ey.ToString() + " and weidu < "
                               + by + ")";
            MySqlCommand cmd = Con.CreateCommand();
            cmd.CommandText = "select * from gw_shigu" + t6;
            MySqlDataReader read = cmd.ExecuteReader();
 
            try
            {
 
 
                if (read.HasRows)
                {
                    List<DrawPointData> y1 = new List<DrawPointData>();
                    while (read.Read())
                    {
                        if (MData.ContainsKey(read["number"].ToString() + "A") == false)
                        {
 
                            DrawPointData u1 = new DrawPointData();
 
                            u1.ISAutoAngle = true;
                            u1.ISAutoScal = true;
                            u1.MaxZoomScal = 15;
 
 
                            u1.ID = read["number"].ToString() + "A";
                            u1.MPoint = new Point(Convert.ToDouble(read["jingdu"].ToString()), Convert.ToDouble(read["weidu"].ToString()));
                            Image h1 = new Image();
                            u1.Hi = 0.05;
                            h1.Width = 45;
                            h1.Height = 70;
                            if (read["sgtype"].ToString().Trim() == "重傷")
                                h1.Source = new BitmapImage(new Uri(AppDomain.CurrentDomain.BaseDirectory + "\\res\\重傷.png"));
                            if (read["sgtype"].ToString().Trim() == "輕傷")
                                h1.Source = new BitmapImage(new Uri(AppDomain.CurrentDomain.BaseDirectory + "\\res\\輕傷.png"));
                            if (read["sgtype"].ToString().Trim() == "無傷")
                            {
                                BitmapImage u11 = new BitmapImage(new Uri(AppDomain.CurrentDomain.BaseDirectory + "\\res\\無傷.png"));
                                h1.Source = u11;
                                h1.Width = u11.Width;
                                h1.Height = u11.Height;
                            }
                            h1.Stretch = Stretch.Fill;
 
 
                            h1.Tag = read["number"].ToString() + ";" + u1.MPoint.X.ToString() + ";" + u1.MPoint.Y.ToString();
                            u1.UIObject = h1;
                            y1.Add(u1);
                        }
                    }
                    read.Close();
                  
                    return y1;
                }
                read.Close();
                return null;
            }
            catch
            {
                read.Close();
                return null;
            }
 
 
 
 
        }
上面的方法主要是從接口返回的中心點得到一 個範圍內的用戶數據,並根據用戶的屬性創建不同的UI,

這是根據車輛性制不同顯示的不同車輛圖標,也可以像下面這樣,顯示一些統計數據:

可以充分發揮WPF在UI上的優勢,做出漂亮的標籤

當UI顯示完成後還可以通過調用:

 /// <summary>
        /// 更新用戶層裏的UI對象
        /// </summary>
        /// <param name="Layes">用戶層名稱</param>
        /// <param name="ID">用戶層ID</param>
        /// <param name="NewPoint">新的經緯度</param>
        /// <param name="Angle">新的角度</param>
        /// <param name="NewUI">新的UI</param>
        /// <param name="Ami">是否動畫</param>
        /// <returns></returns>
        public bool UpdateUserObject(string Layes, string ID, Point NewPoint, double Angle, FrameworkElement NewUI, bool Ami = true)

 

接口對已經有的UI進行更新,可實現如滴滴打車一樣的車輛動態效果,該接口只對已經承現的UI有用。

http://www.chinamtouch.com QQ:40140203  微信公衆號:m3dgis2001
————————————————
版權聲明:本文爲CSDN博主「種瓜的」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/xtgmd168/article/details/85686408

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章