Gmap使用心得分享C#-winform-Gmap

article/2025/11/11 9:40:21

目录

一、Gmap库引用

1.下载Gmap引用库

2.Visual Studio添加项目引用

(1)打开项目后点击项目后添加引用                ​

(2)浏览本地库

(3)添加引用即可

二、Gmap使用流程

         1.添加GmapControl

2.图层Overlay

(1)图层简介

(2)图层设置

2.路径Route

(1)Route类

(2)PointLatlng类(点类)

(3)Pen类(绘笔)

(4)Maker类(标记)


一、Gmap库引用

1.下载Gmap引用库

        下载链接:Gmap库资源+示例demo-C#文档类资源-CSDN文库

        内容包括Gmap库以及一个小型的示例demo

2.Visual Studio添加项目引用

(1)打开项目后点击项目后添加引用                

(2)浏览本地库

(3)添加引用即可

二、Gmap使用流程

1.添加GmapControl

        GmapControl作为一个控件可以在设计时直接拖动到UI界面上,Gmap是一个数据可视化的库,它可以让你在地图上进行大部分你想得到的编辑,例如我们以下要说的绘制路径,标记点位等等。

        我们使用Gmap的过程呢,可以想象成军事地图,没错,就是行军打仗的时候的那个战略地图,你总要标记一下哪里有敌人,哪里是高地,我们要怎么进攻,行进路线等等对吧。而GmapControl这个控件就相当于那张超大号的地图,它给你提供一张有地形信息的地图,剩下的战略信息都需要你自己来绘制。所以说如果不使用该控件的话,可以说使用Gmap的意义就没那么大了对吧?你都没有地图,你要什么进攻路线啊。

        所以我们先再工具箱里拖出一个GmapControl,就命名为GmapControl1吧。

        GmapControl的初始化也很简单,如下

this.gMapControl1.Manager.Mode = AccessMode.ServerAndCache;             //默认地图加载方式GMap.NET.GMaps.Instance.ExportToGMDB("./Map_Sourse/" + gMapControl1.MapProvider.Name + ".gmdb");GMap.NET.GMaps.Instance.ImportFromGMDB("./Map_Sourse/" + gMapControl1.MapProvider.Name + ".gmdb");this.gMapControl1.MapProvider = GMapProviders.OpenCycleTransportMap;        //中文城市地图
this.gMapControl1.Position = new PointLatLng(30.16895771, 119.98405169);    //默认地图中心
this.gMapControl1.MaxZoom = 25;                                             //地图最大缩放
this.gMapControl1.MinZoom = 5;                                              //地图最小缩放
this.gMapControl1.Zoom = 18;                                                //默认地图缩放
this.gMapControl1.ShowCenter = false;                                       //取消中心十字
this.gMapControl1.DragButton = MouseButtons.Left;                       //Gmap控件左击拖拽

        Gmap的地图是网络资源,其中所有的地图资源都在GMapProviders这个类中,但是要注意的是资源是全球性的,所以国区内的一些地图资源是加载不到的,因此在选择资源时可以多尝试几次,像上面给出的这个OpenCycleTransportMap就是一个可以在国内加载的地图资源。

        其余的初始化大家自己简单看一下就应该知道什么作用啦。

2.图层Overlay

(1)图层简介

        如果曾经用过Photoshop等绘图软件的同学就可以跳过啦。

        ok,所谓图层,就是把我们想要的战略地图想象成一叠图片,每一层图片上标注着不同的信息,比如某一层只保存哪里有敌人,再来一层只保存哪里是我们的阵营,再添加好多层,直到可以覆盖掉我们所有需要的信息。然后把它们重合到一起,就形成了一张完整的军事地图啦,上面既有敌人信息,又有地形信息。而我们刚才做的那一层一层的图片相对我们这个地图而言,就可以叫做一个图层。

        简单点说呢,加菲猫最爱吃的意大利千层面,图层就是千层面里面的每一层,它们合起来才能完整的构成一张地图。

(2)图层设置

GMapOverlay lay_manual = new GMapOverlay("lay_id");

        这就已经创建好了一个图层了,构造函数里面的参数就是这个图层的id,你在程序中使用lay_manual可以访问这个图层,也可以使用下面的操作找到这个图层的id。

String id = lay_manual.id;

        创建好一个图层之后要记得把这个图层加到地图中,否则光有图层但没有和地图也是不完整的。

this.gMapControl1.Overlays.Add(lay_manual);

        这样,GmapControl就有了它第一个图层,但是这个图层上还什么东西都没有,所以我们可以对这个图层进行一些操作,让它可以为整张地图做一些贡献。这样就要看一下这个Overlay里面能放什么了,最常用的就是接下来要说的路径Route了。

2.路径Route

(1)Route类

        说到Gmap,其实用的最多的就是在地图上编辑路径。给出一系列的点迹,让GmapControl帮你画出对应的路线,就是这样。如果加上一些路径规划的算法,那你就可以得到一个简单的导航系统啦。

        其实路径不是什么高级玩意,你可以简单地把它理解为一个列表,列表里的每一个元素都是一个点的经纬度坐标,当你给它的点足够多,当然就成了一条路了呗。它的逻辑就是把你给它的一系列点都连接起来,这样在图层上看起来就是一条路了呗。不过,想要使用路径,声明肯定是少不了的。

GMapRoute route_manual = new GMapRoute("route_id");

        看起来是和图层的声明很相似对吧,同样是变量名和id,这里就不展开说了。

        创建好一个路径之后呢,就可以把这个路径加到想要的图层里面去了,所以怎么加,其实和图层也很类似。

lay_manual.Routes.Add(route_manual);

(2)PointLatlng类(点类)

        这样,我们就把刚刚声明好的路径加到了刚刚声明好的图层里面了。但是很明显,路径里什么都没有,那就来给它加上两个点。

route_manual.Add(new PointLatLng(30.161111, 120.151864));

        如你所见,点迹这个类呢就是一个有两个私有变量的类,前者代表维度,后者代表经度。new一个实例之后把他添加到刚才创建的路径里面就可以显示了,但是对于一个路径而言,一个点当然是不够的,当你给够足够的点之后,这条路径看起来就生动很多了。

(3)Pen类(绘笔)

        看到这里,有的同学可能自己不仅仅创建了一条路径,还搞了很多路径混在了一起,但都是一个颜色一个粗细,根本识别不出来啊。所以就需要一个画笔来区分颜色和粗细了。

Pen pen_manual = new Pen(Color.Blue, 2);

        参数很简单,颜色,和路径的粗细。然后就是要和路径进行绑定,毕竟一个路径一个颜色呗。

route_manual.Stroke = new Pen(Color.Black, 2);Pen pen_manual = new Pen(Color.Blue, 2);
route_manual.Stroke = pen_manual;

        两种写法都是可以的,看你怎么喜欢怎么来。

(4)Maker类(标记)

        Maker相对而言就简单许多,就是给一个位置做一个特殊标记嘛。构造函数也很简单:

GMarkerGoogle maker = new GMarkerGoogle(new PointLatLng(30.16895771, 119.98405169), GMarkerGoogleType.arrow)

        第一个参数代表坐标,第二个参数就是Maker的图形。

        创建完一个maker当然要把它加入到某一个图层里面去,所以同样有两种选择:

lay_manual.Markers.Add(new 
GMarkerGoogle(new PointLatLng(30.16895771, 119.98405169), GMarkerGoogleType.arrow));GMarkerGoogle maker = new GMarkerGoogle(new PointLatLng(30.16895771, 119.98405169), GMarkerGoogleType.arrow)
lay_manual.Markers.Add(maker);

(5)最后一步

        图层是先创建后更改的,所以有的时候会显示不是很及时,这个时候就要在所有操作都完成之后,再加上一句:

gMapControl1.Update();

        这样就大功告成了,一个简单的地图就绘制完毕了。

三、关于Gmap

        Gmap的用途有很多,像可以自己制作一个导航软件,只要在路径编辑时加上一些规划算法就可以完成目标。当然也可以用于自动驾驶方面,采用某种GPS设备实时获取当前位置信息,并且发送给Gmap控件,使其可以实时地显示所走过的路径。再高深一点还可以给定两个确定的经纬度位置信息,然后通过一些算法,控制设备按照我所设置的路径一步步走下去,达到自动驾驶的目的。当然Gmap还有很多可以使用的场景,这就要靠正在看这篇文章的你去挖掘咯。


http://chatgpt.dhexx.cn/article/c8QYwlVS.shtml

相关文章

基于GMap.Net的地图解决方案

一 地图的加载与显示 关于GMap的介绍与使用可以看我以前的文章: GMap.Net开发之在WinForm和WPF中使用GMap.Net地图插件 GMap.Net是.Net下一个地图控件,可以基于Http协议加载各个公司的地图,如Google,Bing,ArcGIS的,主要原理是通过解析各个公司的地图服务的URL,传入相应的…

Jersey框架常用注解3:媒体类型注解@Consumes和@Produces

Consumes 指定http请求的MIME类型,默认是*/*,表示任意的MIME类型。该注解的值是数组类型,支持多个MIME类型,可以使用MediaType来指定MIME类型。 Produces 指定http响应的MIME类型,默认是*/*,表示任意的M…

12.@RequestMapping中的consumes属性和produces属性

请求头header中很重要的两个参数:Accept:text/html只在响应中存在,表示当前请求希望服务器将来返回的数据类型是text/htmlContent-Type:application/json既可以出现在请求中,也可以出现在响应中,例如响应中代表服务器响应的是什么数据类型响应中response.setContentType("…

springmvc @RequestMapping注解中produces以及consumes属性的含义

http协议基础知识 首先需要了解什么叫MediaType(媒体类型)? 通俗来说,在http协议中,用来表示传输内容的格式就是MediaType,比如text/html,application/json等,其中text代表介质&am…

AJAX、异步和同步区别

1. 概念: ASynchronous JavaScript And XML (异步的JavaScript 和 XML) 异步和同步区别 2.Ajax作用: Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。通过在后台与服务器进行少量数据交换,Ajax 可以使网页…

js异步与同步的区别

你应该知道,javascript语言是一门“单线程”的语言,不像java语言,类继承Thread再来个thread.start就可以开辟一个线程,所以,javascript就像一条流水线,仅仅是一条流水线而已,要么加工&#xff0…

同步调制和异步调制区别

在PWM控制电路中,载波频率 fc 和调制信号频率 fr 之比成为载波比,根据载波信号和信号波信号是否同步分为同步调制和异步调制。 1 什么是异步调制? 载波信号和调制信号不保持同步的方式称为异步调制,如下图所示,异步调…

同步和异步,区别

同步: 同步的思想是:所有的操作都做完,才返回给用户。这样用户在线等待的时间太长,给用户一种卡死了的感觉(就是系统迁移中,点击了迁移,界面就不动了,但是程序还在执行,…

java同步和异步的区别_java中同步与异步区别是什么

一、同步与异步概念:(推荐:java视频教程) 1.同步:所有的操作都做完,才返回给用户。这样用户在线等待的时间太长,给用户一种卡死了的感觉(就是系统迁移中,点击了迁移,界面就不动了,但…

ajax什么是异步和同步,ajax异步和同步的区别

AJAX异步 打个比方吧,通常情况下,用户注册,那么用户首先得填写好表单,然后点提交,这样表单就会向服务发出一个请求,则服务器处理代码,如果用户存在,则返回一个信息。总之,就是所有的数据需要你点提交后,信息才会发送! 而AJAX就相当于是模拟了一个信息发送请求,你可…

java8拉姆达表达式对Object去重复

java8拉姆达表达式对Object去重复 public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {Map<Object, Boolean> seen new ConcurrentHashMap<>();return object -> seen.putIfAbsent(keyExtractor.a…

拉姆达表达式 filter与map的讲解

filter 根据条件过滤元素 map 获取(映射)每个元素,并对其进行操作 参考链接

sort()与拉姆达表达式

sort()与拉姆达表达式的结合 #include <iostream> #include <string> #include <vector> #include <ctime> #include <map> #include <utility> #include <algorithm>using std::cout; using std::endl; using std::string; using …

java 拉姆达表达式_一看就懂之java8新特性函数式编程:我是拉姆达表达式lambda...

我们都知道&#xff0c; java8之后增加了很多新特性&#xff0c;大大的简化了代码的编写、阅读的负担。 先发个牢骚&#xff1a; 今天up主根据自己的理解跟大家说说新特性之一的lambda express(拉姆达表达式)&#xff0c;每当看到新的语法改动&#xff0c;内心我都是拒绝的。因…

拉姆达表达式学习(1)

我曾经遇到一个项目,项目里面需要经常对一系列的同类型集合进行操作,如对集合进行增加元素,删除集合的指定索引的元素等等.    我们可以使用ArrayList来进行.如 1 ArrayList stringListnew ArrayList(); 2 stringList.Add("大家好"); 3 stringList.Add("你们好…

拉姆达表达式记录 + log日志+代码

目录 71. item.label $"{lstD[i].DeptName}({lstCamera.Count})";72. 定义entity时不写传统的{get&#xff1b;set&#xff1b;}73.74. EF多对多75. DateTime.Now.Subtract(x.GpsTime).TotalHours76. queryModel.LogDate.Value.Year77. .net导出Excel78. User.Ident…

List.sort()方法使用拉姆达表达式进行排序的一个例子

这是牛客网华为java题库的一道题&#xff1a;HJ26 字符串排序 题中要求&#xff0c;对字符串中的英文字母不分大小写按照字典顺序排序&#xff0c;遇到相同的字母&#xff0c;要求保持它们的相对顺序不变&#xff0c;非英文字母字符保持原位置不变。例如&#xff1a; 输入&…

拉姆达表达式

1、Queryable 用于拉姆达表达式操作 //---------Queryable<T>,扩展函数查询---------// //---------Queryable<T>,扩展函数查询---------////针对单表或者视图查询//查询所有 var student db.Queryable<Student>().ToList(); var studentDynamic db.Querya…

java 拉姆达表达式_Java8中foreach与拉姆达表达式的组合使用

1. forEach and Map 1.1 通常这样遍历一个Map Map items = new HashMap<>(); items.put("A", 10); items.put("B", 20); items.put("C", 30); items.put("D", 40); items.put("E", 50); items.put("F", 60)…

Matlab系列之数组(矩阵)的生成

从本篇开始&#xff0c;会有一段时间都将用于记录数组、矩阵的操作等等&#xff0c;如果以前没有接触过相关的&#xff0c;可能会觉得要展示的是很复杂的东西&#xff0c;但并不是&#xff0c;这是一个很简单的部分&#xff0c;但也是一个很重要的部分&#xff0c;至少现在的我…