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

1.试用情况介绍

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

2.功能

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

3.技术栈

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

4.Demo实现效果演示

GMap.Net.WPF演示地块单元煎饼果子一套

5.关键代码示例

5.1右键菜单

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

/// <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方法绘制多边形和修改多边形属性(地块单元)

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

}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiangcns

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值