首先下載必須插件:http://greatmaps.codeplex.com/。並引用裏面的dll插件。
在我們編碼的時候,必須要弄懂地圖是怎麼構成的,是有三層構成的,圖片如下(剪切地址:http://www.flickr.com/photos/33793929@N07/6008096410/):
最上層:GMapMarker.中間層:GMapOverlay。最底層:GMapControl。GMapMarker就是用戶選中的地址做的水滴標記。當我們要添加水滴標記的時候,標記先添加進入GMapMarker,再把GMapMarker添加進GMapOverlay,最後把GMapOverlay添加進GMapMarker中,就會打到如下面圖片中的水滴效果。如果是移除水滴標記,則以相反方向依次移除。下面就開始貼代碼了。
功能代碼如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GMap.NET;
using GMap.NET.WindowsForms.Markers;
using GMap.NET.WindowsForms;
using GMap.NET.MapProviders;
using GMap.NET.Projections;
using WindowsFormsApplication1.Properties;
using System.Windows;
namespace WindowsFormsApplication1
{
public partial class FrmMap : Form
{
//地圖由三層組成。最上層:GMapMarker.中間層:GMapOverlay。最底層:GMapControl。
GMapOverlay objects;
GMapControl MainMap;
public FrmMap()
{
InitializeComponent();
//獲得地圖信息,默認北京位置。
SuspendLayout();
MainMap = new GMapControl();
{
//Google中國地圖。
MainMap.MapProvider = GMapProviders.GoogleChinaMap;
MainMap.Position = new PointLatLng(39.904214, 116.407113);
MainMap.MinZoom = 1;
MainMap.MaxZoom = 19;
MainMap.Zoom = 10;
MainMap.Dock = DockStyle.Fill;
MainMap.MarkersEnabled = true;
this.label2.Text = this.label1.Text = "";
this.label1.Text = "經度:" + MainMap.Position.Lng.ToString();
this.label2.Text = "緯度:" + MainMap.Position.Lat.ToString();
}
//this.MainMap.ReloadMap();//重新加載地圖。
GMapProvider.Language = LanguageType.ChineseSimplified;
//最上層的圖標顯示。
Cursor.Current = Cursors.WaitCursor;
var current = new PointLatLng(MainMap.Position.Lat, MainMap.Position.Lng);
var currentMark = new GMapMarkerGoogleGreen(current);
var overlay = new GMapOverlay(MainMap, "current");
overlay.Markers.Add(currentMark);
MainMap.Overlays.Add(overlay);
Cursor.Current = Cursors.Default;
//用戶雙擊標記選中點。並獲得當前的經緯度。
{
MainMap.MouseDoubleClick += new MouseEventHandler(MainMap_MouseDoubleClick);
}
gMapControl1.Controls.Add(MainMap);
ResumeLayout(true);
objects = new GMapOverlay(this.gMapControl1, "objects");
this.gMapControl1.Overlays.Add(objects);
GMapMarkerRect rect = new GMapMarkerRect(MainMap.Position);
rect.Size = new System.Drawing.Size(0, 0);
rect.ToolTipText = "北京市";
rect.ToolTipMode = MarkerTooltipMode.Always;
overlay.Markers.Add(rect);
MainMap.DragButton = MouseButtons.Left;
txtAddress.Focus();
}
//用戶選中地圖位置,獲得經緯度。
void MainMap_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
//圖標顯示。
Cursor.Current = Cursors.WaitCursor;
PointLatLng latLng = MainMap.FromLocalToLatLng(e.X, e.Y);
var current = new PointLatLng(Math.Abs(latLng.Lat), latLng.Lng);
var currentMark = new GMapMarkerGoogleGreen(current);
var overlay = new GMapOverlay(MainMap, "current");
MainMap.MarkersEnabled = false;
overlay.Markers.Clear();
MainMap.Overlays.Clear();
overlay.Markers.Add(currentMark);
MainMap.Overlays.Add(overlay);
MainMap.MarkersEnabled = true;
Cursor.Current = Cursors.Hand;
this.label2.Text = this.label1.Text = "";
this.label1.Text = "經度:" + latLng.Lng.ToString();
this.label2.Text = "緯度:" + latLng.Lat.ToString();
}
}
//根據城市查詢地圖。
private void btnSearch_Click(object sender, EventArgs e)
{
if (this.txtAddress.Text.Length == 0)
{
this.txtAddress.Focus();
MessageBox.Show("請輸入查詢的地址");
return;
}
this.MainMap.ReloadMap();
GMapProvider.Language = LanguageType.ChineseSimplified;
string search = string.Format("{0}", this.txtAddress.Text);
//判斷地址鍵是否存在。
GeoCoderStatusCode code = MainMap.SetCurrentPositionByKeywords(search);
if (code != GeoCoderStatusCode.G_GEO_SUCCESS)
{
MessageBox.Show("地址沒有找到:'" + this.txtAddress.Text + "', 原因:" + code.ToString(), "GMap.NET", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
objects = new GMapOverlay(MainMap, "objects");
objects.Markers.Clear();
this.MainMap.Overlays.Clear();
AddLocation(txtAddress.Text);
}
//由地址獲得經緯度,再顯示地圖位置。
private void AddLocation(string place)
{
GeoCoderStatusCode unknow = GeoCoderStatusCode.Unknow;
PointLatLng? latLngFromGeocoder = GMap.NET.MapProviders.GMapProviders.GoogleChinaMap.GetPoint(place, out unknow);
if (latLngFromGeocoder.HasValue && (unknow == GeoCoderStatusCode.G_GEO_SUCCESS))
{
GMapMarker item = new GMapMarkerGoogleGreen(latLngFromGeocoder.Value);
GMapMarkerRect rect = new GMapMarkerRect(latLngFromGeocoder.Value);
rect.Size = new System.Drawing.Size(100, 100);
rect.ToolTipText = place;
rect.ToolTipMode = MarkerTooltipMode.Always;
objects = new GMapOverlay(MainMap, "objects");
objects.Markers.Add(item);
objects.Markers.Add(rect);
MainMap.Overlays.Add(objects);
this.label2.Text = this.label1.Text = "";
this.label1.Text = "經度:" + latLngFromGeocoder.Value.Lng.ToString();
this.label2.Text = "緯度:" + latLngFromGeocoder.Value.Lat.ToString();
if (txtAddress.Text.Length < 4)
{
this.MainMap.Zoom = 10;
}
else
{
this.MainMap.Zoom += 3;
}
}
}
}
}
界面如下:
加載運行後的效果如下:
其中搜索的方法AddLocation中有一個類GMapMarkerRect 需要重新建立一個類,類中代碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WindowsFormsApplication1
{
using System.Drawing;
using GMap.NET.WindowsForms;
using GMap.NET.WindowsForms.Markers;
using GMap.NET;
using System;
using System.Runtime.Serialization;
using System.Drawing.Drawing2D;
[Serializable]
public class GMapMarkerRect : GMapMarker, ISerializable
{
[NonSerialized]
public Pen Pen;
//[NonSerialized]
//public GMarkerGoogle InnerMarker;
public GMapMarkerRect(PointLatLng p): base(p)
{
Pen = new Pen(Brushes.Blue, 5);
// do not forget set Size of the marker
// if so, you shall have no event on it ;}
Size = new System.Drawing.Size(111, 111);
Offset = new System.Drawing.Point(-Size.Width / 2, -Size.Height / 2);
}
public override void OnRender(Graphics g)
{
g.DrawRectangle(Pen, new System.Drawing.Rectangle(LocalPosition.X, LocalPosition.Y, Size.Width, Size.Height));
}
}
}
按地址搜索後的效果如下:
《參考文章:http://www.cnblogs.com/wuhuacong/archive/2010/03/10/1681790.html》