WPF使用GMap.net框架开发地图应用
GMap.NET有兩個版本,分別是WinForm和WPF的版本,WinForm版本的教程很多。這次主要介紹的WPF版本的操作。
要下載GMap.NET請點擊這里,這個最好下載下來,可以參考里面的Demo來學習。下載下來后,用visual studio打開SourceCode里面的sln文件。打開的時候可能需要讓你下載什么東西,這個有點不記得了,但是關于數據庫的那個應該不用下載。
1、導入dll
1-1、第一種方法
按照下圖打開NuGet包管理器,然后輸入Gmap.net進行搜索,點擊想要安裝的dll,然后選擇項目,點擊安裝即可。
1-2、第二種方法
這種方法就是運行下載下來的源代碼,然后再拷貝Debug下面生成的dll文件。這樣的做法更加靈活,可以自己更改代碼。
2、導入GMapControl控件
2-1、再工具箱空白處右鍵“選項”然后選中GMapControl,點擊確定。即可在工具箱中使用GMapControl控件。
3、導入高德地圖
高德的地圖和google地圖使用的坐標一致,可以切換使用,但是據說百度的又增加了偏移。
3-1、普通地圖
3-2、高德衛星地圖,但是高德衛星地圖(官網的地圖)的數據不完整
using GMap.NET; using GMap.NET.MapProviders; using GMap.NET.Projections; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace jiemian3.CustomMap {public class AMapSateliteProvider : AMapProviderBase{private readonly Guid id = new Guid("FCA94AF4-3467-47c6-BDA2-6F52E4A145BC");public static readonly AMapSateliteProvider Instance = new AMapSateliteProvider();//private readonly string name = Resources.Strings.AMapSatellite;private readonly string name = "AMapSatellite";private static readonly string UrlFormat = "http://webst04.is.autonavi.com/appmaptile?x={0}&y={1}&z={2}&lang=zh_cn&size=1&scale=1&style=6";public override PureImage GetTileImage(GPoint pos, int zoom){string url = this.MakeTileImageUrl(pos, zoom, GMapProvider.LanguageStr);return base.GetTileImageUsingHttp(url);}private string MakeTileImageUrl(GPoint pos, int zoom, string language){string str = string.Format(UrlFormat, pos.X, pos.Y, zoom);Console.WriteLine("url:" + str);return str;}public override Guid Id{get{return this.id;}}public override string Name{get{return this.name;}}} }4、自定義Marker
winform版的自己GMap提供了第三方的marker,但是WPF的需要自己寫。可以參考源代碼項目中Demo目錄下面的“Demo.WindowsPresentation”,WPF所有的代碼都可以參考這個Demo。我直接把“Demo.WindowsPresentation”里面對應的代碼粘貼到下面。
因為這些代碼再一個單獨的文件夾下面,所以注意命名空間和路徑,自己做調整。
CustomMarkerRed.xaml
CustomMarkerRed.xaml.cs
using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Input; using System.Windows.Media; using GMap.NET.WindowsPresentation;namespace Demo.WindowsPresentation.CustomMarkers {/// <summary>/// Interaction logic for CustomMarkerDemo.xaml/// </summary>public partial class CustomMarkerRed{Popup Popup;Label Label;GMapMarker Marker;MainWindow MainWindow;public CustomMarkerRed(MainWindow window, GMapMarker marker, string title){this.InitializeComponent();this.MainWindow = window;this.Marker = marker;Popup = new Popup();Label = new Label();this.Loaded += new RoutedEventHandler(CustomMarkerDemo_Loaded);this.SizeChanged += new SizeChangedEventHandler(CustomMarkerDemo_SizeChanged);this.MouseEnter += new MouseEventHandler(MarkerControl_MouseEnter);this.MouseLeave += new MouseEventHandler(MarkerControl_MouseLeave);this.MouseMove += new MouseEventHandler(CustomMarkerDemo_MouseMove);this.MouseLeftButtonUp += new MouseButtonEventHandler(CustomMarkerDemo_MouseLeftButtonUp);this.MouseLeftButtonDown += new MouseButtonEventHandler(CustomMarkerDemo_MouseLeftButtonDown);Popup.Placement = PlacementMode.Mouse;{Label.Background = Brushes.Blue;Label.Foreground = Brushes.White;Label.BorderBrush = Brushes.WhiteSmoke;Label.BorderThickness = new Thickness(2);Label.Padding = new Thickness(5);Label.FontSize = 22;Label.Content = title;}Popup.Child = Label;}void CustomMarkerDemo_Loaded(object sender, RoutedEventArgs e){if(icon.Source.CanFreeze){icon.Source.Freeze();}}void CustomMarkerDemo_SizeChanged(object sender, SizeChangedEventArgs e){Marker.Offset = new Point(-e.NewSize.Width/2, -e.NewSize.Height);}void CustomMarkerDemo_MouseMove(object sender, MouseEventArgs e){if(e.LeftButton == MouseButtonState.Pressed && IsMouseCaptured){Point p = e.GetPosition(MainWindow.MainMap);Marker.Position = MainWindow.MainMap.FromLocalToLatLng((int) p.X, (int) p.Y);}}void CustomMarkerDemo_MouseLeftButtonDown(object sender, MouseButtonEventArgs e){if(!IsMouseCaptured){Mouse.Capture(this);}}void CustomMarkerDemo_MouseLeftButtonUp(object sender, MouseButtonEventArgs e){if(IsMouseCaptured){Mouse.Capture(null);}}void MarkerControl_MouseLeave(object sender, MouseEventArgs e){Marker.ZIndex -= 10000;Popup.IsOpen = false;}void MarkerControl_MouseEnter(object sender, MouseEventArgs e){Marker.ZIndex += 10000;Popup.IsOpen = true;}} }在主界面中使用
currentMarker = new GMapMarker(MainMap.Position); {currentMarker.Shape = new CustomMarkerRed(this, currentMarker, "custom position marker");currentMarker.Offset = new System.Windows.Point(-15, -15);currentMarker.ZIndex = int.MaxValue;MainMap.Markers.Add(currentMarker); }圖片如下:
5、繪制多邊形
下面只公布部分代碼和思想,如果有不懂的可以提問。有些不方面提供。
5-1、多邊形
使用dll中提供的GMapPolygon類。
5-2、折線(路徑)
使用GMapRoute類,基本和上面的一樣。
5-3、根據鼠標畫矩形
這個需要自己寫一些鼠標事件。這個自己發揮吧,代碼有點亂,自己思考也不難。因為一些原因,這部分代碼不能全部公布,多多理解。
下面的代碼是畫矩形的,只是沒有鼠標事件的代碼。已經很接近了。
5-4、根據鼠標畫圓形
上面的矩形還好是GMAP自己控件畫的,但是圓形沒有,也不能根據點畫,因為有無數個點。最主要的是畫的圓形要能夠更具地圖縮放。這部分還是參考Demo中的代碼。思路是:使用一個XMAL控件,里面是一個圓,設置屬性是填充的,然后改變邊框即可改變圓的大小。首先根據鼠標移動位置和中心點的經緯度坐標轉化成界面坐標,然后計算半徑,畫圓。
Circle.xaml
Circle.xaml.cs
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;namespace Demo.WindowsPresentation.CustomMarkers {/// <summary>/// Interaction logic for Circle.xaml/// </summary>public partial class Circle : UserControl{public Circle(){InitializeComponent();}public PointLatLng Center;public PointLatLng Bound;} }畫圓的代碼
PointLatLng center = mainmarker.Position; circle = new GMapMarker(center); circle_shape = new Circle(); circle_shape.Center = center; circle_shape.Bound = current_point; circle_shape.Tag = circle; circle_shape.IsHitTestVisible = false; UpdateCircle(circle_shape);//下面的代碼 circle.Shape = circle_shape; circle.ZIndex = Circle_index; gmap.Markers.Add(circle);更新圓的大小的代碼,這塊每次在地圖加載的時候調用就可以讓圓不斷變化大小。
private void UpdateCircle(Circle c){var pxCenter = gmap.FromLatLngToLocal(c.Center);var pxBounds = gmap.FromLatLngToLocal(c.Bound);Console.WriteLine(pxCenter + " " + pxBounds);double a = (double)(pxBounds.X - pxCenter.X);double b = (double)(pxBounds.Y - pxCenter.Y);//半徑var pxCircleRadius = Math.Sqrt(a * a + b * b);Console.WriteLine("半徑為:" + pxCircleRadius);c.Width = pxCircleRadius * 2;c.Height = pxCircleRadius * 2;(c.Tag as GMapMarker).Offset = new System.Windows.Point(-c.Width / 2, -c.Height / 2);}6、Zindex
WPF中沒有GMapOverlay,但是可以使用Zindex來設置虛擬的。Zindex越大的顯示就越靠上。
總結
以上是生活随笔為你收集整理的WPF使用GMap.net框架开发地图应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql创建book表_【mysql】
- 下一篇: Python中import的用法