• 从零开始搭建一个GIS开发小框架(五)——GMap.Net组件WPF版本使用体验


    1.试用情况介绍

    现在windows平台的开发越来越流行WPF,我发现GMap.Net也有WPF版本,就跟风尝试了一下,只能说泪流满面,原本在GMap.Net.Winforms版本里使用很方便的方法和属性,在WPF版本里都没有了,很多方法都只能自己硬写代码实现。我计划完成一个WPF版本的Demo(绿色是目前已经完成的功能)。主程序是我以前做的WPF版本万能框子,GMap.Net组件是其中一个UserControl。

    2.规划功能

    1. 加载高德在线地图
    2. 加载OpenCycleMap离线瓦片地图
    3. CGCS2000坐标转WGS84坐标
    4. 添加自定义图标的标记点
    5. 绘制多边形,多边形对象实现双击事件和右键菜单功能,实现多边形对象带属性和属性传值
    6. 地址文字字符串寻坐标
    7. Marker对象鼠标拖动效果

    3.Demo实现效果演示

    内容包括:添加自定义点对象和多边形对象,同时多边形对象注册右键响应事件,弹出菜单,多边形创建时给与一个uid,作为唯一主键,将这个值传值给删除事件,完成删除动作。

    GMap.Net WPF版效果演示

    4.传送门(其它后续添加的内容)

    【视频演示】GMap.Net.WPF版实现路标可移动效果

    5.多边形绘制和注册鼠标事件的代码讲解

    以绘制多边形这个最干货的功能为例介绍一下WPF的实现思路以及与Winforms版本的区别。我个人感受最大的区别就是WPF里没有了GMapOverlay类,无法再通过GMapOverlay对图层进行控制,Marker和Polygon对象的OnMarkerClick 和OnPolygonClick 方法都取消了,导致添加右键菜单和传值很不方便,虽然也能实现右键事件和传值,但是总觉得没有找到正统方法。

    在WPF里没有了GMapOverlay,所以无法创建一个polygonAuxiliaryLinelay层用于绘制多边形辅助线

    //winforms版本
    public GMapOverlay polygonAuxiliaryLinelay = new GMapOverlay("polygonAuxiliaryLine"); 
    
    //WPF版本用List缓存实现
    List<GMapRoute> polygonAuxiliaryLinelay = new List<GMapRoute>(); //创建一个多边形辅助线list(作为缓存)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    WPF版本里GMapControl没有OnMarkerClick 和OnPolygonClick 方法:

    //winforms版本
    MainMap.OnMarkerClick += new MarkerClick(mapControl_OnMarkerClick);
    MainMap.OnPolygonClick += new PolygonClick(mapControl_OnPolygonClick);
    
    • 1
    • 2
    • 3

    WPF里绘制线条、绘制多边形、给多边形对象添加右键事件代码示例如下:

    //绘制线条
    GMapRoute _routeOnPolygon = new GMapRoute(latlngs);
    _routeOnPolygon.ZIndex = 10;
    _routeOnPolygon.Shape = new Path() { StrokeThickness = 1, Stroke = Brushes.Red };
    MainMap.Markers.Add(_routeOnPolygon);
    
    //绘制多边形
    GMapPolygon polygon = new GMapPolygon(PolygonPointList);
    Brush b = new SolidColorBrush(Color.FromRgb(255, 255, 0));  //黄色
    b.Opacity = 0.5;  //设置透明度
    polygon.Shape = new Path() { StrokeThickness = 1, Stroke = Brushes.Red, Fill = b };
    polygon.Shape.IsHitTestVisible = true;
    polygon.Shape.MouseRightButtonDown += Polygon_MouseRightButtonDown;    //多边形对象添加右键事件
    string ukey = Guid.NewGuid().ToString();
    polygon.Shape.Uid = ukey;   //这里可以传递key值(但是只能string类型)
    polygon.Tag = ukey;
    MainMap.Markers.Add(polygon);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    GMapPolygon 声明一个对象实例polygon,polygon的MouseRightButtonDown 事件不能直接注册到GMapPolygon 对象polygon上,而是注册到polygon.Shape上,因此MouseRightButtonDown 方法的sender也是polygon.Shape而不是polygon本身,所以MouseRightButtonDown 能获取到的传值只能是通过polygon.Shape(UIElement类型)传递,polygon.Shape只有一个uid(string类型)属性可以传值,上述示例通过给polygon.Shape.Uid赋值并且给polygon.Tag赋一样的值,将多边形polygon的唯一标识ukey传递给Polygon_MouseRightButtonDown方法,在方法里通过找polygon.Tag=Uid的方式找到polygon对象,后续就可以进行相应的业务层操作了,我觉得方法有点笨,但是polygon.Shape没有Tag属性(object类型),没有办法传递一个对象。

  • 相关阅读:
    什么是网络安全等级保护
    c# ? 和 ??
    面试系列Spring:Spring的事务传播
    JAVA反射机制详解
    「C++: Eigen」第一章 第二节 Matrix and vector arithmetic
    【洛谷P1854,gzoj1086】花店柜台布置【DP】
    机器学习基本模型与算法在线实验闯关
    APP产品经理的职责(合集)
    重装系统后打印机状态已暂停如何恢复
    Android 13 - Media框架(11)- MediaCodec(一)
  • 原文地址:https://blog.csdn.net/xiangcns/article/details/126518785