WPF中在Gmap.net中将Marker动起来
出处来源于博客园 作者张子浩 原文地址https://www.cnblogs.com/ZaraNet/p/12766143.html,如有转载,请联系我,如无经过作者同意,作者有权申请法律保护。
前一段时间说过一篇绘制极坐标的,这段时间对它进行了改造已经今非昔比了,功能实现了很多,我目的是让Marker动起来,然后还会绘制Route,上篇也就是简单的绘制了Route,没有关于Marker的相关知识。
那个Circle有一定的改造,原来的纯色改成了渐变,这个你可以提前想好,不过在代码中你要做好适配,将 System.draw.color 转换成了 Media.Color ,取其中的ARGB值。
public Circle(string name, int radius,string[] vs)
{
Radius = radius;
m_viewModelCircle = new ViewModelCircle();
m_viewModelCircle.CircleDis = name;
this.DataContext = m_viewModelCircle;
InitializeComponent(); //控制circle RadialGradientBrush radialGradient = new RadialGradientBrush();
var obj = ColorTranslator.FromHtml(vs[]);
var ob2 = ColorTranslator.FromHtml(vs[]);
var ob3 = ColorTranslator.FromHtml(vs[]);
this.circle.Stroke= new SolidColorBrush(System.Windows.Media.Color.FromArgb(ob3.A, ob3.R, ob3.G, ob3.B));
radialGradient.GradientStops.Add(new GradientStop(System.Windows.Media.Color.FromArgb(obj.A, obj.R, obj.G, obj.B), 0.75));
radialGradient.GradientStops.Add(new GradientStop(System.Windows.Media.Color.FromArgb(ob2.A, ob2.R, ob2.G, ob2.B), ));
this.circle.Fill = radialGradient;
}
我们都知道在Wpf的Gmap.net中没有了GMapOverlay 概念,所有的东西都在Marker中操作,这样其实有一个优点,就是把Overlay和Marker混合在一起更好管理,你可以通过Tag来寻找你对象,非常轻便,但设计者不是这么认为的,可能是某些原理没法走通。
最基本的右击在map中添加标点可以这么操作。
private void RadarMap_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
Point clickPoint = e.GetPosition(radarMap);
PointLatLng point = radarMap.FromLocalToLatLng((int)clickPoint.X, (int)clickPoint.Y);
id += ;
GMapMarker currentMarker = new GMapMarker(point);
{
currentMarker.Shape = new CustomMarker(id, currentMarker);
//(currentMarker.Shape as CustomMarker).SetContent(point, "1"); 这种方法可以触发SetContent
currentMarker.ZIndex = -;
currentMarker.Position = point;
radarMap.Markers.Add(currentMarker);
this.Focus();
}
}
代码中可以发现我们可以轻松将gmap的marker shape属性 ,随后转换成原来的marker类型,轻松调用属于它的方法,所以它的生命周期是等待它所在gmap中的marker被销毁才会被dispose,至于我的标点数据是从那里接受的,我只是启用两个Demo而已,发了个udp通讯,一般来说都是使用结构体来接受,传入的Byte值,我们进行逆转。
public static object BytesToStruct(byte[] buf, int len, Type type)
{
// int len = Marshal.SizeOf(buf);
object rtn;
IntPtr buffer = Marshal.AllocHGlobal(len);
Marshal.Copy(buf, , buffer, len);
rtn = Marshal.PtrToStructure(buffer, type);
Marshal.FreeHGlobal(buffer);
return rtn;
}
下面的代码是关于绘制,以及判断marker是否存在,如果存在则修改Postion,而且还要重新绘制Route,每个Route是对应着它的Marker,所以需要一个字典,每次重新绘制的时候,先将Route全部删除,随后重新所有的点,然后进行绘制Route,这个代码可能性能上有缺陷,但也是没有办法。
List<RadarTargetInfo> dislist = new List<RadarTargetInfo>();
//已经添加的集合
public List<RadarTargetInfo> addlist = new List<RadarTargetInfo>();
//用于画线
Dictionary<string,List<PointLatLng>> pointLatLngsDic = new Dictionary<string,List<PointLatLng>>();
//标点和数据id的关系
List<MarkerDataRole> roleList = new List<MarkerDataRole>();
/// <summary>
/// 检查数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void CheckData(object sender, EventArgs e)
{
if (CurrentMarkerContext.list.Count == )
{
return;
}
//应该添加的数据
var list = CurrentMarkerContext.list.Except(addlist).ToList();
addlist.AddRange(list);
dislist.Clear();
foreach (var group in list.GroupBy(u => u.Id))
{
int flyId = group.Key;
RadarTargetInfo radarTarget = new RadarTargetInfo();
PointLatLng currentPoint = new PointLatLng();
foreach (var item in group)
{
PointLatLng point = new PointLatLng(item.Latitude, item.Longitude);
currentPoint = point;
//代表没有
if (roleList.FirstOrDefault(u => u.dataId == flyId) == null)
{
GMapMarker currentMarker = new GMapMarker(point);
{
currentMarker.Shape = new CustomMarker(flyId, currentMarker);
currentMarker.ZIndex = -;
currentMarker.Tag = flyId;
currentMarker.Position = point;
radarMap.Markers.Add(currentMarker);
}
roleList.Add(new MarkerDataRole(){dataId = flyId,markerId = flyId});
}
else
{
radarMap.Markers.Where(u => u.Tag != null).Where(u => Convert.ToInt32(u.Tag) == flyId).FirstOrDefault().Position = point;
}
var str = flyId.ToString();
if (pointLatLngsDic.ContainsKey(str))
{
pointLatLngsDic[str].Add(point);
}
else
{
var value = new List<PointLatLng>();
value.Add(point);
pointLatLngsDic.Add(str, value);
}
radarTarget = item;
}
dislist.Add(radarTarget);
//这里找到flyId
(radarMap.Markers.Where(u => Convert.ToInt32(u.Tag) == flyId).FirstOrDefault().Shape as CustomMarker).SetContent(currentPoint, flyId);
}
this.雷达目标数据.ItemsSource = dislist;
foreach (var item in radarMap.Markers.Where(u => u.Tag != null).Where(u => u.Tag.ToString() == "line").ToList())
{
radarMap.Markers.Remove(item);
}
foreach (var item in pointLatLngsDic)
{
GMapRoute gmRoute = new GMapRoute(pointLatLngsDic[item.Key])
{
Shape = new Line()
{
StrokeThickness =
},Tag = "line"
};
radarMap.Markers.Add(gmRoute);
}
}
还有一个需要强调的是,上面说过可以通过Shape找到本身调用其方法,那个Marker上面的文本就是这么改的。
public void SetContent(PointLatLng point, int pihao)
{
this.批号.Content = pihao.ToString();
this.纬度.Content = "纬度:" + ((int)(point.Lat * ) / 1000.0).ToString();
this.经度.Content = "纬度:" + ((int)(point.Lng * ) / 1000.0).ToString();
}
(radarMap.Markers.Where(u => Convert.ToInt32(u.Tag) == flyId).FirstOrDefault().Shape as CustomMarker).SetContent(currentPoint, flyId);
还有就是至于我的Wpf程序自适应问题,我都是用Viewbox做的,因为前端UI他老是玩Margin,so...你懂的!人家都是Blend for visual Studio 给搞的。也只能见谅了.
WPF中在Gmap.net中将Marker动起来的更多相关文章
- GMap.Net开发之在WinForm和WPF中使用GMap.Net地图插件
GMap.NET是什么? 来看看它的官方说明:GMap.NET is great and Powerful, Free, cross platform, open source .NET contro ...
- GMap.Net解决方案之在WinForm和WPF中使用GMap.Net地图插件的开发
在做地理位置相关的开发时,总是面临高额地图引擎费用让大部分用户望而却步,加之地图数据又是天价,那么GMap.NET就是首选了,它本身就是开源免费,服务器可以在本地缓存,以后访问时就可以直接访问. 可以 ...
- WPF中ListBox滚动时的缓动效果
原文:WPF中ListBox滚动时的缓动效果 上周工作中遇到的问题: 常规的ListBox在滚动时总是一格格的移动,感觉上很生硬. 所以想要实现类似Flash中的那种缓动的效果,使ListBox滚动时 ...
- 基于C#在WPF中使用斑马打印机进行打印【转】
原文链接:http://ju.outofmemory.cn/entry/132476 最近在项目中接手了一个比较有挑战性的模块——用斑马打印机将需要打印的内容打印出来.苦苦折腾了两天,总算有所收获,就 ...
- WPF中的数据绑定!!!
引用自:https://msdn.microsoft.com/zh-cn/magazine/cc163299.aspx 数据点: WPF 中的数据绑定 数据点 WPF 中的数据绑定 John Pap ...
- WPF中动态更新TextBlock文字中的超链接,文本
1.------------------------------------------------------------------------- 修改超链接的文本文字: <TextBloc ...
- 在WPF中的Canvas上实现控件的拖动、缩放
如题,项目中需要实现使用鼠标拖动.缩放一个矩形框,WPF中没有现成的,那就自己造一个轮子:) 造轮子前先看看Windows自带的画图工具中是怎样做的,如下图: 在被拖动的矩形框四周有9个小框,可以从不 ...
- WindowsXamlHost:在 WPF 中使用 UWP 控件库中的控件
在 WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit) 一文中,我们说到了在 WPF 中引入简单的 UWP 控件以及相关的注意事项 ...
- Windows 消息循环(2) - WPF中的消息循环
接上文: Windows 消息循环(1) - 概览 win32/MFC/WinForm/WPF 都依靠消息循环驱动,让程序跑起来. 本文介绍 WPF 中是如何使用消息循环来驱动程序的. 4 消息循环在 ...
随机推荐
- 1.如何运行一个Vue项目
如何运行一个Vue项目 需要的环境: node.js环境(npm包管理器) vue-cli 脚手架构建工具 cnpm npm的淘宝镜像 1. 安装node.js 从node.js官网下载并安装node ...
- 更新statsmodels出现的一系列问题
在statsmodels的开发12版本文档上正好看到使用三因子模型进行rolling regression,但是代码来自最新版本,而我的是老版本,运行下列代码会出现这个问题: No module na ...
- Hbase 整合 Hadoop 的数据迁移
上篇文章说了 Hbase 的基础架构,都是比较理论的知识,最近我也一直在搞 Hbase 的数据迁移, 今天就来一篇实战型的,把最近一段时间的 Hbase 整合 Hadoop 的基础知识在梳理一遍,毕竟 ...
- Python语法元素分析
缩进 1个缩进 = 4个空格 用以在Python中标明代码的层次关系 缩进是Python语言中表明程序框架的唯一手段 注释 注释:程序员在代码中加入的说明信息,不被计算机执行 注释的两种方法: 单行注 ...
- 【tensorflow2.0】处理图片数据-cifar2分类
1.准备数据 cifar2数据集为cifar10数据集的子集,只包括前两种类别airplane和automobile. 训练集有airplane和automobile图片各5000张,测试集有airp ...
- 并查集例题02.带权并查集(poj1182)
Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A.现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底 ...
- Pyhton多线程
在了解多线程前先给大家介绍下并发和并行: 并发:多个任务一起执行 在多任务之间快速切换处理 任务数量大于cpu核数 并行:一个cpu核处理一个任务,多个cpu核同时处理多个任务 任务数量等于或者小于 ...
- echarts整理
保存一些常用的echarts图表及制作方法
- 1007 Maximum Subsequence Sum (25 分)
1007 Maximum Subsequence Sum (25 分) Given a sequence of K integers { N1, N2, ..., NK }. A ...
- python 爬虫之 urllib 实践
文章更新于:2020-03-19 注:本文参考官方文档进行 urllib 的讲解. 文章目录 一.urllib 模块介绍 1.urllib.request.py模块 (1)`urlopen`函数 (2 ...