GMap.NET是什麼?windows
來看看它的官方說明:GMap.NET is great and Powerful, Free, cross platform, open source .NET control. Enable use routing, geocoding, directions and maps from Coogle, Yahoo!, Bing, OpenStreetMap, ArcGIS, Pergo, SigPac, Yendux, Mapy.cz, Maps.lt, iKarte.lv, NearMap, OviMap, CloudMade, WikiMapia, MapQuest in Windows Forms & Presentation, supports caching and runs on windows mobile!api
GMap.NET是一個強大、免費、跨平臺、開源的.NET控件,它在Windows Forms 和WPF環境中可以使用來自Google, Yahoo!, Bing, OpenStreetMap, ArcGIS, Pergo, SigPac等地圖,並能夠實現尋找路徑、地理編碼以及地圖展現功能,並支持緩存和運行在Mobile環境中。緩存
項目主頁:https://greatmaps.codeplex.com/ide
如何在WinForm中使用GMap.Net工具
下載GMap.Net,我下載的版本:greatmaps_81b71bf30091,編譯三個核心項目:google
GMap.Net.Core:核心DLL編碼
GMap.Net.WindowsForms:WinForm中使用的DLLspa
GMap.NET.WindowsPresentation:WPF中使用的DLL設計
在WinForm項目中使用GMap:code
一、新建一個Visual C# 的Windows窗口程序。添加對GMap.Net.Core.DLL和GMap.Net.WindowsForms.DLL的引用。
二、在項目中添加一個UserControl,這裏取名爲MapControl,修改這個UserControl,使其繼承於GMapControl,這就是展現地圖的控件。修改以下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; using GMap.NET.WindowsForms; namespace GMapWinFormDemo { public partial class MapControl : GMapControl { public MapControl() { InitializeComponent(); } } }
三、編譯項目,在咱們的Form設計窗口下,在工具箱中(tool box)裏就能夠看到這個MapControl,將這個MapControl加到Form中。
四、在主Form中添加相關的代碼以下
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; using GMap.NET.MapProviders;
using GMap.NET.WindowsForms.Markers; namespace GMapDemo { public partial class MapForm : Form { private GMapOverlay markersOverlay = new GMapOverlay("markers"); //放置marker的圖層 public MapForm() { InitializeComponent(); try { System.Net.IPHostEntry e = System.Net.Dns.GetHostEntry("ditu.google.cn"); } catch { mapControl.Manager.Mode = AccessMode.CacheOnly; MessageBox.Show("No internet connection avaible, going to CacheOnly mode.", "GMap.NET Demo", MessageBoxButtons.OK, MessageBoxIcon.Warning); } mapControl.CacheLocation = Environment.CurrentDirectory + "\\GMapCache\\"; //緩存位置 mapControl.MapProvider = GMapProviders.GoogleChinaMap; //google china 地圖 mapControl.MinZoom = 2; //最小比例 mapControl.MaxZoom = 24; //最大比例 mapControl.Zoom = 10; //當前比例 mapControl.ShowCenter = false; //不顯示中心十字點 mapControl.DragButton = System.Windows.Forms.MouseButtons.Left; //左鍵拖拽地圖 mapControl.Position = new PointLatLng(32.064,118.704); //地圖中心位置:南京 mapControl.Overlays.Add(markersOverlay); mapControl.MouseClick += new MouseEventHandler(mapControl_MouseClick); } void mapControl_MouseClick(object sender, MouseEventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Right) { PointLatLng point = mapControl.FromLocalToLatLng(e.X, e.Y); GMapMarker marker = new GMarkerGoogle(point, GMarkerGoogleType.green); markersOverlay.Markers.Add(marker); } } }
五、編譯、運行項目就能夠看到地圖,這裏使用的是在線的Google中國的地圖,地圖控件的幾個主要屬性:
MapProvider:地圖服務的提供者。
MinZoom:最小縮放,最小可爲1。
MaxZoom:最大縮放,最大爲24.
Zoom:當前縮放。
ShowCenter:是否顯示中心點(最好爲false,不然地圖中間會有一個紅色的十字)。
DragButton:哪一個鍵拖動地圖。
Position:地圖中心點位置。
地圖顯示以下,支持左鍵拖動,放大縮小,能夠顯示左鍵的點擊經緯度。
如何在WPF中使用GMap.Net
一、新建一個Visual C# 的WPF程序。添加對GMap.Net.Core.DLL和GMap.NET.WindowsPresentation.DLL的引用。
二、因爲WPF的UserControl不能修改繼承的基類,因此添加一個新的類,爲MapControl.cs,代碼以下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using GMap.NET.WindowsPresentation; namespace GMapWPFDemo { class MapControl : GMapControl { } }
只須要繼承GMapControl就好了,基本功能均可以由GMapControl提供。
三、在咱們的MainWindow.xaml中,添加項目的namespace:xmlns:src="clr-namespace:GMapWPFDemo",在XML代碼中添加對MapControl.cs的使用:
<Window x:Class="GMapWPFDemo.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:src="clr-namespace:GMapWPFDemo" Title="MainWindow" Height="410" Width="618"> <Grid> <GroupBox Name="mapgroup" VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch"> <src:MapControl x:Name="mapControl" Zoom="13" MaxZoom="24" MinZoom="1" /> </GroupBox> </Grid> </Window>
四、在MainWindow中添加相關的代碼以下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using GMap.NET; using GMap.NET.MapProviders; using GMap.NET.WindowsPresentation; namespace GMapWPFDemo { /// <summary> /// MainWindow.xaml 的交互邏輯 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); try { System.Net.IPHostEntry e = System.Net.Dns.GetHostEntry("ditu.google.cn"); } catch { mapControl.Manager.Mode = AccessMode.CacheOnly; MessageBox.Show("No internet connection avaible, going to CacheOnly mode.", "GMap.NET Demo", MessageBoxButton.OK, MessageBoxImage.Warning); } mapControl.MapProvider = GMapProviders.GoogleChinaMap; //google china 地圖 mapControl.MinZoom = 2; //最小縮放 mapControl.MaxZoom = 17; //最大縮放 mapControl.Zoom = 5; //當前縮放 mapControl.ShowCenter = false; //不顯示中心十字點 mapControl.DragButton = MouseButton.Left; //左鍵拖拽地圖 mapControl.Position = new PointLatLng(32.064, 118.704); //地圖中心位置:南京 mapControl.MouseLeftButtonDown += new MouseButtonEventHandler(mapControl_MouseLeftButtonDown); } void mapControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { Point clickPoint = e.GetPosition(mapControl); PointLatLng point = mapControl.FromLocalToLatLng((int)clickPoint.X, (int)clickPoint.Y); GMapMarker marker = new GMapMarker(point); mapControl.Markers.Add(marker); } } }
效果圖以下:
和Winform代碼差很少,一些響應事件不一樣,WPF的GMap中沒有GMapOverlay這個「圖層」的概念,因此無法加多個GMapOverlay,在GMapOverlay上再加GMapMarker(能夠理解爲圖標標註),GMapMarker只能直接加在mapControl上面。
WPF的GMapMarker能夠直接實例化(WinForm中的不行),可是貌似沒有默認提供的效果,而要作出一些效果,須要本身設計實現,官方Demo中已經有了一些實現,WinForm中的GMapMarker能夠用GMarkerGoogle去實例化(提供的有可選的效果,也能夠本身傳入bitmap做爲自定義的圖標)。
作過一段時間ArcGIS開發,因爲ArcGIS的受權費用,爲了節省成本,開始搞GMap.Net。。。剛開始研究,待續。。。