WPF基于GMap.Net实现地图(天地图、高德地图、百度地图)

本文介绍了如何在.NET应用中通过NuGet添加GMap.NET相关包,自定义MapControl,配置地图样式,包括地图提供者切换、缓存路径、缩放级别等,并演示了如何实现图层叠加以显示不同类型的地图,如卫星、矢量和影像地图。
摘要由CSDN通过智能技术生成

1.在NuGet添加GMap.NET.Core和GMap.NET.WindowsPresentation包
在这里插入图片描述
*注意:GMap有两个作者,需要选择同一个作者的依赖包
2.自定义类继承GMapControl

    public class MapControl:GMapControl 
    {
    
    }

3.在你需要显示地图的窗体例如:MapWindow,添加MapControl命名控件。

xmlns:local="clr-namespace:xxx.yyy"

<local:MapControl
    x:Name="mapControl"
    Panel.ZIndex="100"
    MaxZoom="24"
    MinZoom="1"
    Zoom="13" />

4.添加地图相关配置,如地图缓存路径、地图提供者、最小缩放级别、最大缩放级别、当前缩放级别、是否显示中心点、地图的拖拽键(例如:鼠标左键)、地图当前的中心位置…

  control.CacheLocation = Environment.CurrentDirectory + "\\GMapCache\\"; //缓存位置
  control.MapProvider = GMapProviders.GoogleChinaMap; // 这里需要填写地图提供商,官方默认包含Google地图
  control.MinZoom = 2;  //最小缩放
  control.MaxZoom = 17; //最大缩放
  control.Zoom = 5;     //当前缩放 
  control.ShowCenter = true; //不显示中心十字点
  control.DragButton = MouseButton.Left; //左键拖拽地图
  control.Position = new PointLatLng(32.064, 118.704); //地图中心位置:珠  海

  // control.MouseLeftButtonDown += new MouseButtonEventHandler(mapControl_MouseLeftButtonDown); // 点击事件可以自由选择

5.一般情况到这就可以显示地图的基本样式了,但不太满足实际的开发要求。首先,Goggle地图是国外地图在国内访问会非常慢。其次默认使用的是矢量地图,但可能需要卫星地图、影像标记、混合地图的情况。还有一般都可以选择多种地图例如高德地图、天地图、百度地图,这时候会用上MapProvider(地图供应商),基于MapProvider我们可以添加想要的地图源。例如 高德地图:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using GMap.NET.MapProviders;
using GMap.NET.Projections;
using GMap.NET;
using GMap.NET.WindowsPresentation;

namespace 你的命名空间
{

    public abstract class MapProviderBase : GMapProvider
    {
        public MapProviderBase()
        {
            MaxZoom = null;
            RefererUrl = "https://www.amap.com/";
        }

        public override PureProjection Projection
        {
            get { return MercatorProjection.Instance; }
        }

        GMapProvider[] overlays;
        public override GMapProvider[] Overlays
        {
            get
            {
                if (overlays == null)
                {
                    overlays = new GMapProvider[] { this };
                }
                return overlays;
            }
        }
    }

   public class GaoDeimgProvider : MapProviderBase
	{
	    public static readonly MapProviderBase Instance;
	
	    readonly Guid id = System.Guid.NewGuid();
	    public override Guid Id
	    {
	        get { return id; }
	    }
	    readonly string name = "TianDiTuMap";
	    public override string Name
	    {
	        get
	        {
	            return name;
	        }
	    }
	
	    GMapProvider[] overlays;
	
	    public override GMapProvider[] Overlays
	    {
	        get
	        {
	            if (overlays == null)
	            {
	                overlays = new GMapProvider[] { this,TianDiTuCiaProvider.Instance };
	            }
	            return overlays;
	        }
	    }
	
	    static GaoDeimgProvider()
	    {
	        Instance = new GaoDeimgProvider();
	    }
	
	    public override PureImage GetTileImage(GPoint pos, int zoom)
	    {
	        string url = MakeTileImageUrl(pos, zoom, LanguageStr);
	        return GetTileImageUsingHttp(url);
	    }
	
	    string MakeTileImageUrl(GPoint pos, int zoom, string language)
	    {
	        //string url = string.Format(UrlFormat, num, pos.X, pos.Y, zoom);
	        string url = string.Format(MarkUrlFormat, pos.X, pos.Y, zoom);
	        Console.WriteLine("url:" + url);
	        return url;
	    }
	    static readonly string MarkUrlFormat = "http://wprd01.is.autonavi.com/appmaptile?x={0}&y={1}&z={2}&lang=zh_cn&size=1&scl=1&style=6";

	}
}

MarkUrlFormat是对应地图的瓦片地址,这里放我收集的部分地址:

部分地图是需要提供密钥的,这里tk是你自己去天地图注册获取密钥,{1、2、3}这种都是string格式化。

天地图影像底图:http://t2.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={2}&TILEROW={1}&TILECOL={0}&tk={3}

天地图影像注记:http://t2.tianditu.gov.cn/cia_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cia&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={2}&TILEROW={1}&TILECOL={0}&tk={3}

6.上述情况同时只能显示一张图,有时候需要同时出现影像图和注记图。这时候就要用到图层叠加,GMap.Net是支持图层叠加的,具体实现方法如下:

GMapProvider[] overlays;

public override GMapProvider[] Overlays
{
    get
    {
        if (overlays == null)
        {
            overlays = new GMapProvider[] { TianDiTuImgProvider.Instance, this };
        }
        return overlays;
    }
}

overlays = new GMapProvider[] { TianDiTuImgProvider.Instance, this }; 是将需要混合的图层放在overlays数组中,overlays是MapProvider提供的图层数组,会按照数组顺序显示所有的图层。例如天地图影像图层和注记层混合效果如图所示:
在这里插入图片描述

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值