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

2022-12-01 15:51:55 浏览数 (1)

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);
    }

}

0 人点赞