当前位置: 移动技术网 > IT编程>开发语言>.net > 在WinForm和WPF中使用GMap.Net地图插件简单教程

在WinForm和WPF中使用GMap.Net地图插件简单教程

2017年12月12日  | 移动技术网IT编程  | 我要评论

狠狠撸撸,乞丐故事,彩虹的约定节目串词

如何在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作为自定义的图标)。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网