日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

WPF使用GMap.net框架开发地图应用

發布時間:2023/12/16 asp.net 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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、普通地圖

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 abstract class AMapProviderBase : GMapProvider{public AMapProviderBase(){MaxZoom = null;RefererUrl = "http://www.amap.com/";//Copyright = string.Format("?{0} 高德 Corporation, ?{0} NAVTEQ, ?{0} Image courtesy of NASA", DateTime.Today.Year); }public override PureProjection Projection{get { return MercatorProjection.Instance; }}GMapProvider[] overlays;public override GMapProvider[] Overlays{get{if (overlays == null){overlays = new GMapProvider[] { this };}return overlays;}}}public class AMapProvider : AMapProviderBase{public static readonly AMapProvider Instance;readonly Guid id = new Guid("EF3DD303-3F74-4938-BF40-232D0595EE88");public override Guid Id{get { return id; }}readonly string name = "AMap";public override string Name{get{return name;}}static AMapProvider(){Instance = new AMapProvider();}public override PureImage GetTileImage(GPoint pos, int zoom){try{string url = MakeTileImageUrl(pos, zoom, LanguageStr);return GetTileImageUsingHttp(url);}catch (Exception ex){return null;}}string MakeTileImageUrl(GPoint pos, int zoom, string language){var num = (pos.X + pos.Y) % 4 + 1;//string url = string.Format(UrlFormat, num, pos.X, pos.Y, zoom);string url = string.Format(UrlFormat, pos.X, pos.Y, zoom);return url;}//static readonly string UrlFormat = "http://webrd04.is.autonavi.com/appmaptile?x={0}&y={1}&z={2}&lang=zh_cn&size=1&scale=1&style=7";static readonly string UrlFormat = "http://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={0}&y={1}&z={2}";} }

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

<UserControlxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"x:Class="Demo.WindowsPresentation.CustomMarkers.CustomMarkerRed"Height="40" Width="30" Opacity="10"><Image Name="icon" Source="red-dot.png" VerticalAlignment="Center" HorizontalAlignment="Center" /> </UserControl>

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類。

List<PointLatLng> points = new List<PointLatLng>(); //在這塊添加一些points GMapPolygon polygon = new GMapPolygon(points);polygon.ZIndex = 10; //設置Zindex,顯示的優先級(層) polygon.RegenerateShape(gmap); //gmap就是地圖控件 //下面這個比較重要,是設置樣式。 (polygon.Shape as Path).Stroke = Brushes.GreenYellow; (polygon.Shape as Path).StrokeThickness = 5; (polygon.Shape as Path).Effect = null; gmap.Markers.Add(polygon);

5-2、折線(路徑)
使用GMapRoute類,基本和上面的一樣。

List<PointLatLng> points = new List<PointLatLng>(); //在這塊添加一些points GMapRoute route = new GMapRoute(points);// route.ZIndex = 10; route.RegenerateShape(gmap); (route.Shape as Path).Stroke = Brushes.Blue; (route.Shape as Path).StrokeThickness = 5; (route.Shape as Path).Effect = null; gmap.Markers.Add(route);

5-3、根據鼠標畫矩形
這個需要自己寫一些鼠標事件。這個自己發揮吧,代碼有點亂,自己思考也不難。因為一些原因,這部分代碼不能全部公布,多多理解。
下面的代碼是畫矩形的,只是沒有鼠標事件的代碼。已經很接近了。

PointLatLng startpoint = mainmarker.Position;List<PointLatLng> list_points = new List<PointLatLng>();if (startpoint.Lat > current_point.Lat){if (startpoint.Lng < current_point.Lng){//右下list_points.Add(startpoint);list_points.Add(new PointLatLng(startpoint.Lat, current_point.Lng));list_points.Add(current_point);list_points.Add(new PointLatLng(current_point.Lat, startpoint.Lng));}else{//左下list_points.Add(startpoint);list_points.Add(new PointLatLng(current_point.Lat, startpoint.Lng));list_points.Add(current_point);list_points.Add(new PointLatLng(startpoint.Lat, current_point.Lng));}}else{if (startpoint.Lng < current_point.Lng){//右上list_points.Add(startpoint);list_points.Add(new PointLatLng(startpoint.Lat, current_point.Lng));list_points.Add(current_point);list_points.Add(new PointLatLng(current_point.Lat, startpoint.Lng));}else{//左上list_points.Add(startpoint);list_points.Add(new PointLatLng(current_point.Lat, startpoint.Lng));list_points.Add(current_point);list_points.Add(new PointLatLng(startpoint.Lat, current_point.Lng));}}double lat = (startpoint.Lat+current_point.Lat) / 2;double lng = (startpoint.Lng + current_point.Lng) / 2;double heightlat = Math.Abs(current_point.Lat-startpoint.Lat);double widthlng = Math.Abs(current_point.Lng-startpoint.Lng);rectLatLng = RectLatLng.FromLTRB(startpoint.Lng,startpoint.Lat,current_point.Lng,current_point.Lat);rectangle = new GMapPolygon(list_points);rectangle.ZIndex = Rectangle_index;rectangle.RegenerateShape(gmap);(rectangle.Shape as Path).Stroke = Brushes.GreenYellow;(rectangle.Shape as Path).StrokeThickness = 5;(rectangle.Shape as Path).Effect = null;gmap.Markers.Add(rectangle);

5-4、根據鼠標畫圓形
上面的矩形還好是GMAP自己控件畫的,但是圓形沒有,也不能根據點畫,因為有無數個點。最主要的是畫的圓形要能夠更具地圖縮放。這部分還是參考Demo中的代碼。思路是:使用一個XMAL控件,里面是一個圓,設置屬性是填充的,然后改變邊框即可改變圓的大小。首先根據鼠標移動位置和中心點的經緯度坐標轉化成界面坐標,然后計算半徑,畫圓。
Circle.xaml

<UserControl x:Class="Demo.WindowsPresentation.CustomMarkers.Circle"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Height="300" Width="300" Background="Transparent"><Grid><Ellipse Stroke="Red" Fill="AliceBlue" Opacity="0.44" /></Grid> </UserControl>

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框架开发地图应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产欧美精品一区二区三区app | 成年人理论片 | hd极品free性xxx护士 | 久久久久国产精品一区 | 欧美 亚洲 一区 | 久久三 | 精品乱码一区二区三区 | 国产欧美一区二区视频 | 免费看国产曰批40分钟粉红裤头 | 正在播放木下凛凛xv99 | 国产毛片久久久久 | 亚洲精品aⅴ中文字幕乱码 国产精品调教视频 | 亚洲AV第二区国产精品 | 视频一区二区三区四区五区 | 国产高潮流白浆喷水视频 | 韩日成人| 日本免费电影一区二区三区 | 国产一区二区三区四区视频 | 大伊人网| 性做爰视频免费播放大全 | 午夜成人影片 | 日皮视频免费观看 | 色桃网 | 久久精品色欲国产AV一区二区 | 美女精品视频 | 美女四肢被绑在床扒衣 | 视频久久精品 | 2019最新中文字幕 | 久久久久久久久久久久久av | 国产男女猛烈无遮挡免费视频 | 日韩福利在线观看 | 中文字幕一区二区三区精华液 | 亚洲天堂伦理 | 亚洲1024| 午夜高清 | 91传媒理伦片在线观看 | 视频一区二区视频 | 午夜精品视频一区二区三区在线看 | 尤物视频最新网址 | 国产美女在线看 | 成人动漫一区二区三区 | аⅴ天堂中文在线网 | 欧美精品色图 | 香蕉视频成人在线观看 | 久久精品在线 | 欧美成人一区二区视频 | 污网址在线观看 | 欧美 日韩 国产 在线 | 僵尸叔叔在线观看国语高清免费观看 | 成人免费视频播放 | 舌奴调教日记 | 久久不卡影院 | 久久久性 | av久操| 成人在线免费小视频 | 激情久久一区 | 色欲狠狠躁天天躁无码中文字幕 | 肥老熟妇伦子伦456视频 | 中文字幕av无码一区二区三区 | 婷婷久久亚洲 | 国产美女视频网站 | 一区二区xxx | 日韩一级淫片 | 国产男女猛烈无遮挡免费观看网站 | 日韩精品免费一区二区夜夜嗨 | 久久久久免费精品 | 日日草日日干 | 在线播放你懂得 | 激情一区二区三区 | 国产超碰自拍 | 成人在线免费观看网址 | 91亚洲国产成人精品一区 | 亚洲精品一区二区在线观看 | 999xxxx| 久久亚洲一区二区 | 欧美成人一区在线观看 | 伊人射| 日韩视频国产 | 亚洲第九页 | 欧美日韩亚洲精品内裤 | 日日骑夜夜操 | 亚洲爱色 | 久热网站| 日产电影一区二区三区 | 日韩视频免费观看 | 天天干天天爽天天射 | 欧美激情三级 | 亚洲av无码一区二区三区四区 | 不卡视频国产 | 久久色婷婷 | 国产农村妇女精品一二区 | 久久9热 | 巨胸挤奶视频www网站 | 日日躁夜夜躁狠狠久久av | 亚洲黄色免费观看 | 草莓视频18免费观看 | 97国产精品 | 可以在线看的av | 天堂av片 |