GMap.NET开发技巧(八)-地图测距功能开发
2012年11月22日
分类: GPS系统
根据本人开发实例中具体实现测距功能,详细介绍测距算法和地图操作经验。
首先说明测距基本原理,实现两点绘线,并测试出距离值。
实现
步骤一:
首先要生存图层,以便在地图中显示线路和标注总距离值。
需要生成图成为:线路图层,临时线路图层,标注图层等。
GMapOverlay Map_Scribing 线路图层
GMapOverlay Map_Temporarily 临时线路图层
GMapOverlay Map_label 标注图层
步骤二:
需要结合GMap 地图控件事件:
Click 单击事件
DoubleClick 双击事件
MouseMove 鼠标移动事件
步骤三:
代码介绍
首先实例化图层类,代码如下所示:
Map_Scribing = new GMapOverlay(gMapControl1, "线路图层"); gMapControl1.Overlays.Add(Map_Scribing); Map_Temporarily = new GMapOverlay(gMapControl1, "临时线路图层"); gMapControl1.Overlays.Add(Map_Temporarily); Map_label = new GMapOverlay(gMapControl1, "标注图层"); gMapControl1.Overlays.Add(Map_label);
分别生成三个图成,添加到GMap.NET地图控件中。
控件事件,代码如下所示:
鼠标点击事件,根据点击位置保存点坐标,以第一次点击位置为开始点,最后双击为结束点,测算总距离值。
private void gMapControl1_Click(object sender, EventArgs e) { if (gMapControl1.Overlays.Contains(Map_Scribing)) { this.Map_Scribing.Routes.Clear(); //清空路线图层 listPoint.Add(new PointLatLng(lastPosition.Lat, lastPosition.Lng)); GMapRoute item = new GMapRoute(listPoint, "line"); item.Stroke.Color = Color.Black; item.Stroke.Width = 1; //设置画线粗细 Map_Scribing.Routes.Add(item); } }
鼠标双击事件,根据双击点位置,作为结束点,并计算测距总距离值,代码如下所示:
private void gMapControl1_DoubleClick(object sender, EventArgs e) { if (gMapControl1.Overlays.Contains(Map_label)) { if (listPoint.Count >= 2) { double d = 0; for (int i = 0; i < listPoint.Count; i++) { if (listPoint.Count != i + 1) { d += GetDistance(listPoint[i].Lat, listPoint[i].Lng, listPoint[i + 1].Lat, listPoint[i + 1].Lng); } } GMapMarkerBS gMapMarker = new GMapMarkerBS(listPoint[listPoint.Count - 1], string.Format("总距离={0}千米", d.ToString()), "Measurement"); Map_label.Markers.Add(gMapMarker); Map_Temporarily.Routes.Clear(); } } }
鼠标移动事件,作用于当绘制开始点时,需要在地图中显示线路图,并跟随鼠标移动绘制线路,显示长度,介绍代码如下所示:
private void gMapControl1_MouseMove(object sender, MouseEventArgs e) { PointLatLng latLng = this.gMapControl1.FromLocalToLatLng(e.X, e.Y); List<PointLatLng> listPoint1 = new List<PointLatLng>(); if (latLng != listPoint[listPoint.Count - 1]) { listPoint1.Add(listPoint[listPoint.Count - 1]); listPoint1.Add(new PointLatLng(latLng.Lat, latLng.Lng)); Map_Temporarily.Routes.Clear(); GMapRoute item = new GMapRoute(listPoint1, "line"); item.Stroke.Color = Color.Black; item.Stroke.Width = 1; //设置画线粗细 Map_Temporarily.Routes.Add(item); } }
计算两点算法函数得出总距离值,代码如下所示:
public static double GetDistance(double lat1, double lng1, double lat2, double lng2) { double radLat1 = rad(lat1); double radLat2 = rad(lat2); double a = radLat1 - radLat2; double b = rad(lng1) - rad(lng2); double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a / 2), 2) + Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin(b / 2), 2))); s = s * EARTH_RADIUS; s = Math.Round(s * 10000) / 10000; return s; }
以上是结合GMap.NET 地图根据本人项目实现方式,介绍具体功能点完成步骤和实现方式。
(14495)
话说我才做完- -,和你这个写的差不多
你好,请问listPoint是怎么定义的