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)

标签:

2 条评论 于 “GMap.NET开发技巧(八)-地图测距功能开发”

  1. 情何以堪
    2012年11月27日18:00
    1

    话说我才做完- -,和你这个写的差不多

  2. 匿名
    2014年9月21日17:55
    2

    你好,请问listPoint是怎么定义的

匿名