GMAP.NET - Поместите маркер в координаты X,Y карты, нажав на карту

Я много читал об этом API. Я начинаю с этого и, наконец, мне удалось поставить маркеры, щелкнув по событию MouseDown на карте, используя следующий код:

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;
using GMap.NET.MapProviders;
using GMap.NET;
using GMap.NET.WindowsForms;
using GMap.NET.WindowsForms.Markers;
using System.Globalization;

namespace GMapApplicationCSharp

{
 public partial class Form1 : Form
    {
    //GMarkerGoogle marker;
    GMapOverlay markers = new GMapOverlay("markers");

    public Form1()
    {
        InitializeComponent();
    }


    private void mapaButton_Click(object sender, EventArgs e)
    {
        mapa.DragButton = MouseButtons.Left;
        mapa.CanDragMap = true;
        mapa.MapProvider = GMapProviders.GoogleMap;
        mapa.SetPositionByKeywords("Madrid, Spain");
        mapa.MinZoom = 0;
        mapa.MaxZoom = 24;
        mapa.Zoom = 9;
        mapa.AutoScroll = true;
        GMap.NET.GMaps.Instance.Mode = GMap.NET.AccessMode.ServerAndCache;
        //mapa.Overlays.Add(markers);
    }

    private void recargaMapaButton_Click(object sender, EventArgs e)
    {
        if (IsMapas.Text == "Google Maps Satélite")
            mapa.MapProvider = GMapProviders.GoogleSatelliteMap;
        if (IsMapas.Text == "Google Maps Callejero")
            mapa.MapProvider = GMapProviders.GoogleMap;
        if (IsMapas.Text == "Google Maps Híbrido")
            mapa.MapProvider = GMapProviders.GoogleHybridMap;
        if (IsMapas.Text == "OpenStreetMap")
            mapa.MapProvider = GMapProviders.OpenStreetMap;
        if (IsMapas.Text == "OpenCycleMap")
            mapa.MapProvider = GMapProviders.OpenCycleMap;

        mapa.Refresh();
    }

    //private void mapa_MouseClick(object sender, MouseEventArgs e)
    //{
        //double lat;
        //double lng;
        //if (e.Button == System.Windows.Forms.MouseButtons.Left)
        //{
        //    lat = mapa.FromLocalToLatLng(e.X, e.Y).Lat;
        //    lng = mapa.FromLocalToLatLng(e.X, e.Y).Lng;
        //    GMapOverlay markers = new GMapOverlay("markers");
        //    GMapMarker marker = new GMarkerGoogle(new PointLatLng(lat, lng), GMarkerGoogleType.blue_pushpin);
        //    markers.Markers.Add(marker);
        //    mapa.Overlays.Add(markers);
        //    Console.WriteLine("LAT: ");
        //    Console.WriteLine(lat);
        //    Console.WriteLine("LON: ");
        //    Console.WriteLine(lng);

        //}
    //}

    //private void SetMarcadorButton_Click(object sender, EventArgs e)
    //{

    //}

    private void mapa_MouseDown(object sender, MouseEventArgs e)
    {
        //double lat;
        //double lng;

        //lat = Convert.ToDouble(LatitudTextBox.Text);
        //lng = Convert.ToDouble(LongitudTextBox.Text);
        //GMapOverlay markers = new GMapOverlay("markers");
        //GMarkerGoogle marker = new GMarkerGoogle(new PointLatLng(lat, lng), GMarkerGoogleType.blue_pushpin);
        //markers.Markers.Add(marker);
        //mapa.Overlays.Add(markers);

        //base.OnMouseMove(e);
        //Application.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US");
        double X = mapa.FromLocalToLatLng(e.X, e.Y).Lng;
        double Y = mapa.FromLocalToLatLng(e.X, e.Y).Lat;

        //string longitude = X.ToString();
        //string latitude = Y.ToString();
        //LatitudTextBox.Text = Convert.ToString(double.Parse(latitude, CultureInfo.InvariantCulture));
        //LongitudTextBox.Text = Convert.ToString(double.Parse(longitude, CultureInfo.InvariantCulture));


        GMarkerGoogle marker = new GMarkerGoogle(new PointLatLng(Y, X), GMarkerGoogleType.blue_pushpin);
        markers.Markers.Add(marker);
        mapa.Overlays.Add(markers);
    }
}
}

Извините за все закомментированные строки..

Моя проблема заключается в том, что при первом щелчке на карте он всегда помещает первый маркер в центр карты. Я не знаю почему, но это происходит только при первом щелчке, потому что в следующих щелчках я вижу маркеры в координатах, которые нажимаю.

Может быть, я чего-то не вижу? Почему первый клик всегда ставит маркер в центр?

Также, если кто-то знает, есть ли способ сохранить карты в кеше, если я хочу использовать приложение в автономном режиме? Может быть, с какой-то функцией или чем-то в этом роде. Потому что я изучал функции ServerOnly, ServerAndCache и CacheOnly, но не знаю, как их правильно использовать. Представьте, что я хочу использовать свое приложение там, где у меня нет Интернета.

РЕДАКТИРОВАТЬ: Здесь я оставляю код в VB.NET (более чистый, чем другой). Я преобразовал код, потому что VB - это язык, на котором я обычно программирую, и, конечно, у меня та же проблема:

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

Public Class Form1

Dim markers As GMapOverlay = New GMapOverlay("markers")

Private Sub CargarButton_Click(sender As Object, e As EventArgs) Handles CargarButton.Click
    mapa.DragButton = Windows.Forms.MouseButtons.Left
    mapa.CanDragMap = True
    mapa.MapProvider = GMapProviders.GoogleMap
    mapa.SetPositionByKeywords("Madrid, Spain")
    mapa.MinZoom = 0
    mapa.MaxZoom = 24
    mapa.Zoom = 9
    mapa.AutoScroll = True
    GMap.NET.GMaps.Instance.Mode = GMap.NET.AccessMode.ServerAndCache
End Sub

Private Sub mapa_MouseDown(sender As Object, e As MouseEventArgs) Handles mapa.MouseDown
    Dim X As Double = mapa.FromLocalToLatLng(e.X, e.Y).Lng
    Dim Y As Double = mapa.FromLocalToLatLng(e.X, e.Y).Lat

    Dim marker As GMarkerGoogle = New GMarkerGoogle(New PointLatLng(Y, X), GMarkerGoogleType.green)
    markers.Markers.Add(marker)
    mapa.Overlays.Add(markers)
End Sub
End Class

1 ответ

Решение

Добавьте наложение один раз на карту. Только тогда добавьте маркеры на оверлей. Это неправильный порядок, так как наложение не прикреплено к экземпляру карты, когда вы добавляете первый маркер к наложению, следовательно, неправильная позиция.

Думаю, вам следует исключить часть кэширования и создать отдельный вопрос.

Другие вопросы по тегам