zoukankan      html  css  js  c++  java
  • 实现绘制图形的ToolBar

      给地图添加绘制图形的ToolBar还是有必要的,比较人性化的功能。图形的样式可以自己定制,也提供了朴实的默认样式。对 dojo 不太懂,出现了许许多多问题,真是蛋疼的一天啊。令人惊喜的是 ArcGis 不仅提供了 point,line,mulitpoint,polyline,polygon 等基本图形,还有circle,trinangle,ellipse这样的特殊类型。

      一.首先我们需要设置各要素对象的样式(以最基本的Symbol为例):

    var markerSymbol = new esri.symbol.SimpleMarkerSymbol();
    markerSymbol.setColor(new esri.Color("#FF8F8F"));
    
    var lineSymbol = new esri.symbol.SimpleLineSymbol();
    lineSymbol.setColor(new esri.Color([255, 143, 143, 1]));
    lineSymbol.setWidth(2);
    
    var fillSymbol = new esri.symbol.PictureFillSymbol("img/fill.png",
    new esri.symbol.SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID, new Color('#000'), 1),42, 42);

      二.在地图加载后,初始化toolbar工具:

    <div id="info">
      <div>Tool Bar</div>
      <button id="Point">Point</button>
      <button id="Multipoint">Multipoint</button>
      <button id="Line">Line</button>
      <button id="Polyline">Polyline</button>
      <button id="FreehandPolyline">Freehand Polyline</button>
      <button id="Triangle">Triangle</button>
      <button id="Extent">Rectangle</button>
      <button id="Circle">Circle</button>
      <button id="Ellipse">Ellipse</button>
      <button id="Polygon">Polygon</button>
      <button id="FreehandPolygon">Freehand Polygon</button>
    </div>

      不知道为什么dojo提供的dojo.on注册事件的方法我无法使用,例子里是用on(dom.byId("info"), "click", function(evt) {}定义事件的。

    var map,tb;
    map.on("load", initToolbar);
    ...
    function initToolbar() {
        tb = new esri.toolbars.Draw(map);
        tb.on("draw-end", addGraphic);
    
        document.getElementById("info").onclick = function (evt) {
        if (evt.target.id == "") {return;}
        var tool = evt.target.id.toLowerCase();
        map.disableMapNavigation();
        tb.activate(tool);
       }
    }

      三.toolbar是根据它active方法中的参数决定绘制类型的。

    function addGraphic(evt) {
      tb.deactivate(); 
      map.enableMapNavigation();
      var symbol;
      if ( evt.geometry.type == "point" || evt.geometry.type == "multipoint")
      {
        symbol = markerSymbol;
      } else if ( evt.geometry.type == "line" || evt.geometry.type == "polyline")
      {
        symbol = lineSymbol;
      }
      else
      {
        symbol = fillSymbol;
      }
      map.graphics.add(new Graphic(evt.geometry, symbol));
    }

    效果:

                                      

    实例链接:https://developers.arcgis.com/javascript/jssamples/graphics_add.html

    我还发现了个错误,在回传按钮id时,点击 id = "info" 的<div>时,实例中仍然以 evt.target.id 作为判断依据是错误的,这时的返回值为"";

  • 相关阅读:
    第1章:路线图
    第0章:战胜恐惧和懊悔
    c++ 变量 定义 声明
    两个无符号数相减 可以得到负数
    c++ cast operator(类型转换操作符)
    C++中static 的使用方式,以及与c中的static的区别
    重载overload 重写override 重定义redefining
    用到位运算的题目
    C++ 虚函数表解析
    虚函数 动态绑定 实现方式是:虚函数表
  • 原文地址:https://www.cnblogs.com/qdhotel/p/3876242.html
Copyright © 2011-2022 走看看