GMap.Net根據地址搜索,並雙擊獲得經緯度((Winform)最新版本的代碼)

      首先下載必須插件: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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章