这两天搞网络规划和优化系统,需要开发一套地图,并在地图上放置自定义图标,和放置复杂贴图,或画矩形多边形等随着地图移动和放缩。这件事情一开始搞得很痛苦,通过GMAP.NET开发,并使用了CodeProject上面的drawtools工具(有兴趣可以自行搜索,博客园也有相关的文章讨论),但就是没法实现随地图移动而移动,仿佛是浮在地图上的。最后这种方法只能放弃。

看了几个博客上面讨论的GMAP,其他方面都有讨论,就是没有如何在地图上实现自定义绘图。后来反复研究了GMAP.NET的整个类的结构,以及例程,终于发现了方法。

  首先说下图层,要显示图标和图形,就必须有图层的概念,仿佛一层一层贴在地图上的。可以从下到上,表示为如下四个图层:

地理信息图层——复杂贴图图层——地标图层——用户数据操作图层

简单地说,就是地图显示在“地理信息图层”,“复杂贴图图层”来贴图,可实现放缩和位移,“地标图层”可放置自定义图标,“用户操作图层”可定义其他一些特殊功能。

(一)实现自定义图标的GMAPMARKER

  我们知道,GMAP中有一个Gmapmarker类,可以实现在地图上放置图标,可移动但不可放缩,可气的是,只有一个气球,很丑,怎么才能设计自定义的图标呢?派生这个类就可以了。GMapMarkerBS是我建立的一个基站(BS)类。可以在地图上绘制一个基站。

public class GMapMarkerBS : GMapMarker
   {
       Bitmap myBitmap;  //存储要保存的图标信息
       public int ID;    //标记当前的类

public GMapMarkerBS(PointLatLng p,int thisID)
         : base(p)
      {
          myBitmap= (Bitmap)Bitmap.FromFile(Application.StartupPath + "\\Cursor\\BS_Large.png");
          ID = thisID;
          ToolTipText = "测试基站" + ID.ToString();
          ToolTipMode = MarkerTooltipMode.OnMouseOver;
      
          Size = myBitmap.Size;
          Offset = new System.Drawing.Point(-Size.Width / 2, -Size.Height / 2);
      
   
  
      }
      public GMapMarkerBS(PointLatLng p, Bitmap thisBitmap, int thisID)
          : base(p)
      {
          ID = thisID;
          ToolTipText = "测试基站" + ID.ToString();
          ToolTipMode = MarkerTooltipMode.OnMouseOver;
          myBitmap = thisBitmap;
         
          Size = myBitmap.Size;
          Offset = new System.Drawing.Point(-Size.Width / 2, -Size.Height / 2);

}

public override void OnRender(Graphics g)
      {
          g.DrawImage(myBitmap, new System.Drawing.Rectangle(LocalPosition.X, LocalPosition.Y, 80, 100));
         
      }
   }

两个构造函数,可以实现默认图标,和自定义图标,关键在于重载Onrender()函数,大伙一看就能看懂。

Size和Offset都是在基类Gmapmarker中定义的,其意义是当前图标的大小和偏移量。Size不设置,都可以在地图上绘图,但你却无法让它触发“点击”事件!这个要注意,它设置了在地图上有效的操作范围,而不是绘图大小。所谓偏移,应该是点击时与图标左上角之间的偏移。

如何在地图上绘制这个图标呢?

GMapMarkerBS tempMarker = new GMapMarkerBS(thisPosition, BSIDCounter);
        GISObjectOverlay.Markers.Add(tempMarker);

GISObjectOverlay是我建立的所谓图层,

GISObjectOverlay = new GMapOverlay(myGMapControl, "GISOverlay");

这样,就能在地图上绘制自定义图标的图形了。

(二)实现绘制多边形

实现多边形,并在地图上填充,还要实现缩放和移动,如果不继承GMAP内置的类,那么会累死的,好在GMAP提供了支持。

实现思路是这样的,用户选择多边形绘图工具后,先在临时绘图图层GISTempOverlay上画临时点,用自带的十字图标表示,然后双击完成一次完整的多边形绘图操作,把当前存储的临时点LIST表传给GMAP类。

private void MainMap_MouseDown(object sender, MouseEventArgs e)
        {

case GISObjectType.Polygon:

GISTempPoint.Add(MainMap.FromLocalToLatLng(e.X, e.Y));
                        GISTempOverlay.Markers.Add(tempMarker);
                        break;

}

上面代码实现了左键单击后,在地图上绘制临时点;

private void MainMap_MouseDoubleClick(object sender, MouseEventArgs e)
        {

case GISObjectType.Polygon:
                    if (GISTempPoint.Count < 3)
                    {
                        MessageBox.Show("未绘制包围图形");
                        break;
                    }
                    else
                    {
                        myGISObject.AddRouteObject(GISTempPoint, "Polygon");
                        GISTempOverlay.Markers.Clear();
                        GISTempPoint.Clear();
                    }
                    break;

}

AddRouteObject()函数是我自己写的一个路径类函数,代码如下:

public void AddRouteObject(List<PointLatLng> myPositionList,string name)
        {
            GISRouteObjectList.Add(new RouteObject(myPositionList,name,RouteIDCounter));
            GMap.NET.WindowsForms.GMapPolygon tempPolygon = new GMap.NET.WindowsForms.GMapPolygon(myPositionList, name);
            GISObjectOverlay.Polygons.Add(tempPolygon);
                  }

这样,就实现了多边形绘制。

(三)设计复杂贴图

图标是不能跟着地图放缩而放缩的,如果贴了一张图上去,岂不是没法放缩了?可以的。

可以把图片生成PNG,这样就有了透明度,新建一个图层GISPictOverlay专门存储贴图类型,重载gmapmarker得到GMapMarkerPict,添加变量zoom,

在OnRender()函数中这么写:

g.DrawImage(myBitmap, new System.Drawing.Rectangle(LocalPosition.X, LocalPosition.Y, myBitmap.Width*zoom, myBitmap.Height*zoom));

在类外部,当地图缩放等级改变时,修改本类的静态变量zoom。注意!这种方法,只能让你的图片随着地图的放缩而改变,但不是死死贴上去的...因为,地图的放缩等级每改变一个等级,貌似地图尺寸变化是2次方关系,但此处是线性的。具体怎么设置,我还得再研究一下,貌似在GMAP工程文件中提供了这个关系的说明。

当然,我们还要存储当前的所有地图上的数据,比如多边形,图标,贴图等等,可以自己设定数据结构,我在这方面懂得比较少,不敢拿来说了。 第一次在博客园写文章,加之本人是.NET菜鸟,看到网上没有GMAP绘图的问题,就拿自己开发的案例过来讨论一下,大侠们轻拍。还想弱弱问个问题,为什么GMAP这么大的开源工程,连像样的开发文档都没有,都让大家来摸索?欢迎讨论!

谷歌地图控件,通过扩展实现GMAP的自定义绘图系统相关推荐

  1. 可集成在XPage中的谷歌地图控件

    OpenNTF推荐项目"谷歌地图控件",可集成在XPage中,支持基于坐标和基于地址两种方式. ... 内容详见可集成在XPage中的谷歌地图控件

  2. (转)深入理解最强桌面地图控件GMAP.NET --- 原理篇

    前几篇介绍了一些国内地图的案例, 深入理解最强桌面地图控件GMAP.NET --- SOSO地图 深入理解最强桌面地图控件GMAP.NET --- 百度地图 我们以Google地图为例,这章介绍下地图 ...

  3. 深入理解最强桌面地图控件GMAP.NET --- SOSO地图

    转 http://www.cnblogs.com/enjoyeclipse/archive/2013/01/15/2859028.html 前三篇介绍了GMAP.NET的一些基本功能以及如何集成一个百 ...

  4. (转)深入理解最强桌面地图控件GMAP.NET --- SOSO地图

    前三篇介绍了GMAP.NET的一些基本功能以及如何集成一个百度地图. 深入理解最强桌面地图控件GMAP.NET --- 初识 深入理解最强桌面地图控件GMAP.NET --- 初用 深入理解最强桌面地 ...

  5. 深入理解最强桌面地图控件GMAP.NET --- 百度地图

    转 http://www.cnblogs.com/enjoyeclipse/archive/2013/01/14/2859026.html 前两篇介绍了GMAP.NET的一些基本功能和如何在自己的项目 ...

  6. 深入理解最强桌面地图控件GMAP.NET --- 原理篇

    转 http://www.cnblogs.com/enjoyeclipse/archive/2013/01/18/2865700.html 前几篇介绍了一些国内地图的案例, 深入理解最强桌面地图控件G ...

  7. WPF编程--地图控件GMap使用

    目录 ​编辑 1.环境 2. NuGet导入依赖 3.  添加MapControl类 4. 编辑MainView.xaml.cs 5. 编辑MainView.xaml 6. 启动验证 源码: http ...

  8. 深入理解最强桌面地图控件GMAP.NET ---高德地图

    前一篇介绍了GMAP.NET的理论基础,这篇介绍如何集成高德地图.高德地图自从为IOS6提供地图后,目前已经被大众所熟知了. 在我集成国内地图的经验来看,也是最符合墨卡托投影法的. 前面的相关文章链接 ...

  9. SAP UI5 应用开发教程之六十 - SAP UI5 地图控件的一些高级用法试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

最新文章

  1. 两条波浪线符号_四年级数学上册第二单元“线的认识”作业单(附带答案)
  2. 前端性能优化 —— 项目瘦身
  3. UIView自定义控件-Swfit
  4. ubantu18.04使用docker部署mysql5.7及在宿主机登录容器内mysql
  5. Rabbit寻宝记(1)
  6. python采用那种编程模式_使用Mixin设计模式进行Python编程的方法讲解
  7. 8-18-Exercise
  8. 中文简体字-繁体字转换 WEB 服务(源代码)
  9. setmonth_日期setMonth()方法以及JavaScript中的示例
  10. 正整数分组(51Nod-1007)
  11. Zepto 使用中的一些注意点
  12. IEEE ISO/IEC简介
  13. NameError: name 'reload' is not defined等python版本问题解决方案
  14. Exception in thread main java.lang.NoClassDef...
  15. 用vertx compose写链式操作
  16. 电脑预览,电脑怎么预览psd格式?
  17. html安装网卡驱动,教您怎么用驱动精灵安装网卡驱动
  18. 华为云鲲鹏云服务器介绍
  19. PC机并口、并口扩展卡使用EPP模式通信,ECP SPP等
  20. android手机通过wifi控制数码管,淫技:android无屏操作之adb操控wifi

热门文章

  1. GAN与NLP的讨论
  2. How to reduce Index size on disk?减少ES索引大小的一些小手段
  3. python 目录下的__init__.py
  4. python能做什么
  5. Redis学习和环境搭建
  6. SoundPool 音频播放 详解 示例
  7. rommon模式下给路由器灌入IOS
  8. C# 中实现单例模式
  9. 修改Hosts为何不生效,是DNS缓存?
  10. 让织梦CMS的后台编辑器支持优酷视频