- GMap.NET使用过程的一些笔记
- 前言
- 一、下载安装GMap.NET
- 二、在项目中使用GMap.NET
- 1.新建C#的WindowsFormsApplication
- 2.GMap.NET控件的自定义代码
- 这是GMap.NET的其中一些属性:
- 进入GMap.NET的初始化函数gMapControl1_Load()(单击控件进入代码编写),写代码之前记得要在前面添加引用:
- 接下来关于我们的地图选择器,它允许我们在程序运行过程中更改地图的源,其它地图可以自己选择:
- 以下代码是参考国外一篇博客,我们项目中并没用用到:
- 添加多边形:
- 添加路线(其实路线与多边形类似,只不过没有填充项,并且不闭合):
- 总结
前言
GMap.NET是强大、免费和跨平台的开源.NET控件,而写这篇博客是因为最近有个ADS-B接收机可视化的项目需要使用地图作为可视化,并且选择了GMap.NET作为开发的基础,在网上查找资料较少,所以就在这里分享一下项目过程中使用GMap.NET的一些经验,也希望能够给使用GMap.NET的开发者提供一些参考,当然我也不是理解的很透彻,所以可能有些地方还是欠缺,也希望谅解。
一、下载安装GMap.NET
首先是在greatmaps网站下载源代码(网站的右上角download archive),源文件大概400M,我下载时挺快的,源代码可以做部分的更改编译后生成自己功能的DLL文件,而实际上我们使用到的基本上是三个文件:
- GMap.NET.Core.dll(在目录greatmapssourceCodegreatmapsGMap.NET.CorebinDebug)
- GMap.NET.WindowsForms.dll(在目录greatmapssourceCodegreatmapsGMap.NET.WindowsFormsbinDebug)
- GMap.NET.WindowsPresentation.dll(在目录greatmapssourceCodegreatmapsGMap.NET.WindowsPresentationbinDebug)
我在这里提供这三个的单独下载文件在云盘(提取码nstd)。
如果是自己修改相关参数的,可以在greatmapssourceCodegreatmaps目录的对应子目录中打开Project文件重新编译(例如我提供的DLL就去除了地图中心红色+的标志)。
我们在Visual Studio(我使用的是2012版本,其它版本可能会稍有差别)新建一个应用,在“工具箱”右键选择菜单“选择项”,然后在.NET Framework组件的浏览按钮中选择我们下载的GMap.NET.WindowsForms.dll,这样在我们的工具箱中就会有GMapControl工具。
接下来就是把GMapControl工具添加到我们的项目中(我在界面右上角加了个地图选择器):
- CanDragMap –如果设置为true,则用户可以使用鼠标右键拖动(平移)地图。您可能需要将此设置保持为true。
- EmptyTileColor –这是GMap用来绘制无法从地图提供程序获取任何数据的图块的颜色。当您以很高的缩放级别显示地图时,可能会发生这种情况,具体取决于提供者。
- MarkersEnabled –如果设置为true,则GMap将显示您定义的所有标记。最好暂时将其设置为true,否则您可能会想知道标记的位置)。这同样适用于PolygonsEnabled和RoutesEnabled。
- Zoom,MinZoom和MaxZoom – Google Maps的缩放级别介于0(缩放到全局级别)到18(缩放到街道级别)之间。缩放是当前的缩放级别(5代表国家/地区级别),如果希望用户能够完全放大和缩小,则应分别将MinZoom和MaxZoom设置为0和18。使用鼠标滚轮进行缩放。
- Bearing –此属性会将地图向左旋转指定的度数。
using GMap.NET; using GMap.NET.WindowsForms; using GMap.NET.WindowsForms.Markers; using GMap.NET.MapProviders;
//地图选择,可以通过GMapProviders.根据提示选择代码,而不必记住有什么地图名称 this.Main_gMap.MapProvider = GMapProviders.BingHybridMap; //设置地图缓存模式 GMaps.Instance.Mode = AccessMode.ServerAndCache; //设置地图的中心点纬度和经度 this.Main_gMap.Position = new GMap.NET.PointLatLng(23.0,113.0); //地图最小的缩放级别 this.Main_gMap.MinZoom = 2; //地图最大的缩放级别 this.Main_gMap.MaxZoom = 20; //初始化时地图的缩放级别 this.Main_gMap.Zoom = 10; //可以左键拖动地图平移 this.Main_gMap.DragButton = MouseButtons.Left; //这是定义了一个函数用于单击左键时显示单击点的经纬度信息(项目需要) Main_gMap.MouseClick += new MouseEventHandler(Main_gMap_MouseClick);
这里也给出单击鼠标显示经纬度的函数代码:
void Main_gMap_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
PointLatLng point = Main_gMap.FromLocalToLatLng(e.X, e.Y);
double pLat = point.Lat;
double pLong = point.Lng;
//Mouse_LL.Text = "Latitude: " + pLat.ToString("f3") + " , " + "Longitude: " + pLong.ToString("f3");
}
}
接下来关于我们的地图选择器,它允许我们在程序运行过程中更改地图的源,其它地图可以自己选择:
private void Map_select_comboBox_SelectedIndexChanged(object sender, EventArgs e)
{
switch (Map_select_comboBox.SelectedIndex)
{
case 0:
//Bing混合地图,英文标签,访问速度快
Main_gMap.MapProvider = GMapProviders.BingHybridMap;
break;
case 1:
//Bing卫星地图,无标签,访问速度快
Main_gMap.MapProvider = GMapProviders.BingSatelliteMap;
break;
case 2:
//俄罗斯Yandex地图,中文标签
Main_gMap.MapProvider = GMapProviders.YandexHybridMap;
break;
case 3:
//Google电子地图,中文标签
Main_gMap.MapProvider = GMapProviders.GoogleChinaMap;
break;
case 4:
//Google地形图,中文标签
Main_gMap.MapProvider = GMapProviders.GoogleChinaTerrainMap;
break;
default:
Main_gMap.MapProvider = GMapProviders.BingHybridMap;
break;
}
}
接下来可能比较重要的是我们要在地图上显示我们自定义的图标,这也是我们使用地图的原因,GMap.NET实现用户显示的原理是在地图上不断的加Marker Layer,用于显示我们自己的数据,例如我们的ADS-B接收机可视化项目,就是通过ADS-B接收机接收到的民航飞机经纬度信息显示在地图上(还有航向信息,这样就可以实现自定义图标的显示):
//定义添加Marker层用于显示数据(提示:不要再循环中使用GMapOverlay函数)
private GMapOverlay markersOverlay = new GMapOverlay("markers");
//添加层
Main_gMap.Overlays.Add(markersOverlay);
//Marker数据(经纬度+自定义图标)
marker = new GMarkerGoogle(new PointLatLng(Latitude, Longtitude), new Bitmap(Properties.Resources.airplaneicon00));
//定义标签
string Label_str = "ICAO:";
//marker的标签属性(适合静态显示,动态显示会一闪一闪,暂时不知道如何解决)
marker.ToolTipText = Label_str;
//还有一些其它相关的标签属性
marker.ToolTip.Fill = Brushes.Black;
marker.ToolTip.Foreground = Brushes.White;
marker.ToolTip.Stroke = Pens.Black;
marker.ToolTip.TextPadding = new Size(20, 20);
//设置marker的标签属性是否显示(因为一闪一闪,所以在项目中不进行显示)
marker.ToolTipMode = MarkerTooltipMode.Never;
//添加数据
markersOverlay.Markers.Add(marker);
//擦除层的数据
markersOverlay.Clear();
我们项目中主要是不断的擦除上一时刻的航空器状态信息和添加当前时刻航空器的状态信息,以实现航空器在地图上运动。
关于自定义图标,可以双击properties中的Resources.resx文件进入相关界面,然后在其“菜单栏”的“添加资源”》“添加现有文件”按钮选择自己的图标,这样在Project中就用Resources文件夹,就可以通过类似上面代码Properties.Resources.airplaneicon00调用自己的图标。
//添加层
GMapOverlay polygons = new GMapOverlay("polygons");
//多边形的点列表
List points = new List();
points.Add(new PointLatLng(48.866383, 2.323575));
points.Add(new PointLatLng(48.863868, 2.321554));
points.Add(new PointLatLng(48.861017, 2.330030));
points.Add(new PointLatLng(48.863727, 2.331918));
GMapPolygon polygon = new GMapPolygon(points, "Jardin des Tuileries");
polygons.Polygons.Add(polygon);
gmap.Overlays.Add(polygons);
//填充颜色,其中50是半透明度alpha = 50(0-255),0是全透明,255是全不透明
polygon.Fill = new SolidBrush(Color.FromArgb(50, Color.Red));
//边框,颜色和线宽
polygon.Stroke = new Pen(Color.Red, 1);
关于多边形的面积计算,GMap.NET并没有直接的函数调用,但是可以通过经纬度转换的思路去计算,1°经纬度跨度约为2×pi×6378.137/360=111.3194907932736km。(对于小的经纬度计算是合理的,但是对于大尺度的经纬度跨度是不合适的,因为有地球曲率的存在,除非开发者是根据曲面面积去计算而不是当作平明面积去计算的)
添加路线(其实路线与多边形类似,只不过没有填充项,并且不闭合)://添加层
GMapOverlay routes = new GMapOverlay("routes");
//路线列表
List points = new List();
points.Add(new PointLatLng(48.866383, 2.323575));
points.Add(new PointLatLng(48.863868, 2.321554));
points.Add(new PointLatLng(48.861017, 2.330030));
GMapRoute route = new GMapRoute(points, "A walk in the park");
//线的颜色和线宽
route.Stroke = new Pen(Color.Red, 3);
routes.Routes.Add(route);
gmap.Overlays.Add(routes);
路线的特殊之处还在于,您可以让GMap.NET使用路线的Distance属性来计算总路线长度。这将返回以公里为单位的路线长度。
总结
这次有关GMap.NET的分享就到这里,欢迎各位开发者在留言区指正和添加领悟的新功能。这次文章主要是怎么初始化GMap.NET地图,并且介绍了一些标志、路线和多边形的添加方法,更多功能希望广大的开发者自己去探索分享。



