WPF GMap使用高德地图

本文介绍如何在GMap中集成高德地图服务,包括通过Nuget安装GMap.NET.Presentation,自定义地图加载类及实现GMapProvider接口等步骤。

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


前言

近日在项目中用到了GMap,并且Gmap中使用了高德地图,特此记录一下。


一、Nuget下载Gmap

在Nuget中搜索GMap,选择GMap.NET.Presentatiom进行下载安装。(请注意版本)
在这里插入图片描述

二、代码

1.添加类

添加一个类,让其GMapControl类。
代码如下:

using GMap.NET;
using GMap.NET.MapProviders;
using GMap.NET.Projections;
using GMap.NET.WindowsPresentation;
using System;

namespace WpfRiUi.gmap
{
    public class MapControl : GMapControl {
        public long ElapsedMilliseconds;
    }
}

2.加载高德地图

  1. 如果使用高德地图,需要实现GMapProvider接口,并添加一些方法
public abstract class AMapProviderBase : GMapProvider
    {
        public AMapProviderBase() 
        {
            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;
            }
        }
    }
  1. 实现AMapProviderBase
using GMap.NET;
using GMap.NET.MapProviders;
using GMap.NET.Projections;
using GMap.NET.WindowsPresentation;
using System;

namespace WpfRiUi.gmap
{
    public class MapControl : GMapControl {
        public long ElapsedMilliseconds;
    }
    public abstract class AMapProviderBase : GMapProvider
    {
        public AMapProviderBase() 
        {
            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 AMapProvider : AMapProviderBase
    {
        public static readonly AMapProvider Instance;
        readonly Guid id = new Guid("EF3DD303-3F74-4938-BF40-232D0595EE88");
        public override Guid Id
        {
            get { return id; }
        }
        readonly string name = "AMap";
        public override string Name
        {
            get
            {
                return name;
            }
        }
        static AMapProvider()
        {
            Instance = new AMapProvider();
        }

        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(UrlFormat, pos.X, pos.Y, zoom);
            Console.WriteLine("url:" + url);
            return url;
        }

        //static readonly string UrlFormat = "http://webrd04.is.autonavi.com/appmaptile?x={0}&y={1}&z={2}&lang=zh_cn&size=1&scale=1&style=7";
        static readonly string UrlFormat = "http://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={0}&y={1}&z={2}";
    }        
   
}

  1. 在xaml中使用

在window标签中引入xmlns:src=“clr-namespace:WpfRiUi.gmap”,也就前面我们写的类。然后在显示区域加入如下代码。

 <src:MapControl Grid.Row="0" x:Name="MainMap" Zoom="13" MaxZoom="24" MinZoom="1"/>
  1. 在主窗口中加载地图
    首先先写一个地图加载方法
        private void Map_Loaded()
        {
            try
            {
                System.Net.IPHostEntry e = System.Net.Dns.GetHostEntry("ditu.google.cn");
            }
            catch
            {
                MainMap.Manager.Mode = AccessMode.CacheOnly;
                System.Windows.MessageBox.Show("没有可用的internet连接,正在进入缓存模式!", "提示", MessageBoxButton.OK, MessageBoxImage.Warning);
            }
            MainMap.CacheLocation = Environment.CurrentDirectory + "\\GMapCache\\"; //缓存位置
            MainMap.MapProvider = AMapProvider.Instance; //加载高德地图
            MainMap.MinZoom = 2;  //最小缩放
            MainMap.MaxZoom = 17; //最大缩放
            MainMap.Zoom = 8;     //当前缩放
            MainMap.ShowCenter = false; //不显示中心十字点
            MainMap.DragButton = MouseButton.Left; //右键拖拽地图
            MainMap.Position = new PointLatLng(39.909149, 116.397486); //地图中心位置:北京
            //MainMap.MouseLeftButtonDown += new MouseButtonEventHandler(mapControl_MouseLeftButtonDown);
        }

然后不要忘了在窗口初始化时调用

 public MainWindow()
        {
            InitializeComponent();
            Rect rc = SystemParameters.WorkArea; //获取工作区大小
            this.Left = 0; //设置位置
            this.Top = 0;
            this.Width = rc.Width;
            this.Height = rc.Height;
            this.Map_Loaded();//加载地图
        }

总结

到此GMap已经可以成功的使用高德地图了,非常好用。如果您发现什么问题,请告诉我,本人万分感谢。

### WPF使用 GMap.NET 集成百度地图 为了在WPF应用程序中集成百度地图,需要先配置好GMap.NET环境并指定百度作为地图提供商。由于官方文档可能不会直接提供针对特定地图供应商(如百度)的示例代码,下面给出了一种实现方式。 #### 安装依赖项 确保已经安装了`GMap.NET.Core`和`GMap.NET.WindowsPresentation` NuGet包[^3]。 #### 初始化地图控件 在XAML文件内声明一个用于承载地图视图的空间: ```xml <UserControl x:Class="YourNamespace.MapView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> <Grid> <!-- 地图容器 --> <gmap:GMapControl Name="gMaps📐⚗📐📐📐📐📐📐📐⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗ Due to the unexpected termination of the previous response, let's continue from where it was cut off. ```xml <gmap:GMapControl Name="gMapControl1"/> </Grid> </UserControl> ``` 接着,在后台C#代码中初始化地图参数: ```csharp using System; using System.Windows.Controls; using GMap.NET; using GMap.NET.MapProviders; namespace YourNamespace { public partial class MapView : UserControl { public MapView() { InitializeComponent(); // 设置地图源为百度地图 gMapControl1.MapProvider = BaiduMapProvider.Instance; GMaps.Instance.Mode = AccessMode.ServerOnly; // 或者 ServerAndCache 如果希望启用缓存 // 设定初始位置为中国北京市区 var beijingPosition = new PointLatLng(39.9042, 116.4074); gMapControl1.Position = beijingPosition; gMapControl1.Zoom = 12D; } private void OnLoaded(object sender, RoutedEventArgs e){ // 可选:当控件加载完成后执行的操作 } } } ``` 这段代码展示了如何设置百度地图作为默认的地图服务提供商,并设置了北京的位置为中心点[^1]。 对于更复杂的应用场景,比如添加标记、处理用户交互等,则可以根据具体需求进一步扩展上述基础框架。值得注意的是,如果要利用百度特有的API特性(例如搜索地点),则还需要额外引入百度提供的JavaScript API或其他形式的服务接口[^2]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值