指揮電子沙盤虛擬數字沙盤教程第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