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));
      }
   }
(25189)


	
有一种找到组织的感觉,楼主还有没有讲解,没有参考一个人走的真的好累
你有什么问题?
没什么大问题,就是一个人做比较恶心而已,网上资料也少
我现在也是在自己做,想实现类似“画图”的功能,并且能把方框里的图标的信息显示出来。这个估计得自己写了。没有封装好的控件可以用哈~
我也是一种找到组织的感觉~终于有个中文网站~大家可以在这里讨论了~~我的问题大神们可否给点提示??
不太理解你的画图功能指的是什么? 能否详细说明一下。
界面的左侧有画图的工具,选择“矩形”时,可以在地图上画出矩形,同时矩形内的标志显示出一些信息。
多谢多谢~~
// 图元的左上和右下边界
04readonlyPointLatLng gtl =newPointLatLng(50.4066263673011, -127.620375523875);//左上坐标05readonlyPointLatLng gbr =newPointLatLng(21.652538062803, -66.517937876818);//右下06这两个坐标是怎么知道的?从地图上获取?还是先计算好图元的坐标?
当然是你从GPS,或者从数据库中获取到的坐标了。