日韩性视频-久久久蜜桃-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ò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 综合网亚洲| а√在线中文网新版地址在线 | 乱子伦一区二区 | 亚洲色偷精品一区二区三区 | 97理伦| 日本色站 | 亚洲av无码国产精品麻豆天美 | 成人免费网视频 | 国产一级在线免费观看 | 五月天婷婷久久 | 国产精品熟女久久久久久 | 婷婷调教口舌奴ⅴk | 伊人热久久 | 欧美人妖69xxxxxhd3d| 午夜影院入口 | 亚洲精品白虎 | 性欧美在线视频 | 中文字幕第十一页 | 成人在线免费小视频 | 在线无遮挡 | 天天插天天操 | 捆绑少妇玩各种sm调教 | 欧美另类高清videos的特点 | 亚洲午夜福利一区二区三区 | 黄页网站免费在线观看 | 污视频免费在线观看 | 四虎影院色 | 亚洲女人18毛片水真多 | 免费的黄色大片 | 成年人免费观看网站 | 欧美二区在线 | 亚洲伦理精品 | 欧美一区二区三区久久 | 一区二区三区精品在线 | 国产aⅴ片 | 97在线播放免费观看 | 亚洲午夜视频在线 | 成人免费在线视频 | 亚洲精品国产精品国自产 | 欧美美女一区 | 在线天堂中文 | 美女色呦呦 | 成人动漫h在线观看 | 神马午夜伦理 | 丁香激情综合 | 日本黄色一级网站 | 福利一区二区 | 长篇h版少妇沉沦交换 | 免费看h网站 | 色婷婷狠狠 | 成人在线免费视频 | 久久久久成人精品免费播放动漫 | 欧美日韩伦理片 | 亚洲韩国精品 | 午夜影院0606 | 日本肉体xxxⅹ裸体交 | 国产午夜视频在线 | 伊人久久大香线蕉综合75 | 色婷婷狠狠爱 | 国产一在线观看 | 中文字幕乱码在线观看 | 喷潮在线观看 | 国产成人精品一区二区三区视频 | 波多野结衣视频一区二区 | 少妇精品久久久一区二区三区 | 久久嗨| 亚洲欧洲日产av | 91成人网页 | 春闺艳妇(h)高h产乳 | 一区二区视频免费看 | 日韩天天操 | 亚洲国产精品久久 | 成人福利社 | 久久久久九九 | 99er精品视频 | 色爽爽一区二区三区 | 乡村性满足hd | www.成人av| 国内老熟妇对白hdxxxx | 三级不卡视频 | 欧洲一区二区在线 | 国产美女福利在线 | 中文在线观看视频 | 高潮videossex高潮 | 天天舔天天操 | 岛国av一区二区 | 好色综合 | 亚洲精品国产视频 | 亚洲国产视频一区二区三区 | 欧美色亚洲色 | 99热播| 国产精品一区二区三区线羞羞网站 | 国产美女www| 中文字幕第一页在线播放 | 久久精品夜色噜噜亚洲a∨ 中文字幕av网 | 精品国产一区二区三区在线观看 | 精品免费观看 | 成人精品一区二区三区 | 亚洲五十路 |