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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

使用 GMap.NET 实现添加标注、移动标注功能。(WPF版)

發(fā)布時(shí)間:2025/3/21 asp.net 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用 GMap.NET 实现添加标注、移动标注功能。(WPF版) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

在WPF嵌入地圖,有兩種方式: 瀏覽器方式;控件方式。

1)瀏覽器方式就是使用瀏覽器控件WebBrowser,設(shè)置好網(wǎng)址就行了。這種方式與地圖的交互不太直接,需要懂html、javascript。對于不懂web編程的開發(fā)者來說,有點(diǎn)困難。

2)控件方式就是使用第三方控件;不需要處了解web相關(guān)知識,使用起來比較直接,易于理解。GMap.net 類庫就實(shí)現(xiàn)了這種控件。

GMap.net 簡介

GMap.NET 是一個(gè)強(qiáng)大、免費(fèi)、跨平臺、開源的.NET控件,它在Windows Forms 和WPF環(huán)境中能夠通過Google, Yahoo!, Bing, OpenStreetMap, ArcGIS, Pergo, SigPac等實(shí)現(xiàn)尋找路徑、地理編碼以及地圖展示功能,并支持緩存和運(yùn)行在Mobile環(huán)境中。

GMap.NET多年前已經(jīng)存在,最初主要支持WinForm。WPF出現(xiàn)的較晚;但是,現(xiàn)在這個(gè)控件也可用于WPF開發(fā)。不過,網(wǎng)上相關(guān)WPF開發(fā)的例子較少。因?yàn)楣ぷ餍枰?#xff0c;最近使用這個(gè)控件開發(fā)了gis相關(guān)項(xiàng)目,把開發(fā)過程中的使用技巧寫出來,以供參考!

其中部分代碼參考了別人的文章,稍作修改!

程序界面:

將GMap.net加入項(xiàng)目

使用NuGet,搜索GMap.net就可以找到該控件:

?

添加地圖

GMap.net是國外開發(fā)的,不過也能很好的支持國內(nèi)地圖。這個(gè)控件是開放的,只要按照要求完成相關(guān)設(shè)置,就可以把各類地圖加進(jìn)來。

要理解這些設(shè)置,就需要先理解地圖的基本知識。我在這里就不多述。簡單一句話句話就是:地圖其實(shí)就多個(gè)圖片拼接而來的;你需要告訴控件,如何根據(jù)地理坐標(biāo)和縮放級別獲取對應(yīng)的圖片就行。

以高德地圖為例,看看如何設(shè)置

需要重寫GMapProvider這個(gè)類,代碼如下:

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;}}private AMapProvider(){}static AMapProvider(){Instance = new AMapProvider();}//根據(jù)坐標(biāo)和縮放,獲取對應(yīng)的圖片。public override PureImage GetTileImage(GPoint pos, int zoom){string url = MakeTileImageUrl(pos, zoom, LanguageStr);return GetTileImageUsingHttp(url);}string MakeTileImageUrl(GPoint pos, int zoom, string language){//http://webrd04.is.autonavi.com/appmaptile?x=5&y=2&z=3&lang=zh_cn&size=1&scale=1&style=7string url = string.Format(UrlFormat, pos.X, pos.Y, zoom);Console.WriteLine("url:" + url);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";}

最重要的函數(shù)就是?public override PureImage GetTileImage(GPoint pos, int zoom),地圖就是同一縮放比例的圖片堆砌而來。

使用控件

?在窗口中添加控件:主窗口代碼如下

<Window x:Class="GMapTest.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:gmap="clr-namespace:GMap.NET.WindowsPresentation;assembly=GMap.NET.WindowsPresentation"xmlns:local="clr-namespace:GMapTest" Loaded="Window_Loaded"mc:Ignorable="d" Background="#5A9EA5" Title="MainWindow" Height="450" Width="800"><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="31*"/><ColumnDefinition Width="167*"/></Grid.ColumnDefinitions><Grid.RowDefinitions><RowDefinition Height="Auto"></RowDefinition><RowDefinition></RowDefinition></Grid.RowDefinitions><StackPanel Margin="5" Orientation="Horizontal" Grid.ColumnSpan="2"><CheckBox x:Name="checkMoveFlag" Margin="5,2,2,2" Click="CheckMoveFlag_Click">標(biāo)注可移動</CheckBox><CheckBox x:Name="checkAddFlag" Margin="10,2,2,2">添加標(biāo)注</CheckBox></StackPanel><GroupBox Grid.Row="1" Margin="0" Grid.ColumnSpan="2"><gmap:GMapControl x:Name="MainMap" MaxZoom="24" MinZoom="1" RenderOptions.BitmapScalingMode="NearestNeighbor" UseLayoutRounding="True" SnapsToDevicePixels="True"></gmap:GMapControl></GroupBox></Grid> </Window>

使用設(shè)置RenderOptions.BitmapScalingMode="NearestNeighbor",可使圖片顯示較為清晰。

添加標(biāo)注

標(biāo)注稱之為Marker。控件有一個(gè)屬性?public ObservableCollection<GMapMarker> Markers { get; }用于存放標(biāo)注。添加標(biāo)注就是設(shè)置好GMapMarker相關(guān)屬性就行。代碼如下:

BitmapImage _pinSrcImage;Image CreatePinImage(GMapMarker marker){Image img = new Image();img.Tag = marker;img.Width = 32;img.Height = 32;if (_pinSrcImage == null){//多個(gè)標(biāo)注共用一個(gè)圖像源,節(jié)省內(nèi)存。_pinSrcImage = new BitmapImage(new Uri("pack://application:,,,/AMap/red-dot.png", UriKind.Absolute));_pinSrcImage.Freeze();}img.Source = _pinSrcImage;//鼠標(biāo)熱點(diǎn)位置marker.Offset = new Point(-img.Width / 2, -img.Height / 2);return img;}private void AddMaker(PointLatLng pt){GMapMarker marker = new GMapMarker(pt);marker.Shape = CreatePinImage(marker);//將圖層添加到地圖this.MainMap.Markers.Add(marker);}

?移動標(biāo)注

首先需要檢測鼠標(biāo)是否點(diǎn)擊了標(biāo)注部分。需要在MouseDown事件中,通過WPF視覺樹輔助函數(shù)來判斷(VisualTreeHelper.HitTest)。其次在MouseMove函數(shù)中,將標(biāo)注移動到新的坐標(biāo)點(diǎn)。這里是通過鼠標(biāo)左鍵移動;要實(shí)現(xiàn)此操作,設(shè)置控件拖動方式為?MainMap.DragButton = MouseButton.Right; 暨設(shè)置地圖拖動方式為鼠標(biāo)右鍵,防止與標(biāo)注移動相沖突。

關(guān)聯(lián)控件事件:

MainMap.MouseMove += MainMap_MouseMove;MainMap.MouseDown += MainMap_MouseDown;
MainMap.MouseLeftButtonUp += MainMap_MouseLeftButtonUp;

判斷鼠標(biāo)是否點(diǎn)擊了標(biāo)注部分

GMapMarker _currentElement;private void MainMap_MouseDown(object sender, MouseButtonEventArgs e){if (checkMoveFlag.IsChecked == false){return;}//判斷是否點(diǎn)擊了標(biāo)注if (_currentElement == null){Point pt = e.GetPosition(MainMap);PointLatLng point = MainMap.FromLocalToLatLng((int)pt.X, (int)pt.Y);PointHitTestParameters parameters = new PointHitTestParameters(pt);VisualTreeHelper.HitTest(MainMap, null, HitTestCallback, parameters);}}//右鍵彈起,設(shè)置標(biāo)注變量為空private void MainMap_MouseLeftButtonUp(object sender, MouseButtonEventArgs e){_currentElement = null;}private HitTestResultBehavior HitTestCallback(HitTestResult result){Image image = result.VisualHit as Image;if (image != null){_currentElement = image.Tag as GMapMarker;return HitTestResultBehavior.Stop;}return HitTestResultBehavior.Continue;}

MouseMove事件中,移動標(biāo)注

private void MainMap_MouseMove(object sender, MouseEventArgs e){if (checkMoveFlag.IsChecked == true &&e.LeftButton == MouseButtonState.Pressed&& _currentElement != null){//獲取坐標(biāo)Point pt = e.GetPosition(MainMap);//轉(zhuǎn)換成地理坐標(biāo)PointLatLng point = MainMap.FromLocalToLatLng((int)pt.X, (int)pt.Y);_currentElement.Position = point;}}

后記:

?winform和WPF是開發(fā)桌面程序的兩大框架。其中WPF是最新框架,具有很多顛覆性的概念。好多人感覺WPF的概念難以理解,同時(shí)感覺到GMap.net對WPF的封裝也不夠好,使用起來不如winform版好用。WPF版的GMap.net相比與winform版,確實(shí)省略了一些功能。這是因?yàn)閃PF本身就很強(qiáng)大靈活,GMap.net再加上這些功能就多此一舉。“”標(biāo)注檢測”就是一例,winform版有直接檢測標(biāo)注的回調(diào)函數(shù),WPF版就省略了。WPF是可以通過視覺樹HitTest函數(shù)來檢查,這種檢測方法更靈活。

轉(zhuǎn)載于:https://www.cnblogs.com/yuanchenhui/p/GMapTest.html

總結(jié)

以上是生活随笔為你收集整理的使用 GMap.NET 实现添加标注、移动标注功能。(WPF版)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91超碰人人 | 欧美日韩在线免费观看视频 | 日韩欧美在线观看一区二区三区 | 日本打白嫩屁股视频 | 青青草香蕉 | 美攻壮受大胸奶汁(高h) | 波多野结衣中文字幕在线播放 | 国产精品久久免费 | 黄色日韩 | 澳门久久久 | 一区二区三区精品视频 | 久久蜜臀精品av | 欧美在线播放一区 | 免费在线成人av | 超污网站在线观看 | 91在线网 | 欧美久久一级 | 色播在线视频 | 果冻传媒av| 亚欧洲精品在线视频 | 久久久性色精品国产免费观看 | 久热青草 | 国产波霸爆乳一区二区 | 奇米影视久久 | 欧美日韩成人在线 | 国内激情| 99视频在线免费 | 亚洲妇女av| 香蕉国产精品视频 | 玖玖在线精品 | 国产99久久久欧美黑人 | 亚洲精品在线播放视频 | 狠狠干av| 亚洲a一区 | 亚洲国产二区 | 丰满少妇高潮久久三区 | 在线看片中文字幕 | gay男互凵gay男同偷精 | 欧美日韩色视频 | 99九九精品视频 | 中日精品一色哟哟 | 男男黄网站 | 91影院在线免费观看 | 99久久久无码国产精品6 | 97久久国产亚洲精品超碰热 | 天天爽天天爽天天爽 | 98av视频 | 国产成人视屏 | 欧美性开放视频 | 国产av毛片 | 91丨porny丨露出 | 美女少妇av | 制服av网 | 成人午夜网址 | 日韩avav | 日本黄色大片视频 | 99国产精品99久久久久久粉嫩 | 奇米影视第四色777 波多野结衣一区二区三区免费视频 | 黄色网页网站 | 免费观看一区二区三区毛片 | 中文字幕五码 | xxxx久久 | 午夜黄网| 亚洲自拍三区 | 亚洲喷潮 | 国产福利一区在线 | 蝌蚪网在线视频 | 黄色一级大片免费版 | 白嫩初高中害羞小美女 | 懂色av一区二区三区蜜臀 | 国产视频精选 | 中文字幕欧美色图 | 青青成人网 | av2014天堂网| 国产三级日本三级在线播放 | 日韩一区二区三区视频在线 | 91丨porny丨国产 | 久草青青 | av免费看网站| 日本午夜大片 | 麻豆国产av超爽剧情系列 | 久久精品99久久久久久 | 色窝在线 | 97超碰碰| 91黄色小网站 | 男女无遮挡免费视频 | 精品无码人妻一区二区免费蜜桃 | 91国自产精品中文字幕亚洲 | 日韩欧美一区在线观看 | 欧美激情久久久久 | 欧美视频免费看欧美视频 | 久草国产精品 | 精品视频站长推荐 | 蜜桃精品久久久久久久免费影院 | 四虎免费视频 | 欧美日韩中文 | 精品国产一区二区三区四区精华 | 51精品国自产在线 | 第一毛片 |