GMap.Net解决方案之在WinForm和WPF中使用GMap.Net地图插件的开发

在做地理位置相关的开发时,总是面临高额地图引擎费用让大部分用户望而却步,加之地图数据又是天价,那么GMap.NET就是首选了,它本身就是开源免费,服务器可以在本地缓存,以后访问时就可以直接访问。 可以广泛用于保密单位的空间数据服务应用,如军队、武警、公安等保密单位。下面我们就开始我们的GMap.NET的之旅吧!

什么是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,Hello World例子:

下载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,这就是展示地图的控件。修改如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Drawing;
 5 using System.Data;
 6 using System.Linq;
 7 using System.Text;
 8 using System.Windows.Forms;
 9 using GMap.NET.WindowsForms;
10
11 namespace GMapWinFormDemo
12 {
13     public partial class MapControl : GMapControl
14     {
15         public MapControl()
16         {
17             InitializeComponent();
18         }
19     }
20 }

3、编译项目,在我们的Form设计窗口下,在工具箱中(tool box)里就可以看到这个MapControl,将这个MapControl加到Form中。

4、在主Form中添加相关的代码如下

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Linq;
 7 using System.Text;
 8 using System.Windows.Forms;
 9 using GMap.NET;
10 using GMap.NET.WindowsForms;
11 using GMap.NET.MapProviders;
12 using GMap.NET.WindowsForms.Markers;
13
14 namespace GMapDemo
15 {
16     public partial class MapForm : Form
17     {
18         private GMapOverlay markersOverlay = new GMapOverlay("markers"); //放置marker的图层
19
20         public MapForm()
21         {
22             InitializeComponent();
23
24             try
25             {
26                 System.Net.IPHostEntry e = System.Net.Dns.GetHostEntry("ditu.google.cn");
27             }
28             catch
29             {
30                 mapControl.Manager.Mode = AccessMode.CacheOnly;
31                 MessageBox.Show("No internet connection avaible, going to CacheOnly mode.", "GMap.NET Demo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
32             }
33
34             mapControl.CacheLocation = Environment.CurrentDirectory + "\\GMapCache\\"; //缓存位置
35             mapControl.MapProvider = GMapProviders.GoogleChinaMap; //google china 地图
36             mapControl.MinZoom = 2;  //最小比例
37             mapControl.MaxZoom = 24; //最大比例
38             mapControl.Zoom = 10;     //当前比例
39             mapControl.ShowCenter = false; //不显示中心十字点
40             mapControl.DragButton = System.Windows.Forms.MouseButtons.Left; //左键拖拽地图
41             mapControl.Position = new PointLatLng(32.064,118.704); //地图中心位置:南京
42
43             mapControl.Overlays.Add(markersOverlay);
44
45             mapControl.MouseClick += new MouseEventHandler(mapControl_MouseClick);
46         }
47
48         void mapControl_MouseClick(object sender, MouseEventArgs e)
49         {
50             if (e.Button == System.Windows.Forms.MouseButtons.Right)
51             {
52                 PointLatLng point = mapControl.FromLocalToLatLng(e.X, e.Y);
53                 GMapMarker marker = new GMarkerGoogle(point, GMarkerGoogleType.green);
54                 markersOverlay.Markers.Add(marker);
55             }
56         }
57     }

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,代码如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using GMap.NET.WindowsPresentation;
 6
 7 namespace GMapWPFDemo
 8 {
 9     class MapControl : GMapControl
10     {
11     }
12 }

只需要继承GMapControl就行了,基本功能都可以由GMapControl提供。

3、在我们的MainWindow.xaml中,添加项目的namespace:xmlns:src="clr-namespace:GMapWPFDemo",在XML代码中添加对MapControl.cs的使用:

 1 <Window x:Class="GMapWPFDemo.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         xmlns:src="clr-namespace:GMapWPFDemo"
 5         Title="MainWindow" Height="410" Width="618">
 6     <Grid>
 7             <GroupBox Name="mapgroup" VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch">
 8             <src:MapControl x:Name="mapControl" Zoom="13" MaxZoom="24" MinZoom="1" />
 9             </GroupBox>
10     </Grid>
11 </Window>

4、在MainWindow中添加相关的代码如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Windows;
 6 using System.Windows.Controls;
 7 using System.Windows.Data;
 8 using System.Windows.Documents;
 9 using System.Windows.Input;
10 using System.Windows.Media;
11 using System.Windows.Media.Imaging;
12 using System.Windows.Navigation;
13 using System.Windows.Shapes;
14 using GMap.NET;
15 using GMap.NET.MapProviders;
16 using GMap.NET.WindowsPresentation;
17
18 namespace GMapWPFDemo
19 {
20     /// <summary>
21     /// MainWindow.xaml 的交互逻辑
22     /// </summary>
23     public partial class MainWindow : Window
24     {
25         public MainWindow()
26         {
27             InitializeComponent();
28
29             try
30             {
31                 System.Net.IPHostEntry e = System.Net.Dns.GetHostEntry("ditu.google.cn");
32             }
33             catch
34             {
35                 mapControl.Manager.Mode = AccessMode.CacheOnly;
36                 MessageBox.Show("No internet connection avaible, going to CacheOnly mode.", "GMap.NET Demo", MessageBoxButton.OK, MessageBoxImage.Warning);
37             }
38
39             mapControl.MapProvider = GMapProviders.GoogleChinaMap; //google china 地图
40             mapControl.MinZoom = 2;  //最小缩放
41             mapControl.MaxZoom = 17; //最大缩放
42             mapControl.Zoom = 5;     //当前缩放
43             mapControl.ShowCenter = false; //不显示中心十字点
44             mapControl.DragButton = MouseButton.Left; //左键拖拽地图
45             mapControl.Position = new PointLatLng(32.064, 118.704); //地图中心位置:南京
46
47             mapControl.MouseLeftButtonDown += new MouseButtonEventHandler(mapControl_MouseLeftButtonDown);
48         }
49
50         void mapControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
51         {
52             Point clickPoint = e.GetPosition(mapControl);
53             PointLatLng point = mapControl.FromLocalToLatLng((int)clickPoint.X, (int)clickPoint.Y);
54             GMapMarker marker = new GMapMarker(point);
55             mapControl.Markers.Add(marker);
56         }
57     }
58 }

效果图如下

?

和Winform代码差不多,一些响应事件不同,WPF的GMap中没有GMapOverlay这个“图层”的概念,所以没法加多个GMapOverlay,在GMapOverlay上再加GMapMarker(可以理解为图标标注),GMapMarker只能直接加在mapControl上面。

WPF的GMapMarker可以直接实例化(WinForm中的不行),但是貌似没有默认提供的效果,而要做出一些效果,需要自己设计实现,官方Demo中已经有了一些实现,WinForm中的GMapMarker可以用GMarkerGoogle去实例化(提供的有可选的效果,也可以自己传入bitmap作为自定义的图标)。

做过一段时间ArcGIS开发,由于ArcGIS的授权费用,为了节省成本,开始搞GMap.Net。。。刚开始研究,待续。。。

技术交流  省厓 QQ:2252224326  [email protected] 版权所有 http://blog.sina.com.cn/u/6029512413

原文地址:https://www.cnblogs.com/shengya/p/9597117.html

时间: 2024-10-27 19:10:27

GMap.Net解决方案之在WinForm和WPF中使用GMap.Net地图插件的开发的相关文章

C# 在winform或者wpf中显示控制台窗口

这儿需要使用两个系统函数: BOOL WINAPI FreeConsole(void); //// 关闭控制台窗口,参考:http://msdn.microsoft.com/en-us/library/ms683150%28VS.85%29.aspx BOOL WINAPI AllocConsole(void); //// 打开控制台窗口,参考:http://msdn.microsoft.com/en-us/library/ms681944%28VS.85%29.aspx对应DLL:Kernel

在Winform或WPF中System.Diagnostics.Process.Start的妙用

我们经常会遇到在Winform或是WPF中点击链接或按钮打开某个指定的网址, 或者是需要打开电脑中某个指定的硬盘分区及文件夹, 甚至是"控制面板"相关的东西, 那么如何做呢? 答案是使用System.Diagnostics.Process.Start().它的作用是调用外部的命令. 先来看看它的调用方法:Process.Start () Process.Start (ProcessStartInfo) Process.Start (String)Process.Start (Strin

WinForm和WPF中注册热键

由于.Net没有提供专门的类库处理热键,所以需要直接调用windows API来解决. HotKey为.NET调用Windows API的封装代码,主要是RegisterHotKey和UnregisterHotKey class HotKey { /// <summary> /// 如果函数执行成功,返回值不为0. /// 如果函数执行失败,返回值为0.要得到扩展错误信息,调用GetLastError..NET方法:Marshal.GetLastWin32Error() /// </su

[C#] 使 ToolTip 一直显示 在 WinForm 与 WPF 中的差异

需求 自己绘制的UI,检测鼠标位置,适时显示出 ToolTip 1 WinForm 的 ToolTip // Member define: private ToolTip _toolTip = new ToolTip(new Container()); // constructor: initialize this._toolTip.AutoPopDelay = 100; this._toolTip.ShowAlways = true; // MouseMove Event: logic-pro

基于Winform、WPF等的客户端文件下载

有时候,我们用C#写一些客户端应用程序需要从服务器下载一些资源,如图片.dll.配置文件等.下面就来说一下,在Winform及WPF中如何下载文件. 我们的资源大多放在自己的网站上,或者从其他网站下载资源,我们需要给客户端一个URL,先给出代码: /// <summary> /// 下载文件 /// </summary> /// <param name="URL">下载文件地址</param> /// <param name=&qu

WPF中嵌入WinForm中的webbrowser控件

原文:WPF中嵌入WinForm中的webbrowser控件 使用VS2008创建WPF应用程序,需使用webbrowser.从工具箱中添加WPF组件中的webbrowser发现其中有很多属性事件不能使用.决定还是使用WinForm中的webbrowser.要想在WPF中使用WinForm控件,查看MSDN,需经过以下步骤. 创建名为 HostingWfInWpf 的 WPF 应用程序项目. 在解决方案资源管理器中,添加一个对名为 WindowsFormsIntegration.dll 的 Wi

WPF中不规则窗体与WindowsFormsHost控件的兼容问题完美解决方案

首先先得瑟一下,有关WPF中不规则窗体与WindowsFormsHost控件不兼容的问题,网上给出的解决方案不能满足所有的情况,是有特定条件的,比如  WPF中不规则窗体与WebBrowser控件的兼容问题解决办法.该网友的解决办法也是别出心裁的,为什么这样说呢,你下载了他的程序认真读一下就便知道,他的webBrowser控件的是单独放在一个Form中,让这个Form与WPF中的一个Bord控件进行关联,进行同步移动,但是在移动的时候会出现闪烁,并且还会出现运动的白点,用户体验肯定不好. OK,

WPF 精修篇 Winform 嵌入WPF控件

原文:WPF 精修篇 Winform 嵌入WPF控件 首先 创建WPF控件库 这样就有了一个WPF界面 在wpf中增加界面等 在winform中增加WPFDLL 重新生成解决方案 在左侧工具栏 出现WPF 控件 拖到窗体 效果 原文地址:https://www.cnblogs.com/lonelyxmas/p/12075801.html

如何去掉WinForm或者WPF的最大化和最小化按钮

博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:如何去掉WinForm或者WPF的最大化和最小化按钮.