前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从零开始搭建一个GIS开发小框架(五)——GMap.Net组件WPF版使用体验

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

作者头像
天堂向左
发布2022-12-01 15:50:57
1.1K0
发布2022-12-01 15:50:57
举报
文章被收录于专栏:天堂向左程序员向右

1

使用情况介绍

Introduction to test

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

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

2

运行效果演示

Exhibition

http://mpvideo.qpic.cn/0bc36aaa2aaasuacr4iip5rvb4gdbxyaadia.f10002.mp4?dis_k=a83390f582c541d35d485c8eaed2346e&dis_t=1669881008&vid=wxv_2548223803470954497&format_id=10002&support_redirect=0&mmversion=false

3

多边形示例代码讲解

Polygon

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

1

GMapOverlay类取消

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

代码语言:javascript
复制
//winforms版本
public GMapOverlay polygonAuxiliaryLinelay = new GMapOverlay("polygonAuxiliaryLine"); 

//WPF版本用List<T>缓存实现
List<GMapRoute> polygonAuxiliaryLinelay = new List<GMapRoute>(); //创建一个多边形辅助线list(作为缓存

2

OnClick方法取消

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

代码语言:javascript
复制
//winforms版本
MainMap.OnMarkerClick += new MarkerClick(mapControl_OnMarkerClick);
MainMap.OnPolygonClick += new PolygonClick(mapControl_OnPolygonClick);

3

绘制和右键事件

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

代码语言:javascript
复制
//绘制线条
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);

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类型),没有办法传递一个对象。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 天堂向左程序员向右 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档