GMap.NET是什么?
來看看它的官方說明: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!
GMap.NET是一個強大、免費、跨平台、開源的.NET控件,它在Windows Forms 和WPF環境中能夠使用來自Google, Yahoo!, Bing, OpenStreetMap, ArcGIS, Pergo, SigPac等地圖,並可以實現尋找路徑、地理編碼以及地圖展示功能,並支持緩存和運行在Mobile環境中。
項目主頁:https://greatmaps.codeplex.com/
如何在WinForm中使用GMap.Net
下載GMap.Net,我下載的版本:greatmaps_81b71bf30091,編譯三個核心項目:
GMap.Net.Core:核心DLL
GMap.Net.WindowsForms:WinForm中使用的DLL
GMap.NET.WindowsPresentation:WPF中使用的DLL
在WinForm項目中使用GMap:
1、新建一個Visual C# 的Windows窗口程序。添加對GMap.Net.Core.DLL和GMap.Net.WindowsForms.DLL的引用。
2、在項目中添加一個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(); } } }
3、編譯項目,在我們的Form設計窗口下,在工具箱中(tool box)里就可以看到這個MapControl,將這個MapControl加到Form中。
4、在主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); } } }
5、編譯、運行項目就可以看到地圖,這里使用的是在線的Google中國的地圖,地圖控件的幾個主要屬性:
MapProvider:地圖服務的提供者。
MinZoom:最小縮放,最小可為1。
MaxZoom:最大縮放,最大為24.
Zoom:當前縮放。
ShowCenter:是否顯示中心點(最好為false,否則地圖中間會有一個紅色的十字)。
DragButton:哪個鍵拖動地圖。
Position:地圖中心點位置。
地圖顯示如下,支持左鍵拖動,放大縮小,可以顯示左鍵的點擊經緯度。
如何在WPF中使用GMap.Net
1、新建一個Visual C# 的WPF程序。添加對GMap.Net.Core.DLL和GMap.NET.WindowsPresentation.DLL的引用。
2、由於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提供。
3、在我們的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>
4、在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。。。剛開始研究,待續。。。
代碼開源在GitHub上:
項目地址:https://github.com/luxiaoxun/MapDownloader