免费视频|新人指南|投诉删帖|广告合作|地信网APP下载

查看: 2570|回复: 0
收起左侧

[技术交流] arcgis api for js入门开发系列三地图工具栏(含源代码)

[复制链接]

45

主题

8272

铜板

17

好友

高级工程师

Rank: 9Rank: 9Rank: 9

积分
1122
QQ
发表于 2016-11-4 08:47 | 显示全部楼层 |阅读模式
本帖最后由 sinna 于 2016-11-4 08:49 编辑

    上一篇实现了demo的地图加载展示,在上篇实现的基础上,新增了地图工具栏以及通用地图控件功能,比如地图框选缩放、地图漫游、清空、量算工具、地图导航控件、地图比例尺控件、地图鹰眼图等等,总共分为5个部分,截图如下:

     1.工具栏,在map.html页面引入工具栏实现需要的js文件      
  1. <script type="text/javascript" src="js/main/map.map2dPanel.js"></script>
复制代码
        然后在map.js文件中地图初始化函数load2DMap进行工具栏的js调用     
  1.     //显示地图工具栏
  2.     DCI.map2dTool.InitTool(map);
复制代码
        map2dPanel.js实现了地图工具栏所有的功能,谈谈实现核心部分功能的代码:
        (1)拉框放大:这个实现比较简单,利用拉框的矩形范围,直接设置地图的范围为拉框的范围即可               
  1. $("#zoomIn").click(function () {//地图拉框放大
  2.             map.setMapCursor("url('" + getRootPath() + "Content/images/index/cursor/zoomout.cur'),auto");//设置地图鼠标形状
  3.             DCI.map2dTool.drawtool.activate(esri.toolbars.Draw.EXTENT);//利用api的画工具draw来画矩形,获取矩形范围
  4.             DCI.map2dTool.drawExtent(null, function (geometry) {//draw工具画完的回调函数
  5.                 DCI.map2dTool.zoomOutByExtent(geometry);//获取回调函数的geometry(extent)范围
  6.             });
  7.         });

  8.       drawExtent: function (symbol, onDrawEnd) {
  9.                   DCI.map2dTool.onDrawEnd = onDrawEnd;
  10.       },
  11. //根据拉框范围放大
  12.     zoomInByExtent: function (geometry) {
  13.         DCI.map2dTool.map.setExtent(geometry.getExtent());//根据extent来进行地图缩放
  14.     }
复制代码
        (2)拉框缩小:这个跟拉框放大的原理是类似的,也是首先获取拉框的的矩形范围,但是不同的是,获取矩形范围之后跟地图当前的范围按一定的比例进行计算,构造一个新的范围extent,然后再进行地图的缩放        
  1. $("#zoomOut").click(function () {
  2.             map.setMapCursor("url('" + getRootPath() + "Content/images/index/cursor/zoomin.cur'),auto");
  3.             DCI.map2dTool.drawtool.activate(esri.toolbars.Draw.EXTENT);
  4.             DCI.map2dTool.drawExtent(null, function (geometry) {
  5.                 DCI.map2dTool.zoomInByExtent(geometry);
  6.             });
  7.         });
  8.       drawExtent: function (symbol, onDrawEnd) {
  9.                   DCI.map2dTool.onDrawEnd = onDrawEnd;
  10.       },
  11.     //根据拉框范围缩小
  12.     zoomOutByExtent: function (geometry) {
  13.         if (geometry.xmin != geometry.xmax && geometry.ymin != geometry.ymax) {//画矩形的范围没超出地图当前范围
  14.             var currExtent = DCI.map2dTool.map.extent;//获取地图的当前范围
  15.             var currWidth = Math.abs(currExtent.xmin - currExtent.xmax);//计算当前地图范围的宽度
  16.             var boxWidth = Math.abs(geometry.xmin - geometry.xmax);//计算拉框矩形的范围宽度
  17.             var widthFactor = currWidth / boxWidth;//计算两者的宽度的比率

  18.             var currHeight = Math.abs(currExtent.ymin - currExtent.ymax);//计算当前地图范围的高度
  19.             var boxHeight = Math.abs(geometry.ymin - geometry.ymax);//计算拉框矩形的范围高度
  20.             var heightFactor = currHeight / boxHeight;//计算两者的高度比率

  21.             if (widthFactor >= heightFactor) {
  22.                 currExtent = currExtent.expand(widthFactor);
  23.             } else {
  24.                 currExtent = currExtent.expand(heightFactor);
  25.             }
  26.             DCI.map2dTool.map.setExtent(currExtent);
  27.         } else {//超出地图当前范围时候,直接地图缩小一级
  28.             if (parseInt(DCI.map2dTool.map.getLevel()) > 0) {
  29.                 DCI.map2dTool.map.setLevel(parseInt(DCI.map2dTool.map.getLevel()) - 1);
  30.             }
  31.         }
  32.     }
复制代码
        (3)量算工具,这个部分详细的参照:arcgis api for js共享干货系列之一自写算法实现地图量算工具
         
     2.Navigation控件,这个部分详细的参照:arcgis api for js共享干货系列之二自定义Navigation控件样式风格
     3.地图比例尺控件,这个实现比较简单,直接调用api封装好的Scalebar
  1. //加载比例尺
  2.     var scalebar = new esri.dijit.Scalebar({
  3.         map: map,//地图对象
  4.         attachTo: "bottom-left",//控件的位置,左下角
  5.         scalebarStyle: "ruler",//line 比例尺样式类型
  6.         scalebarUnit: "metric"//显示地图的单位,这里是km
  7.     });
复制代码
        其他的具体属性请参照api:https://developers.arcgis.com/javascript/3/jsapi/scalebar-amd.html
     4.地图显示坐标,这个实现利用地图移动onMouseMove以及拖拽onMouseDrag事件,通过监听事件动态获取地图当前的鼠标坐标值     
  1. //加载地图显示坐标
  2.     showCoordinates(map);

  3. /**
  4. * 显示地图坐标
  5. */
  6. function showCoordinates(map) {
  7.     var coordinatesDiv = document.getElementById("map_coordinates");//js通过id获取div
  8.     if (coordinatesDiv) {//div存在就显示
  9.         coordinatesDiv.style.display = "block";
  10.     }
  11.     else {//不存在情况下,动态创建指定id的div
  12.         var _divID_coordinates = "map_coordinates";//div的id
  13.         coordinatesDiv = document.createElement("div");//动态创建div
  14.         coordinatesDiv.id = _divID_coordinates;//id
  15.         coordinatesDiv.className = "map-coordinates";//div的css样式
  16.         coordinatesDiv.innerHTML = "";//默认div填充为空
  17.         document.getElementById("map").appendChild(coordinatesDiv);//动态创建的div放在地图map容器div里面
  18.         dojo.connect(map, "onMouseMove", showCoords);//监听地图的移动事件
  19.         dojo.connect(map, "onMouseDrag", showCoords);
  20.         function showCoords(evt) {
  21.             evt = evt ? evt : (window.event ? window.event : null);
  22.             var mp = evt.mapPoint;//获取鼠标当前位置的地图坐标值
  23.             coordinatesDiv.innerHTML = "<span id='cd_label' style='font-size:13px;text-align:center;font-family:微软雅黑;'>" + "横坐标:" + mp.x.toFixed(3) + " 纵坐标:" + mp.y.toFixed(3) + "</span>";
  24.         }
  25.     }
  26. }
复制代码
       其他的具体属性请参照api:https://developers.arcgis.com/javascript/3/jsapi/overviewmap-amd.html
       最后,提供源代码下载:http://pan.baidu.com/s/1c2yvl8c

GIS作品:百度搜索:GIS之家(https://shop116521643.taobao.com/shop/view_shop.htm);
QQ兴趣部落GIS技术交流:gis之家(http://buluo.qq.com/p/barindex.html?bid=327395);
GIS毕业设计&项目承接群:238339408;
GIS技术交流群:432512093

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
快速回复 返回顶部 返回列表