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提供的图层数组,会按照数组顺序显示所有的图层。例如天地图影像图层和注记层混合效果如图所示: