2017-05-03 12 views
0

このAPIについてよく読んでいます。私はそれで始めていますし、最終的に私はこのコードを使用してマップにMouseDownイベントを使用してクリックすることにより、マーカーを置くことを実現:GMAP.NET - 地図をクリックすると、地図のX、Y座標にマーカーが表示されます

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でコードを残しています(もう1つは他のものです)。

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

はマップに一度オーバーレイを追加します。私はもちろん、私は同じ問題を抱えている、VBは、私は通常のプログラミング言語であるため、コードを変換し、かついます。その後、マーカーをオーバーレイに追加します。間違った順序です。最初のマーカーをオーバーレイに追加したマップインスタンスにはオーバーレイが付いていないため、位置が間違っています。

キャッシュ部分を除外し、別の質問を作成する必要があると考えます。

+0

ちょうどあなたが何を提案する!最初に、マーカーの後のオーバーレイ。私が理解できないことは、インターネット上のすべての例で、誰もが最初にマーカーを置く理由です。どうもありがとう! –

関連する問題