GMap.NET是一个强大、免费、跨平台、开源的.NET控件,它在Windows Forms 和WPF环境中能够通过Google, Yahoo!, Bing, OpenStreetMap, ArcGIS, Pergo, SigPac等实现寻找路径、地理编码以及地图展示功能,并支持缓存和运行在Mobile环境中。

GMap.NET是一个开源的GEO地图定位和跟踪程序。就像谷歌地图、雅虎地图一样,可以自动计算两地的距离,定位经纬度,与Google地图不同的是,该项目是建立在C#语言WinForm基础上的。可以对地图放大缩小,进行城市标记等。

Gmap.net项目原地址(http://greatmaps.codeplex.com/)

博客:http://www.cnblogs.com/enjoyeclipse/archive/2013/01/31/2882254.html

Manager.Mode : 数据访问模式,一般设置为AccessMode.ServerAndCache
MapProvider : 地图提供商,一般使用GMapProviders.GoogleChinaMap

DragButton : 移动地图的鼠标按键,默认为右键,通常将其设置为 MouseButtons.Left

MaxZoom : 最大倍数,为一个int
MinZoom : 最小倍数,为一个int
Zoom : 当前倍数,为一个int

Position : 地图的聚焦点,为一个PointLatLng

PointLatLng :包含两个两个double表示经纬度的点,Lat表示纬度,Lng表示纬度
(30.55,114.29)武汉的一个点

GMapOverlay : 图层,通过gMap.Overlays.Add方法添加到地图中,可存放标记、路径等

GMarkerGoogle : 标记,存放在层中,新建时需要一个PointLatLng表示其位置信息和一个Bitmap表示其在地图上显示的图片
常用属性有
Tag,常用来存放一个唯一值,以便调用该标记
ToolTipText,标记显示的文本
ToolTipMode,设置ToolTip显示的模式,有始终显示、从不显示、鼠标停留时显示三种
IsVisible,标记是否可见

GMapRoute : 路径,可画出两点之间的线路、直线

SelectedArea : 当前选择区域,Shift+拖动右键 可以设置
LocationTopLeft,左上角的点,为一个PointLatLng
LocationRightBottom,右下角的点 为一个PointLatLng
gMap.SelectedArea = RectLatLng.Empty 可将其设置为空
通过新建一个RectLatLng并赋值,可以设置当前选择区域:
RectLatLng area = new RectLatLng();
area.LocationTopLeft = new PointLatLng(leftLat,leftLon);
area.Size = new SizeLatLng(leftLat-rightLat,rightLon-leftLon);
mainMap.SelectedArea = area;
mainMap.Position = area.LocationMiddle;

地图初始化

//地图由三层组成。最上层:GMapMarker.中间层:GMapOverlay。最底层:GMapControl。  
GMapOverlay objects;
GMapControl MainMap;
List<GMapMarker> markerList = new List<GMapMarker>();
PointLatLng currentPositionLat ;
public showMap()
{
InitializeComponent();
//获得地图信息,默认北京位置。
SuspendLayout();
MainMap = new GMapControl();
{
//Google中国地图。
MainMap.MapProvider = GMapProviders.GoogleChinaMap;
MainMap.Position = new PointLatLng(23.129163, 113.264435);
currentPositionLat = MainMap.Position;
MainMap.MinZoom = 1;
MainMap.MaxZoom = 19;
MainMap.Zoom = 10;
this.trackBar.Value = (int)MainMap.Zoom;
MainMap.Dock = DockStyle.Fill;
MainMap.MarkersEnabled = true;

}

//this.MainMap.ReloadMap();//重新加载地图。
GMapProvider.Language = LanguageType.ChineseSimplified;

//最上层的图标显示。

MainMap.Cursor = Cursors.Hand;
var current = new PointLatLng(MainMap.Position.Lat, MainMap.Position.Lng);
var currentMark = new GMarkerGoogle(current, GMarkerGoogleType.green);
var overlay = new GMapOverlay("current");

//overlay.Markers.Add(currentMark);
MainMap.Overlays.Add(overlay);

Cursor.Current = Cursors.Hand;

//用户双击标记选中点。并获得当前的经纬度。
{
MainMap.MouseDoubleClick += new MouseEventHandler(MainMap_MouseDoubleClick);
MainMap.MouseWheel += new MouseEventHandler(MainMap_MouseWheel);
MainMap.MouseDown+=new MouseEventHandler(MainMap_MouseDown);
}
ResumeLayout(true);
objects = new GMapOverlay("objects");
MainMap.Overlays.Add(objects);
gMapControl1.Controls.Add(MainMap);
//GMapMarkerRect rect = new GMapMarkerRect(MainMap.Position);
//rect.Size = new System.Drawing.Size(0, 0);
//rect.ToolTipText = "北京市";
//rect.ToolTipMode = MarkerTooltipMode.Always;
//overlay.Markers.Add(rect);

MainMap.DragButton = MouseButtons.Left;
txtAddress.Focus();

//用户选中地图位置,获得经纬度。
public void MainMap_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
//图标显示。
Cursor.Current = Cursors.Hand;
PointLatLng latLng = MainMap.FromLocalToLatLng(e.X, e.Y);
//var current = new PointLatLng(Math.Abs(latLng.Lat), latLng.Lng);
//var currentMark = new GMarkerGoogle(current, GMarkerGoogleType.green);
//var overlay = new GMapOverlay("current");
//MainMap.MarkersEnabled = false;
//overlay.Markers.Clear();
//MainMap.Overlays.Clear();
//overlay.Markers.Add(currentMark);
//MainMap.Overlays.Add(overlay);
//MainMap.MarkersEnabled = true;
//Cursor.Current = Cursors.Hand;

MainMap.Position = latLng;
setMainMapZoom(true);
//this.positionLabel.Text = string.Format("经度:{0}, 纬度:{1} ", latLng.Lng, latLng.Lat);

showAlarmFrm frm = new showAlarmFrm(latLng.Lat,latLng.Lng,"你好");
frm.Show();
}
}

//鼠标点击事件获取地图当前坐标

private void MainMap_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
PointLatLng latLng = MainMap.FromLocalToLatLng(e.X, e.Y);
currentPositionLat = latLng;
}
}

//搜索
private void button1_Click(object sender, EventArgs e)
{
if (this.txtAddress.Text.Length == 0)
{
this.txtAddress.Focus();
MessageBox.Show("请输入查询的地址");
}
else
{
searchAddressMap(this.txtAddress.Text);
}
}

private void searchAddressMap(string address)
{
this.MainMap.ReloadMap();
GMapProvider.Language = LanguageType.ChineseSimplified;
string search = string.Format("{0}", address);

//判断地址键是否存在。
GeoCoderStatusCode code = MainMap.SetCurrentPositionByKeywords(search);
if (code != GeoCoderStatusCode.G_GEO_SUCCESS)
{
MessageBox.Show("地址没有找到:'" + address + "', 原因:" + code.ToString(), "GMap.NET", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
else
{
objects = new GMapOverlay("objects");
objects.Markers.Clear();
this.MainMap.Overlays.Clear();
AddLocation(search);
}
}

/// <summary>
/// 根据具体地址名称来显示此地址的地图:由地址获得经纬度,再显示地图位置。
/// </summary>
/// <param name="place">地址名称</param>
private void AddLocation(string place)
{
GeoCoderStatusCode unknow = GeoCoderStatusCode.Unknow;
PointLatLng? latLngFromGeocoder = GMap.NET.MapProviders.GMapProviders.GoogleChinaMap.GetPoint(place, out unknow);
if (latLngFromGeocoder.HasValue && (unknow == GeoCoderStatusCode.G_GEO_SUCCESS))
{
GMapMarker item = new GMarkerGoogle(latLngFromGeocoder.Value, GMarkerGoogleType.green);
objects = new GMapOverlay("objects");
objects.Markers.Add(item);
MainMap.Overlays.Add(objects);

}
}

//放大地图
private void buttonZoomUp_Click(object sender, EventArgs e)
{
setMainMapZoom(true);

}
//缩小地图
private void buttonZoomDown_Click(object sender, EventArgs e)
{
setMainMapZoom(false);

}
/// <summary>
/// 放大地图或者缩小地图
/// </summary>
/// <param name="smallOrBig">true放大,false缩小</param>
private void setMainMapZoom(bool smallOrBig)
{
if (smallOrBig == false)
{
if (MainMap.Zoom > MainMap.MinZoom)
{
MainMap.Zoom -= 1;
}

if (this.trackBar.Value > this.trackBar.Minimum)
{
this.trackBar.Value = this.trackBar.Value - 1;
}
}
else
{
if (MainMap.Zoom < MainMap.MaxZoom)
{
MainMap.Zoom += 1;
}
if (this.trackBar.Value < this.trackBar.Maximum)
{
this.trackBar.Value = this.trackBar.Value + 1;
}
}
}

public void MainMap_MouseWheel(object sender, MouseEventArgs e)
{
PointLatLng latLng = MainMap.FromLocalToLatLng(e.X, e.Y);
MainMap.Position = latLng;
if (e.Delta > 0)
setMainMapZoom(true);
else
setMainMapZoom(false);

}

//画出两点之间的线路

//设定开始点
private void startPositionItem_Click(object sender, EventArgs e)
{
var start = new PointLatLng(currentPositionLat.Lat, currentPositionLat.Lng);
var startMarker = new GMarkerGoogle(start, GMarkerGoogleType.green);
startMarker.IsHitTestVisible = true;
startMarker.ToolTipMode = MarkerTooltipMode.Always;
startMarker.ToolTipText = "起点";
objects.Markers.Add(startMarker);
markerList.Add(startMarker);

this.startPositionItem.Enabled = false;
}
//设定终点
private void endPositionItem_Click(object sender, EventArgs e)
{
var end = new PointLatLng(currentPositionLat.Lat, currentPositionLat.Lng);
var endMarker = new GMarkerGoogle(end, GMarkerGoogleType.red);
endMarker.IsHitTestVisible = true;
endMarker.ToolTipMode = MarkerTooltipMode.Always;
endMarker.ToolTipText = "终点";
objects.Markers.Add(endMarker);
markerList.Add(endMarker);
this.endPositionItem.Enabled = false;

DrawPathToMap();
}

/// <summary>
/// 根据起点和终点绘制路径
/// </summary>
private void DrawPathToMap()
{
RoutingProvider rp = MainMap.MapProvider as RoutingProvider;
if (rp == null)
{
rp = GMapProviders.GoogleMap; // use google if provider does not implement routing
}
if (markerList.Count >= 2)
{
for (int i = 0; i < markerList.Count; i+=2)
{
MapRoute route = rp.GetRoute(markerList[i].Position, markerList[i+1].Position, false, false, (int)MainMap.Zoom);
if (route != null)
{
// add route
GMapRoute r = new GMapRoute(route.Points, route.Name);
r.IsHitTestVisible = true;
objects.Routes.Add(r);
// add route start/end marks
objects.Markers.Add(markerList[i]);
objects.Markers.Add(markerList[i+1]);

MainMap.ZoomAndCenterRoute(r);

}
}
markerList.Clear();
this.startPositionItem.Enabled = true;
this.endPositionItem.Enabled = true;

}
else
{
markerList.Clear();
this.startPositionItem.Enabled = true;
this.endPositionItem.Enabled = true;
}
}

//清除路径及标注
private void clearRute_Click(object sender, EventArgs e)
{
objects.Routes.Clear();
objects.Markers.Clear();

}

//放大地图
private void buttonZoomUp_Click(object sender, EventArgs e)
{
setMainMapZoom(true);

}
//缩小地图
private void buttonZoomDown_Click(object sender, EventArgs e)
{
setMainMapZoom(false);

}
/// <summary>
/// 放大地图或者缩小地图
/// </summary>
/// <param name="smallOrBig">true放大,false缩小</param>
private void setMainMapZoom(bool smallOrBig)
{
if (smallOrBig == false)
{
if (MainMap.Zoom > MainMap.MinZoom)
{
MainMap.Zoom -= 1;
}

if (this.trackBar.Value > this.trackBar.Minimum)
{
this.trackBar.Value = this.trackBar.Value - 1;
}
}
else
{
if (MainMap.Zoom < MainMap.MaxZoom)
{
MainMap.Zoom += 1;
}
if (this.trackBar.Value < this.trackBar.Maximum)
{
this.trackBar.Value = this.trackBar.Value + 1;
}
}
}

Gmap.net搜集相关推荐

  1. windows性能计数器搜集方法

    windows性能计数器搜集方法 PerfMon-Windows性能监视器是个好东西,可以辅助我们分析发生问题时间段服务器资源占用情况,但是部署性能计数器确实一个相当麻烦的事情,往往这种枯燥的事别人还 ...

  2. EXP6 信息搜集与漏洞扫描

    1.实验有关问题 (1)哪些组织负责DNS,IP的管理. ICANN是一个集合了全球网络界商业.技术及学术各领域专家的非营利性国际组织,负责在全球范围内对互联网唯一标识符系统及其安全稳定的运营进行协调 ...

  3. 网上搜集了点资料,学web的人互相分享共同进步吧(php编码的好习惯必须养成)...

    网上搜集了点资料,学web的人互相分享共同进步吧 一.优秀的代码应该是什么样的? 优秀的PHP代码应该是结构化的.大段的代码应该被分割整理成一个个函数或方法,而那些不起眼的小段代码则应该加上注释,以便 ...

  4. 多人开源博客系统再搜集

    Posted on October 22, 2006 by kunstao 现在很多人在找多用户blog,我列出的大部分都说自己支持多用户,但实际上多用户有两种,一种是多人共同维护一个blog,另一种 ...

  5. C语言程序设计 搜集C/C++编译器

    在所有的和计算机的相关的专业中,C,C++几乎都是必修课,而我们用的编译器多半都是Turboc 2.0,Visual C++,Borland C++ Builder,然而C/C++的编译器是何其多,长 ...

  6. Winform下的地图开发控件(GMap.NET)使用心得之二

    在上篇<Winform下的地图开发控件(GMap.NET)使用心得>中简单介绍了GMap.NET的控件基本情况,本篇开始介绍一下相关的代码操作. 其实目前GMap.NET提供的功能还不是很 ...

  7. 2018-2019-2 20165315《网络攻防技术》Exp6 信息搜集与漏洞扫描

    2018-2019-2 20165315<网络攻防技术>Exp6 信息搜集与漏洞扫描 目录 一.实验内容 二.实验步骤 1.各种搜索技巧的应用 2.DNS IP注册信息的查询 3.基本的扫 ...

  8. GMap.net 离线地图问题

    转载自百度知道:请问一下,使用Gmap.net 怎么导入离线地图我使用[http://www.cnblogs.com/enjoyeclipse/archive/2013/01/29/2882254.h ...

  9. 谷歌地图控件,通过扩展实现GMAP的自定义绘图系统

    这两天搞网络规划和优化系统,需要开发一套地图,并在地图上放置自定义图标,和放置复杂贴图,或画矩形多边形等随着地图移动和放缩.这件事情一开始搞得很痛苦,通过GMAP.NET开发,并使用了CodeProj ...

最新文章

  1. 【linux】Valgrind工具集详解(九):Memcheck检查的内容和方法
  2. 物联网在“最后一公里”投递中的应用
  3. 传统软件的云计算之路
  4. 理解交通行业规律 用持续做“重”来重新定义共享出行
  5. linux笔记之 rpm常用参数 ,yum安装编译器,httpd服务的开关
  6. Java connot reduce_Java8: Reduce方法
  7. 关注BLUEBEE的浏览器发展
  8. python回车换行怎么不行_解决pycharm回车之后不能换行或不能缩进的问题
  9. java中的原型模式_java中的原型模式理解
  10. 大型基金电商多点开花 中小公司望洋兴叹
  11. 【python】文件打开中文符问题
  12. Python数据分析入门(十九):绘制散点图
  13. vscode中文vsix_离线安装vscode vsix插件
  14. 骁龙200/400/600/800芯片型号对应及规格介绍
  15. 2021-03-14-爬香山
  16. 对不起,云计算又走错路了
  17. 李南江HTML5教程学习心得
  18. mysql数据库安全加固_数据库安全加固系统
  19. javaScript解决浏览器兼容问题,判断浏览器是ie或者Chrome
  20. getopt.h及相应的函数

热门文章

  1. Python、Cython、CPython的简单对比
  2. axios请求415错误Uncaught (in promise) Error: Request failed with status code 415
  3. PHP和Socket简介
  4. linux下常用拷贝命令
  5. 计算机风筝设计图片教程,如何利用塑料袋制作风筝图解教程
  6. 2023小红书年度生活趋势报告
  7. 解决Chrome和Chrome内核edge浏览器在启用硬件加速后颜色异常的问题
  8. vscode怎么运行android项目,windows + flutter +android+ vscode 安装配置运行流程(详细版本)...
  9. 植物大战僵尸资源文件提取 总结
  10. ./bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: