GMap.NET开发技巧(六)-如何缩放基于图片的地图图元
2012年10月28日
分类: GPS系统
图片首先格式是可缩放的如PNG格式,缩放的时候,做简单的缩放方式,在mapControl_OnMapZoomChanged当中不断的改变图片的尺寸大小就可以了。
因为ImageMarker得OnRender函数是这样写的:
public override void OnRender(Graphics g) { if(image == null) return; g.DrawImage(image, LocalPosition.X, LocalPosition.Y, Size.Width, Size.Height); }
每次缩放的时候,ImageMarker总会重写这个函数,输出图片,所以如果改变Size大小,图片也被限制在Size当中。
尺寸大小如何根据zoom改变,取决于你,如果图片的四个角的坐标是固定的,那就简单了,当zoom变化时,重新计算一下,左上角和右下角之间的Rect的大小就可以了。
var tl = mapControl.FromLatLngToLocal(gtl); //左上角的经纬度转换位本地显示坐标 var br = mapControl.FromLatLngToLocal(gbr); //右下角 imgMarker.Size = new System.Drawing.Size((int)(br.X - tl.X), (int)(br.Y - tl.Y));
完整的代码如下:
ImageMarker.cs
public class GMapImage : GMapMarker { private Image image; public Image Image { get { return image; } set { image = value; if(image != null) { this.Size = new Size(image.Width, image.Height); } } } public GMapImage(GMap.NET.PointLatLng p) : base(p) { DisableRegionCheck = true; IsHitTestVisible = false; } public override void OnRender(Graphics g) { if(image == null) return; g.DrawImage(image, LocalPosition.X, LocalPosition.Y, Size.Width, Size.Height); } }
在主窗体中,编写缩放控制
public partial class MainForm : Form { // 图元的左上和右下边界 readonly PointLatLng gtl = new PointLatLng(50.4066263673011, -127.620375523875); //左上坐标 readonly PointLatLng gbr = new PointLatLng(21.652538062803, -66.517937876818);//右下 readonly GMapOverlay mainOverlay; readonly GMapImage imageMarker; public MainForm() { InitializeComponent(); if(!DesignMode) { try { System.Net.IPHostEntry e = System.Net.Dns.GetHostEntry("www.bing.com"); } catch { mapControl.Manager.Mode = AccessMode.CacheOnly; MessageBox.Show("No internet connection avaible, going to CacheOnly mode.", "GMap.NET - imageMarkerDemo", MessageBoxButtons.OK, MessageBoxIcon.Warning); } mapControl.MapProvider = GMapProviders.BingSatelliteMap; //zoom事件 mapControl.OnMapZoomChanged += new MapZoomChanged(mapControl_OnMapZoomChanged); mainOverlay = new GMapOverlay("top"); mapControl.Overlays.Add(mainOverlay); imageMarker = new GMapImage(gtl);//图片图元 imageMarker.Image = Properties.Resources.USOverlay;//从资源文件中获取图片 mainOverlay.Markers.Add(imageMarker); } } void mapControl_OnMapZoomChanged() { if(imageMarker != null) { var tl = mapControl.FromLatLngToLocal(gtl); var br = mapControl.FromLatLngToLocal(gbr); imageMarker.Position = gtl; imageMarker.Size = new System.Drawing.Size((int)(br.X - tl.X), (int)(br.Y - tl.Y)); } } protected override void OnShown(EventArgs e) { base.OnShown(e); mapControl.SetZoomToFitRect(RectLatLng.FromLTRB(gtl.Lng, gtl.Lat, gbr.Lng, gbr.Lat)); } }
(20799)
有一种找到组织的感觉,楼主还有没有讲解,没有参考一个人走的真的好累
你有什么问题?
没什么大问题,就是一个人做比较恶心而已,网上资料也少
我现在也是在自己做,想实现类似“画图”的功能,并且能把方框里的图标的信息显示出来。这个估计得自己写了。没有封装好的控件可以用哈~
我也是一种找到组织的感觉~终于有个中文网站~大家可以在这里讨论了~~我的问题大神们可否给点提示??
不太理解你的画图功能指的是什么? 能否详细说明一下。
界面的左侧有画图的工具,选择“矩形”时,可以在地图上画出矩形,同时矩形内的标志显示出一些信息。
多谢多谢~~
// 图元的左上和右下边界
04
readonly
PointLatLng gtl =
new
PointLatLng(50.4066263673011, -127.620375523875);
//左上坐标
05
readonly
PointLatLng gbr =
new
PointLatLng(21.652538062803, -66.517937876818);
//右下
06
这两个坐标是怎么知道的?从地图上获取?还是先计算好图元的坐标?
当然是你从GPS,或者从数据库中获取到的坐标了。