GMap.NET开发技巧(六)-如何缩放基于图片的地图图元

2012年10月28日 分类: GPS系统

 

 

图片首先格式是可缩放的如PNG格式,缩放的时候,做简单的缩放方式,在mapControl_OnMapZoomChanged当中不断的改变图片的尺寸大小就可以了。

因为ImageMarker得OnRender函数是这样写的:

 

1public override void OnRender(Graphics g)
2      {
3         if(image == null)
4            return;
5 
6         g.DrawImage(image, LocalPosition.X, LocalPosition.Y, Size.Width, Size.Height);
7      }

每次缩放的时候,ImageMarker总会重写这个函数,输出图片,所以如果改变Size大小,图片也被限制在Size当中。

尺寸大小如何根据zoom改变,取决于你,如果图片的四个角的坐标是固定的,那就简单了,当zoom变化时,重新计算一下,左上角和右下角之间的Rect的大小就可以了。

 

1var tl = mapControl.FromLatLngToLocal(gtl); //左上角的经纬度转换位本地显示坐标
2 
3var br = mapControl.FromLatLngToLocal(gbr); //右下角
4 
5imgMarker.Size = new System.Drawing.Size((int)(br.X - tl.X), (int)(br.Y - tl.Y));

 

完整的代码如下:

ImageMarker.cs

 

01public class GMapImage : GMapMarker
02   {
03      private Image image;
04      public Image Image
05      {
06         get
07         {
08            return image;
09         }
10         set
11         {
12            image = value;
13            if(image != null)
14            {
15               this.Size = new Size(image.Width, image.Height);
16            }
17         }
18      }
19 
20      public GMapImage(GMap.NET.PointLatLng p)
21         : base(p)
22      {
23         DisableRegionCheck = true;
24         IsHitTestVisible = false;
25      }
26 
27      public override void OnRender(Graphics g)
28      {
29         if(image == null)
30            return;
31 
32         g.DrawImage(image, LocalPosition.X, LocalPosition.Y, Size.Width, Size.Height);
33      }
34   }

 

在主窗体中,编写缩放控制

 

01public partial class MainForm : Form
02   {
03      // 图元的左上和右下边界
04      readonly PointLatLng gtl = new PointLatLng(50.4066263673011, -127.620375523875); //左上坐标
05      readonly PointLatLng gbr = new PointLatLng(21.652538062803, -66.517937876818);//右下
06 
07      readonly GMapOverlay mainOverlay;
08      readonly GMapImage imageMarker;
09 
10      public MainForm()
11      {
12         InitializeComponent();
13 
14         if(!DesignMode)
15         {
16            try
17            {
18               System.Net.IPHostEntry e = System.Net.Dns.GetHostEntry("www.bing.com");
19            }
20            catch
21            {
22               mapControl.Manager.Mode = AccessMode.CacheOnly;
23               MessageBox.Show("No internet connection avaible, going to CacheOnly mode.", "GMap.NET - imageMarkerDemo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
24            }
25 
26            mapControl.MapProvider = GMapProviders.BingSatelliteMap;
27            //zoom事件
28            mapControl.OnMapZoomChanged += new MapZoomChanged(mapControl_OnMapZoomChanged);
29 
30            mainOverlay = new GMapOverlay("top");
31            mapControl.Overlays.Add(mainOverlay);
32 
33            imageMarker = new GMapImage(gtl);//图片图元
34            imageMarker.Image = Properties.Resources.USOverlay;//从资源文件中获取图片
35            mainOverlay.Markers.Add(imageMarker);
36         }
37      }
38 
39      void mapControl_OnMapZoomChanged()
40      {
41         if(imageMarker != null)
42         {
43            var tl = mapControl.FromLatLngToLocal(gtl);
44            var br = mapControl.FromLatLngToLocal(gbr);
45 
46            imageMarker.Position = gtl;
47            imageMarker.Size = new System.Drawing.Size((int)(br.X - tl.X), (int)(br.Y - tl.Y));
48         }
49      }
50 
51      protected override void OnShown(EventArgs e)
52      {
53         base.OnShown(e);
54 
55         mapControl.SetZoomToFitRect(RectLatLng.FromLTRB(gtl.Lng, gtl.Lat, gbr.Lng, gbr.Lat));
56      }
57   }

 

 

 

 

 

 

(22386)

标签: ,

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,或者从数据库中获取到的坐标了。

一小截冬天

 

This visual editor brought to you by fckeditor for wordpress plugin