学习了这篇古早文章:
GMap.NET开发技巧(六)-如何缩放基于图片的地图图元 | GPS软件平台开发技术博客
该篇文章实现图片随地图等级缩放而缩放的思路主要是这两个方法:
1.gMapControl1.FromLatLngToLocal(p);
该方法输入经纬度,返回屏幕坐标。即传入PointLatLng类型字段,返回GPoint类型字段。
2.gMapControl1.FromLocalToLatLng(e.X, e.Y)
该方法输入屏幕坐标,返回经纬度。
在该文章中,确定了需要放在GMap地图上图片的左上角,和右下角坐标。使用GMap自带的方法:gMapControl1_OnMapZoomChanged(),该方法在地图等级发生变化时触发。
在该方法中:
var tl = mapControl.FromLatLngToLocal(gtl);//将左上角经纬度转成屏幕坐标
var br = mapControl.FromLatLngToLocal(gbr);//将右下角经纬度转为屏幕坐标
imageMarker.Size =
new
System.Drawing.Size((
int
)(br.X - tl.X), (
int
)(br.Y - tl.Y));
//用左上角和右下角的屏幕坐标,确定新的图片尺寸
这样就可以确保图片随地图等级变化而变化了。
但是我需要解决的问题中,图片的位置在时刻发生变化,只能获取到图片的一个坐标,并且为了确保图片显示位置精准,该坐标为图片的中心坐标。这种情况下,想要获得图片左上角与右下角的经纬度坐标,需先将中心经纬度坐标转为屏幕坐标,再根据我提前设置的图片大小,找到左上角与右下角的屏幕坐标,再转成经纬度坐标。
一言以蔽之,十分麻烦且不能用。故此方法较为适合已知图片左上角与右下角经纬度的情况下使用。
在发现50×50的图片随等级变化的都是2的倍数后,决定先设置好不同等级下图片的大小,再在gMapControl1_OnMapZoomChanged()方法触发后重新赋值图片Size大小,实现图片缩放。
部分代码为:
//通过地图等级改变图片大小
if(trackBarValue>=19)
{
int w =(int) Math.Pow(2, (trackBarValue - 19)) * 50;
imageSize = new Size(w, w);
}
else
{
int h = (int)(50 / Math.Pow(2, (19 - trackBarValue)));
imageSize = new Size(h, h);
}
其中trackBarValue为比例尺控件显示的地图等级,即trackBar控件。
对了,可使用gMapControl1_MouseMove方法加gMapControl1.FromLocalToLatLng(e.X, e.Y)显示鼠标在地图中的经纬度。部分代码如下:
lat = gMapControl1.FromLocalToLatLng(e.X, e.Y).Lat; //double类型
lng = gMapControl1.FromLocalToLatLng(e.X, e.Y).Lng; //double类型
label2.Text = "lat= " + Convert.ToString(lat) + " lng= " + Convert.ToString(lng);