You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 11:57:40