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 地图根据本人项目实现方式,介绍具体功能点完成步骤和实现方式。
(16020)

话说我才做完- -,和你这个写的差不多
你好,请问listPoint是怎么定义的