GMap.Net开发之在WinForm和WPF中使用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
下载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,这就是展示地图的控件。修改如下:
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Drawing;
- using System.Data;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- using GMap.NET.WindowsForms;
- namespace GMapWinFormDemo
- {
- public partial class MapControl : GMapControl
- {
- public MapControl()
- {
- InitializeComponent();
- }
- }
- }
3、编译项目,在我们的Form设计窗口下,在工具箱中(tool box)里就可以看到这个MapControl,将这个MapControl加到Form中。
4、在主Form中添加相关的代码如下
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- using GMap.NET;
- using GMap.NET.WindowsForms;
- using GMap.NET.MapProviders;
using GMap.NET.WindowsForms.Markers;- namespace GMapDemo
- {
- public partial class MapForm : Form
- {
- private GMapOverlay markersOverlay = new GMapOverlay("markers"); //放置marker的图层
- public MapForm()
- {
- InitializeComponent();
- try
- {
- System.Net.IPHostEntry e = System.Net.Dns.GetHostEntry("ditu.google.cn");
- }
- catch
- {
- mapControl.Manager.Mode = AccessMode.CacheOnly;
- MessageBox.Show("No internet connection avaible, going to CacheOnly mode.", "GMap.NET Demo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
- }
- mapControl.CacheLocation = Environment.CurrentDirectory + "\\GMapCache\\"; //缓存位置
- mapControl.MapProvider = GMapProviders.GoogleChinaMap; //google china 地图
- mapControl.MinZoom = ; //最小比例
- mapControl.MaxZoom = ; //最大比例
- mapControl.Zoom = ; //当前比例
- mapControl.ShowCenter = false; //不显示中心十字点
- mapControl.DragButton = System.Windows.Forms.MouseButtons.Left; //左键拖拽地图
- mapControl.Position = new PointLatLng(32.064,118.704); //地图中心位置:南京
- mapControl.Overlays.Add(markersOverlay);
- mapControl.MouseClick += new MouseEventHandler(mapControl_MouseClick);
- }
- void mapControl_MouseClick(object sender, MouseEventArgs e)
- {
- if (e.Button == System.Windows.Forms.MouseButtons.Right)
- {
- PointLatLng point = mapControl.FromLocalToLatLng(e.X, e.Y);
- GMapMarker marker = new GMarkerGoogle(point, GMarkerGoogleType.green);
- markersOverlay.Markers.Add(marker);
- }
- }
- }
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,代码如下:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using GMap.NET.WindowsPresentation;
- namespace GMapWPFDemo
- {
- class MapControl : GMapControl
- {
- }
- }
只需要继承GMapControl就行了,基本功能都可以由GMapControl提供。
3、在我们的MainWindow.xaml中,添加项目的namespace:xmlns:src="clr-namespace:GMapWPFDemo",在XML代码中添加对MapControl.cs的使用:
- <Window x:Class="GMapWPFDemo.MainWindow"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:src="clr-namespace:GMapWPFDemo"
- Title="MainWindow" Height="410" Width="618">
- <Grid>
- <GroupBox Name="mapgroup" VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch">
- <src:MapControl x:Name="mapControl" Zoom="13" MaxZoom="24" MinZoom="1" />
- </GroupBox>
- </Grid>
- </Window>
4、在MainWindow中添加相关的代码如下:
- 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;
- using GMap.NET.MapProviders;
- using GMap.NET.WindowsPresentation;
- namespace GMapWPFDemo
- {
- /// <summary>
- /// MainWindow.xaml 的交互逻辑
- /// </summary>
- public partial class MainWindow : Window
- {
- public MainWindow()
- {
- InitializeComponent();
- try
- {
- System.Net.IPHostEntry e = System.Net.Dns.GetHostEntry("ditu.google.cn");
- }
- catch
- {
- mapControl.Manager.Mode = AccessMode.CacheOnly;
- MessageBox.Show("No internet connection avaible, going to CacheOnly mode.", "GMap.NET Demo", MessageBoxButton.OK, MessageBoxImage.Warning);
- }
- mapControl.MapProvider = GMapProviders.GoogleChinaMap; //google china 地图
- mapControl.MinZoom = ; //最小缩放
- mapControl.MaxZoom = ; //最大缩放
- mapControl.Zoom = ; //当前缩放
- mapControl.ShowCenter = false; //不显示中心十字点
- mapControl.DragButton = MouseButton.Left; //左键拖拽地图
- mapControl.Position = new PointLatLng(32.064, 118.704); //地图中心位置:南京
- mapControl.MouseLeftButtonDown += new MouseButtonEventHandler(mapControl_MouseLeftButtonDown);
- }
- void mapControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
- {
- Point clickPoint = e.GetPosition(mapControl);
- PointLatLng point = mapControl.FromLocalToLatLng((int)clickPoint.X, (int)clickPoint.Y);
- GMapMarker marker = new GMapMarker(point);
- mapControl.Markers.Add(marker);
- }
- }
- }
效果图如下:
和Winform代码差不多,一些响应事件不同,WPF的GMap中没有GMapOverlay这个“图层”的概念,所以没法加多个GMapOverlay,在GMapOverlay上再加GMapMarker(可以理解为图标标注),GMapMarker只能直接加在mapControl上面。
WPF的GMapMarker可以直接实例化(WinForm中的不行),但是貌似没有默认提供的效果,而要做出一些效果,需要自己设计实现,官方Demo中已经有了一些实现,WinForm中的GMapMarker可以用GMarkerGoogle去实例化(提供的有可选的效果,也可以自己传入bitmap作为自定义的图标)。
做过一段时间ArcGIS开发,由于ArcGIS的授权费用,为了节省成本,开始搞GMap.Net。。。刚开始研究,待续。。。
代码开源在GitHub上:
项目地址:https://github.com/luxiaoxun/MapDownloader
GMap.Net开发之在WinForm和WPF中使用GMap.Net地图插件的更多相关文章
- GMap.Net解决方案之在WinForm和WPF中使用GMap.Net地图插件的开发
在做地理位置相关的开发时,总是面临高额地图引擎费用让大部分用户望而却步,加之地图数据又是天价,那么GMap.NET就是首选了,它本身就是开源免费,服务器可以在本地缓存,以后访问时就可以直接访问. 可以 ...
- 在Winform或WPF中System.Diagnostics.Process.Start的妙用
原文:在Winform或WPF中System.Diagnostics.Process.Start的妙用 我们经常会遇到在Winform或是WPF中点击链接或按钮打开某个指定的网址, 或者是需要打开电脑 ...
- WinForm和WPF中注册热键
由于.Net没有提供专门的类库处理热键,所以需要直接调用windows API来解决. HotKey为.NET调用Windows API的封装代码,主要是RegisterHotKey和Unregist ...
- WPF中在Gmap.net中将Marker动起来
前一段时间说过一篇绘制极坐标的,这段时间对它进行了改造已经今非昔比了,功能实现了很多,我目的是让Marker动起来,然后还会绘制Route,上篇也就是简单的绘制了Route,没有关于Marker的相关 ...
- [C#] 使 ToolTip 一直显示 (在 WinForm 与 WPF 中的差异解决方案)
需求 自己绘制的UI,检测鼠标位置,适时显示出 ToolTip 1 WinForm 的 ToolTip // Member define: private ToolTip _toolTip = new ...
- 移动混合开发之HTML5在移动开发中的准则
1.尽量单页面开发 2.慎重选择前端UI框架,新手最好自己动手. 3.动画特效达到60fps 4.长度单位是用rem,即字体的宽度,字体宽度可根据 window.width/number.
- C# 在winform或者wpf中显示控制台窗口
这儿需要使用两个系统函数: BOOL WINAPI FreeConsole(void); //// 关闭控制台窗口,参考:http://msdn.microsoft.com/en-us/library ...
- 测试开发之Django——No7.Django模板中的过滤器
1.add 将参数添加到值. 例如: {{ value|add:"2" }} 如果value是4,那么输出将是6. 此过滤器将首先尝试将两个值强制转换为整数.如果失败,它将尝试将值 ...
- 测试开发之Django——No6.Django模板中的标签语言
模板中的标签语言 1.if/else {% if %} 标签检查(evaluate)一个变量,如果这个变量为真(即:变量存在,非空,不是布尔值假),系统会显示在{% if %} 和 {% endi ...
随机推荐
- Java验证码识别解决方案
建库,去重,切割,识别. package edu.fzu.ir.test; import java.awt.Color; import java.awt.image.BufferedImage; im ...
- django 的文件上传
template html(模板文件): <form enctype="multipart/form-data" method="POST" action ...
- __getattr__ 与动态属性
直接上代码 >>> class Test(object): ... def __getattr__(self,attr_name): ... setattr(self, attr_n ...
- python 的dict的update 方法的一点诡秘的行为
如下: >>> 'a%s'%a 'a{1: 0, 2: 0}' >>> for k,v in a.items(): a.update(k=v) >>&g ...
- linux下git安装
Download for Linux and Unix It is easiest to install Git on Linux using the preferred package manage ...
- ASP.NET MVC 如何解决“上下文的模型已在数据库创建后发生更改”问题
问题描述:支持"XXContext"(泛指之类的数据库上下文模型)上下文的模型已在数据库创建后发生更改.请考虑使用 Code First 迁移更新数据库. 问题解决:坑爹的MVC会 ...
- POJ 1065
http://poj.org/problem?id=1065 题目的大体意思就是给一些木头长l,重w,有一个机器,如果切割这些木头的话,在i后面切割的i+1根木头满足长度和重量都要大于等于前一根则不需 ...
- CentOS7下安装soaplib
测试安装 cd ENV . bin/activate yum install libxml2-devel libxslt-devel pip install soaplib 安装中遇到的问题: Uni ...
- 《高性能MySql》阅读笔记
1.查询优化,索引优化和架构优化三者相辅相成.(数据库架构是获得高性能的必要条件,但如果查询设计得不好,即便是最好的架构页无法获得高性能.) 2.查询性能低下的最基本的原因就是访问了太多的数据. 3. ...
- JSTL的c:forEach标签(${status.index})
<c:forEach>标签具有以下一些属性: var:迭代参数的名称.在迭代体中可以使用的变量的名称,用来表示每一个迭代变量.类型为String. items:要进行迭代的集合.对于它所支 ...