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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

### 实现WPF应用程序中的离线地图功能 为了在WPF应用程序中实现离线地图功能,可以采用预先下载的地图切片文件并将其集成到应用中。这通常涉及几个方面的工作:获取离线地图数据、设计存储结构以及编写展示逻辑。 #### 获取离线地图数据 对于离线地图的数据源准备,可利用特定工具来抓取所需地理范围内的图像瓦片[^4]。例如,通过太乐地图下载器能够方便地从高德或天地图服务中提取不同缩放级别的卫星影像,并保存成JPEG格式的瓦片集。这些图片按照一定规则命名和分类存放在本地磁盘上,便于后续加载调用。 #### 设计存储结构 考虑到性能优化及易于管理的因素,在组织已下载的地图资源时应遵循一定的目录布局原则。一般情况下会依据经纬度坐标划分子文件夹,再按比例尺等级细分层次,从而形成树状索引体系。这样的架构有助于快速定位目标位置对应的瓦片文件路径。 #### 编写展示逻辑 当完成上述准备工作之后,则需转向客户端编程部分——即如何把这些静态素材动态呈现在界面上。这里推荐使用开源库如GMap.NET作为辅助组件,它支持多种投影方式转换并且提供了丰富的API接口用于自定义渲染效果。下面给出一段简单的C#代码片段演示了基本操作: ```csharp using GMap.NET; using GMap.NET.MapProviders; using System.Windows; namespace OfflineMapsDemo { public partial class MainWindow : Window { private readonly string _tilesPath = @"D:\OfflineTiles"; public MainWindow() { InitializeComponent(); var provider = new GoogleMapProvider(); gmapControl.Manager.Mode = AccessMode.CacheOnly; // 设置为仅缓存模式 gmapControl.CacheLocation = _tilesPath; gmapControl.DragButton = MouseButton.Left; gmapControl.CanDragMap = true; gmapControl.MapProvider = provider; gmapControl.Position = new PointLatLng(39.9042, 116.4074); // 默认中心点设在北京 gmapControl.MinZoom = 5; gmapControl.MaxZoom = 14; gmapControl.Zoom = 10; } } } ``` 此段程序初始化了一个基于Google Maps API的地图控件实例,并指定了本地缓存的位置以便读取之前下载好的瓦片资料;同时设置了初始视窗参数以适应大多数屏幕分辨率下的显示需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值