基于MapWinGis的开发探索(三)--改善缩放、渲染、显示文本

此次开发将界面改成换成类型Office2007的,主要继承DevComponents。 地图底层现在只添加一些地理图层如道路、河流、路名等,至于有实际应用的图层后期加入,这些ShapeFile文件从CAD图纸的dxf格式转换而来。

(一)图层窗口的实现

MapWinGis本身的图层窗口 控件legend强大,源代码相当多,而且包含了很多方法,此次图层窗口的实现主要采用树形控件,将地理图层的图层ID、图层名加载绑定。
  1. /** <summary>
  2.         /// 添加图层
  3.         /// </summary>
  4.         private void AddLayer()
  5.         {
  6.             //加载前清除树的节点
  7.             tvLayer.Nodes.Clear();
  8.             //获取所有图层
  9.             string[] files = MapCommon.LoadAllShpFile(Environment.CurrentDirectory + @"\mapfile");
  10.             if (files != null && files.Length > 0)
  11.             {
  12.                 for (int i=0; i <files.Length ; i++)
  13.                 {
  14.                     Shapefile shpFile = new Shapefile();
  15.                     bool bOpen= shpFile.Open(files, call);
  16.                     int layerHandle= axMap1.AddLayer(shpFile, true);
  17.                     DevComponents.AdvTree.Node node = new DevComponents.AdvTree.Node();
  18.                     node.Text =LayerNames.En2Cn(MapCommon.GetFileName(files));
  19.                     node.Tag = layerHandle;
  20.                     node.Image = Resources.Pic02;
  21.                     tvLayer.Nodes.Add(node);
  22.                     if (node.Text == LayerNames.RoadName_CN)
  23.                     {//将路名的文本显示处理
  24.                         ShowLable.GetLable(shpFile, layerHandle, axMap1);
  25.                     }
  26.                 }
  27.                 map = axMap1;
  28.             }
  29.            
  30.             //加载鼠标滚轮缩放事件
  31.             this.MouseWheel+=new MouseEventHandler(Map_MouseWheel);
  32.         }
    基于MapWinGis的开发探索(四)——图层窗口、地名检索的实现_21746
(二)地名检索的实现

地名检索实现主要是遍历每个图层,寻找地名图层的dbf文件,遍历该文件的存放地名的那一列,将符合要求的地名检索出来,绑定在树形控件上。
  1.         /** <summary>
  2.         /// 模糊查找地名
  3.         /// </summary>
  4.         /// <param name="strWhere"></param>
  5.         private void Query(string strWhere)
  6.         {
  7.             //清空树节点
  8.             tvPlace.Nodes.Clear();
  9.             for (int i = 0; i < Map.NumLayers; i++)
  10.             {
  11.                 MapWinGIS.Shapefile shpFile = (MapWinGIS.Shapefile)Map.get_GetObject(i);
  12.                 if (System.IO.Path.GetFileNameWithoutExtension(shpFile.Filename) == LayerNames.RoadName)
  13.                 {//获取路名的ShapeFile文件
  14.                     for (int j = 0; j < shpFile.NumShapes; j++)
  15.                     {
  16.                         object obj = shpFile.get_CellValue(shpFile.NumFields - 1, j);
  17.                         if (obj != null && obj.ToString().Contains(strWhere))
  18.                         {//判断地名是否存在
  19.                             Shape shp = shpFile.get_Shape(j);
  20.                             DevComponents.AdvTree.Node tn = new DevComponents.AdvTree.Node();
  21.                             tn.Text = obj.ToString();
  22.                             tn.Tag = shp.SerializeToString();
  23.                             tn.Image = Resources.Pic03;
  24.                             tvPlace.Nodes.Add(tn);
  25.                         }
  26.                     }
  27.                 }
  28.             }
  29.         }
复制代码
_21747
map002.JPG(21.99 K)
11/5/2009 9:12:32 PM


双击树形控件的节点,将地图定位在该地名上。这里主要涉及到地图定位算法的问题:先获取绑定在树形控件的Shape对象的属性,得到ShapeString 属性,然后获得ShapeString里的Extents范围,增大Extents范围,将地图Extents范围设置成那个即可定位。
  1. /** <summary>
  2.         /// 定位
  3.         /// </summary>
  4.         /// <param name="shapeString"></param>
  5.         public void GoTo(string shapeString)
  6.         {
  7.             Shape shape = new MapWinGIS.ShapeClass();
  8.             if (shape.CreateFromString(shapeString) == true)
  9.             {
  10.                 SetMapBounds(shape.Extents.xMax, shape.Extents.yMax, shape.Extents.xMin, shape.Extents.yMin);
  11.             }
  12.         }

  13.         /** <summary>
  14.         /// 设置地图边界
  15.         /// </summary>
  16.         /// <param name="maxX"></param>
  17.         /// <param name="maxY"></param>
  18.         /// <param name="minX"></param>
  19.         /// <param name="minY"></param>
  20.         public void SetMapBounds(double maxX, double maxY, double minX, double minY)
  21.         {
  22.             maxX = maxX + 100;
  23.             minX = minX - 100;

  24.             maxY = maxY + 100;
  25.             minY = minY - 100;

  26.             MapWinGIS.Extents tExts = new Extents();
  27.             tExts.SetBounds(minX, minY, 0, maxX, maxY, 0);
  28.             GetMap().Extents = tExts;
  29.         }
复制代码
定位的结果如下:

_21748
map003.JPG(89.42 K)
11/5/2009 9:12:32 PM

_21749
map004.JPG(88.49 K)
11/5/2009 9:12:32 PM
(文/ ~~~呆呆~~~~
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值