如何修复标记的错误位置?

How to fix the wrong position of the markers?

我一直在使用 Gmap.Net 控制器开发 Windows 表单应用程序,但是 每次我尝试添加新标记时,它都会转到错误的位置.

我看到一个类似的问题 说当地图被缩放时标记会移动到正确的位置,但我想修复它,因为如果我在添加标记之前简单地添加地图的叠加层它不起作用作为所提出问题的答案,这就是为什么它不是一个重复的问题,因为我想要一个不同的解决方案。

如何解决我创建的全局列表中的标记位置错误的问题?

例如: 我从这个特定地点的 google 地图中得到了坐标 (-22.913715, -43.164096):

但是当我尝试在我的 Gmap.Net 应用程序上添加相同的坐标时,标记转到了错误的位置,如下所示:

所以我真的不知道我创建的全局标记列表是否正常工作。

这是我的代码:

using GMap.NET;
using GMap.NET.MapProviders;
using GMap.NET.WindowsForms;
using GMap.NET.WindowsForms.Markers;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;


namespace BarcoSolar_UFF
{
    public partial class Form1 : Form
    {
        //Create a global list
        List<PointLatLng> Pontos = new List<PointLatLng>();



        public Form1()
        {
            InitializeComponent();
            gMapControl1.MapProvider = GMapProviders.GoogleMap;
            gMapControl1.MinZoom = 0;
            gMapControl1.MaxZoom = 24;
            gMapControl1.Zoom = 10;
            gMapControl1.SetPositionByKeywords("niteroi");
            gMapControl1.ShowCenter = false;
            gMapControl1.DragButton = MouseButtons.Left;
        }


        //Function to remove all the Markers
        public void button1_Click(object sender, EventArgs e)
        {
            //Clean the map
            gMapControl1.Overlays.Clear();

            //Clean the list of markers
            Pontos.Clear();

            //Updates the map
            atualizarMapa();
        }

        private void gMapControl1_Load(object sender, EventArgs e)
        {

        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void atualizarMapa()
        {
            //Clean the map
            gMapControl1.Overlays.Clear();

            //Create a new overlay 
            GMapOverlay markersOverlay = new GMapOverlay("markers");

            foreach (PointLatLng p in Pontos)
            {

                //Create a red marker
                GMarkerGoogle marker1 = new GMarkerGoogle(p, GMarkerGoogleType.red);

                //Add a marker on the overlay
                markersOverlay.Markers.Add(marker1);
            }

            //Add the overlay on the gMapControl1(Map)
            gMapControl1.Overlays.Add(markersOverlay);

            //gMapControl1.UpdateMarkerLocalPosition(marker);

        }

        //Function to Add Markers
        private void button1_Click_1(object sender, EventArgs e)
        {
            //Leitura de variavel formato .txt
            string Lat_s = textBox1.Text;
            string Lng_s = textBox2.Text;

            //Convert to Double
            double Lat = double.Parse(Lat_s);
            double Lng = double.Parse(Lng_s);

            //Add Markers to a Global List
            PointLatLng ponto = new PointLatLng(Lat, Lng);
            Pontos.Add(ponto);

            atualizarMapa();

        }

        //Add  the Route on the Map
        private void button1_Click_2(object sender, EventArgs e)
        {

            GMapOverlay polyOverlay = new GMapOverlay("polygons");
            GMapPolygon polygon = new GMapPolygon(Pontos, "rota");
            polygon.Fill = new SolidBrush(Color.Transparent);
            float[] dashValues = { 5, 5 };
            polygon.Stroke = new Pen(Color.Red, 1);
            polygon.Stroke.DashPattern = dashValues;
            polyOverlay.Polygons.Add(polygon);
            gMapControl1.Overlays.Add(polyOverlay);

        }

    }
}

我发现了一种 "fix the problem" 的简单方法,方法是 非常快速且自动地模拟放大和缩小

这样一来,我添加的每个新标记都已经位于正确的位置,而无需对代码进行过多修改。

1.创建放大和缩小的模拟。

首先,您需要创建我们通常使用鼠标滚动进行的放大和缩小 模拟,这段代码应该可以很好地应对这种情况:

         double zoomAtual = gMapControl1.Zoom;
         gMapControl1.Zoom = zoomAtual + 1;
         gMapControl1.Zoom = zoomAtual;

2。将代码放在标记函数的末尾。

之后你需要将这部分代码放在创建新标记的函数的末尾,例如我将其写在标记函数的循环中:

        //Update the Map
        private void atualizarMapa()
        {
            //Clean the map
            gMapControl1.Overlays.Clear();

            //Create a new overlay 
            GMapOverlay markersOverlay = new GMapOverlay("markers");

            foreach (PointLatLng p in Pontos)
            {

                //Create a red marker
                GMarkerGoogle marker1 = new GMarkerGoogle(p, GMarkerGoogleType.red);

                //Add a marker on the overlay
                markersOverlay.Markers.Add(marker1);
            }

            //Add the overlay on the gMapControl1(Map)
            gMapControl1.Overlays.Add(markersOverlay);

            double zoomAtual = gMapControl1.Zoom;
            gMapControl1.Zoom = zoomAtual + 1;
            gMapControl1.Zoom = zoomAtual;

        }

现在地图可以正常工作了。

我拿了你的样本并更改了建议的部分:

    private void atualizarMapa()
    {
        //Clean the map
        gMapControl1.Overlays.Clear();

        //Create a new overlay 
        GMapOverlay markersOverlay = new GMapOverlay("markers");

        //Add the overlay on the gMapControl1(Map)
        // This makes all the difference: The marker is set in the correct position, if the overlay is added first.
        gMapControl1.Overlays.Add(markersOverlay);

        foreach (PointLatLng p in Pontos)
        {

            //Create a red marker
            GMarkerGoogle marker1 = new GMarkerGoogle(p, GMarkerGoogleType.red);

            //Add a marker on the overlay
            markersOverlay.Markers.Add(marker1);
        }
        //gMapControl1.UpdateMarkerLocalPosition(marker);

    }

结果是:简单地移动语句

gMapControl1.Overlays.Add(markersOverlay);

foreach 循环前面正确定位标记。

您在 atualizarMapa() 的每次调用中清除叠加层。你还在这样处理吗?觉得没必要。