在WinForm和WPF中使用GMap.Net地图插件简单教程
如何在winform中使用gmap.net
项目主页:https://greatmaps.codeplex.com/
下载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.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("www.google.com.hk");
}
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 = 2; //最小缩放
mapcontrol.maxzoom = 17; //最大缩放
mapcontrol.zoom = 5; //当前缩放
mapcontrol.showcenter = false; //不显示中心十字点
mapcontrol.dragbutton = mousebutton.left; //左键拖拽地图
mapcontrol.position = new pointlatlng(32.064, 118.704); //地图中心位置:南京
mapcontrol.onmapzoomchanged += new mapzoomchanged(mapcontrol_onmapzoomchanged);
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);
}
void mapcontrol_onmapzoomchanged()
{
}
}
}
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("www.google.com.hk");
}
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 = 2; //最小缩放
mapcontrol.maxzoom = 17; //最大缩放
mapcontrol.zoom = 5; //当前缩放
mapcontrol.showcenter = false; //不显示中心十字点
mapcontrol.dragbutton = mousebutton.left; //左键拖拽地图
mapcontrol.position = new pointlatlng(32.064, 118.704); //地图中心位置:南京
mapcontrol.onmapzoomchanged += new mapzoomchanged(mapcontrol_onmapzoomchanged);
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);
}
void mapcontrol_onmapzoomchanged()
{
}
}
}
效果图如下:
和winform代码差不多,一些响应事件不同,wpf的gmap中没有gmapoverlay这个“图层”的概念,所以没法加多个gmapoverlay,在gmapoverlay上再加gmapmarker(可以理解为图标标注),gmapmarker只能直接加在mapcontrol上面。
wpf的gmapmarker可以直接实例化(winform中的不行),但是貌似没有默认提供的效果,而要做出一些效果,需要自己设计实现,官方demo中已经有了一些实现,winform中的gmapmarker可以用gmarkergoogle去实例化(提供的有可选的效果,也可以自己传入bitmap作为自定义的图标)。