1
概述
Introduction to new functions
完成一个WPF版本里最常用的一个功能场景:多边形(地块单元)的一套基本操作(我们以后简称煎饼果子来一套功能)。主程序是我以前做的WPF版本万能框子,绿色是目前已经完成的功能。
2
功能实现
Function
- 根据坐标创建一个地块单元图形对象
- 修改地块单元信息
- CGCS2000坐标格式转换,并且自动转WGS84坐标
- 地块单元图形对象右键菜单功能
- 生成Json格式地块信息数据
- 从GMap画布中移除地块单元图形对象
- 批量加载全部地块单元图形对象
3
技术栈
Technology stack
- Json数据用Newtonsoft.Json组件处理
- 页面传值使用.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);
}
}