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

从零开始搭建一个GIS开发小框架(六)——GMap.Net组件WPF版本地块单元基本操作一套

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

1

概述

Introduction to new functions

完成一个WPF版本里最常用的一个功能场景:多边形(地块单元)的一套基本操作(我们以后简称煎饼果子来一套功能)。主程序是我以前做的WPF版本万能框子,绿色是目前已经完成的功能。

2

功能实现

Function

  1. 根据坐标创建一个地块单元图形对象
  2. 修改地块单元信息
  3. CGCS2000坐标格式转换,并且自动转WGS84坐标
  4. 地块单元图形对象右键菜单功能
  5. 生成Json格式地块信息数据
  6. 从GMap画布中移除地块单元图形对象
  7. 批量加载全部地块单元图形对象

3

技术栈

Technology stack

  1. Json数据用Newtonsoft.Json组件处理
  2. 页面传值使用.Net的委托

4

视频展示

Video

http://mpvideo.qpic.cn/0bc37yaayaaamuadiprdvzrvb7wdbt7aadaa.f10002.mp4?dis_k=52656870fc49f1ccbc705f846e3b1cb6&dis_t=1669881078&vid=wxv_2577993129967009795&format_id=10002&support_redirect=0&mmversion=false

5

核心功能代码

Code

5.1右键菜单

注册两个事件:GMap_Edit_Polygon和GMap_Delete_Polygon menuItem1.Tag传值,值类型为GMapPolygon

代码语言:javascript
复制
/// <summary>
/// 多边形Shape对象右键事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Polygon_MouseRightButtonDown(object sender, MouseEventArgs e)
{
    UIElement uIElement = (UIElement)sender;
    string uid = uIElement.Uid;

    //找到tag=uid的对象
    GMapPolygon currSelectedPolygon = (GMapPolygon)(MainMap.Markers.Where(u => u.Tag != null).Where(u => Convert.ToString(u.Tag) == uid).FirstOrDefault());

    ContextMenu cm = new ContextMenu();
    //菜单项1:详细信息
    MenuItem menuItem1 = new MenuItem();
    menuItem1.Header = "地块详细信息";
    menuItem1.Click += new RoutedEventHandler(GMap_Edit_Polygon);
    menuItem1.Tag = currSelectedPolygon;  //多边形Shape对象传值
    cm.Items.Add(menuItem1);
    //菜单项2:移除
    MenuItem menuItem2 = new MenuItem();
    menuItem2.Header = "移除地块单元";
    menuItem2.Click += new RoutedEventHandler(GMap_Delete_Polygon);
    menuItem2.Tag = currSelectedPolygon;  //多边形Shape对象传值
    cm.Items.Add(menuItem2);
    //打开菜单
    cm.IsOpen = true;
}

5.2委托事件

在子窗口完成操作后,通过委托事件回传地块单元的主键key到父窗体的setPolygonAttribute方法,在父窗口里(的GMapControl控件)通过setPolygonAttribute方法绘制多边形和修改多边形属性(地块单元)

代码语言:javascript
复制
/// <summary>
/// 设置Polygon属性
/// </summary>
/// <param name="JsonData">json数据</param>
/// <param name="name">土地位置作为name</param>
private void setPolygonAttribute(string JsonData, string name)
{
    try
    {
        PolygonProp p = JsonConvert.DeserializeObject<PolygonProp>(JsonData);
        IList<string> ArrayWGS84 = p.PointsWGS84;
        PolygonPointList.Clear();

        foreach (string temp in ArrayWGS84)
        {
            string[] twoPoints = temp.Split(',');
            PointLatLng po = new PointLatLng();
            po.Lat = double.Parse(twoPoints[0]);
            po.Lng = double.Parse(twoPoints[1]);
            PolygonPointList.Add(po);
        }

        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.MouseWheel += MapControl_MouseWheel;                   //添加滚轮事件
        polygon.Shape.MouseRightButtonDown += Polygon_MouseRightButtonDown;    //多边形对象添加右键事件
        polygon.Shape.Uid = p.LOID.ToString();  //这里可以传递key(但是只能string类型)
        polygon.Tag = p.LOID.ToString();        //polygon的Tag值也存LOID值作为key

        MainMap.Markers.Add(polygon);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 5.1右键菜单
  • 5.2委托事件
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档