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

 

 

 

 

 

 

(20992)

标签: ,

9 条评论 于 “GMap.NET开发技巧(六)-如何缩放基于图片的地图图元”

  1. 匿名
    2012年10月31日13:43
    1

    有一种找到组织的感觉,楼主还有没有讲解,没有参考一个人走的真的好累

    • admin
      2012年10月31日13:50
      2

      你有什么问题?

  2. 情何以堪
    2012年11月1日16:00
    3

    没什么大问题,就是一个人做比较恶心而已,网上资料也少

    • 一小截冬天
      2012年11月20日16:03
      4

      我现在也是在自己做,想实现类似“画图”的功能,并且能把方框里的图标的信息显示出来。这个估计得自己写了。没有封装好的控件可以用哈~

  3. 一小截冬天
    2012年11月20日16:07
    5

    我也是一种找到组织的感觉~终于有个中文网站~大家可以在这里讨论了~~我的问题大神们可否给点提示??

    • admin
      2012年11月22日16:42
      6

      不太理解你的画图功能指的是什么? 能否详细说明一下。

      • 一小截冬天
        2012年11月23日13:03
        7

        界面的左侧有画图的工具,选择“矩形”时,可以在地图上画出矩形,同时矩形内的标志显示出一些信息。
        多谢多谢~~

  4. 菜鸟学习
    2012年11月23日17:19
    8

    // 图元的左上和右下边界

    04
    readonly PointLatLng gtl = new PointLatLng(50.4066263673011, -127.620375523875); //左上坐标

    05
    readonly PointLatLng gbr = new PointLatLng(21.652538062803, -66.517937876818);//右下

    06

    这两个坐标是怎么知道的?从地图上获取?还是先计算好图元的坐标?

    • admin
      2012年11月25日15:50
      9

      当然是你从GPS,或者从数据库中获取到的坐标了。

admin