GMap.NET多边形清除不彻底及标记连接异常问题求助
GMap.NET开发问题解决
问题1:清除多边形后旧图形重现
原因
点击删除按钮时,仅调用map.Overlays.Clear()移除了地图上的Overlay,但全局的points列表和polygons Overlay对象仍保留着之前的点和多边形数据。再次点击地图时,会基于旧的points创建新多边形,并且重复将polygons Overlay添加到地图,导致已清除的旧多边形重新显示。
修复
在删除按钮事件中,额外清空points列表、polygons.Polygons集合,确保所有缓存数据被清除:
private void deletea_Click(object sender, EventArgs e) //Delete all button { map.Overlays.Clear(); points.Clear(); polygons.Polygons.Clear(); map.Refresh(); }
问题2:添加第三个标记时首尾自动连接
原因
当前使用GMapPolygon类创建图形,该类是闭合多边形,会自动将最后一个点与第一个点连接,导致添加第三个点时出现首尾相连的情况。如果需要的是仅相邻点依次连接的折线,应使用GMapRoute类。
修复
将GMapPolygon替换为GMapRoute,并调整图形创建逻辑:
// 替换全局变量定义 GMapOverlay routes = new GMapOverlay("routes"); List<PointLatLng> points = new List<PointLatLng>(); GMapRoute route; // 鼠标点击事件修改 public void map_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { // 添加标记逻辑不变 GMapOverlay o = new GMapOverlay("o"); PointLatLng clickPoint = map.FromLocalToLatLng(e.X, e.Y); var m = new GMarkerGoogle(clickPoint, GMarkerGoogleType.red); map.Overlays.Add(o); o.Markers.Add(m); points.Add(clickPoint); // 使用GMapRoute创建折线 routes.Routes.Clear(); // 清除旧折线,只保留最新的完整折线 if (points.Count >= 2) { route = new GMapRoute(points, "Route"); route.Stroke = new Pen(Color.Red, 1); routes.Routes.Add(route); } // 确保routes Overlay只添加一次 if (!map.Overlays.Contains(routes)) { map.Overlays.Add(routes); } map.Invalidate(); } }
完整修复后的代码
private void gMapControl1_Load(object sender, EventArgs e) //map load { map.MapProvider = GoogleSatelliteMapProvider.Instance; GMaps.Instance.Mode = AccessMode.ServerOnly; map.Position = new GMap.NET.PointLatLng(/* 你的坐标 */); map.DragButton = MouseButtons.Left; map.MinZoom = 5; map.MaxZoom = 100; map.Zoom = 20; } private void deletea_Click(object sender, EventArgs e) //Delete all button { map.Overlays.Clear(); points.Clear(); routes.Routes.Clear(); map.Refresh(); } // 全局变量调整 GMapOverlay routes = new GMapOverlay("routes"); List<PointLatLng> points = new List<PointLatLng>(); GMapRoute route; public void map_MouseClick(object sender, MouseEventArgs e) //add marker and route by click { if (e.Button == MouseButtons.Left) { GMapOverlay o = new GMapOverlay("o"); PointLatLng clickPoint = map.FromLocalToLatLng(e.X, e.Y); var m = new GMarkerGoogle(clickPoint, GMarkerGoogleType.red); map.Overlays.Add(o); o.Markers.Add(m); points.Add(clickPoint); routes.Routes.Clear(); if (points.Count >= 2) { route = new GMapRoute(points, "Route"); route.Stroke = new Pen(Color.Red, 1); routes.Routes.Add(route); } if (!map.Overlays.Contains(routes)) { map.Overlays.Add(routes); } map.Invalidate(); } }
内容的提问来源于stack exchange,提问作者smfa3
相关产品推荐
相关产品推荐

