欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-26 14:57:46
如何在winform中使用gmap.net 项目主页:https://greatmaps.codeplex.com/下载gmap.net,我下载的版本:greatmaps...

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