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

时间:2015-07-31 13:55:20

标签: c# .net winforms google-maps gmap.net

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

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

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

例如: 我从这个特定地方的谷歌地图上得到了坐标(-22.913715,-43.164096):

enter image description here

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

enter image description here

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

以下是我的代码:

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);

        }

    }
}

2 个答案:

答案 0 :(得分: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;

        }

现在地图可以正常使用。

答案 1 :(得分: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()的每次通话中清除叠加层。你还在用这种方式处理吗?不要认为这是必要的。