1

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

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

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

例如: 我从这个特定地点的谷歌地图中获得了坐标(-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);

        }

    }
}
4

2 回答 2

1

我发现了一种简单的方法来“解决问题”,方法是模拟放大和缩小非常快速和自动

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

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;

        }

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

于 2015-08-01T16:58:55.667 回答
0

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

    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(). 你还在这样处理吗?不要认为这是必要的。

于 2015-08-19T19:46:14.833 回答