arcgis server开发地图问题—对象的多态性?

来源:互联网 发布:淘宝贷款100万还不上 编辑:程序博客网 时间:2024/05/22 06:51
   drawtb = new esri.toolbars.Draw(map);
   measuretb=new esri.toolbars.Draw(map);      <!-- 绘制图形 -->  dojo.connect(drawtb,"onDrawEnd",addToMap);  dojo.connect(measuretb,"onDrawEnd",measure);                      <!-- 将用户绘制的几何对象加入到地图中 -->    function addToMap(geometry) {     //map.graphics.clear(); 保留前面绘制          var symbol;                   switch (geometry.type) {              case "point":                  symbol = markerSymbol;                  break;                      case "polyline":                  symbol = lineSymbol;                  break;              case "polygon":                  symbol = fillSymbol;                  break;          }          var graphic = new esri.Graphic(geometry, symbol);          map.graphics.add(graphic);      }      <!-- 将用户绘制的线和面进行量测加入到地图中 -->
 function measure(geometry) {map.graphics.clear(); if(geometry.type=="polyline"){var lengthParams = new esri.tasks.LengthsParameters();                              map.graphics.clear();                            //将图形添加到地图中       lengthParams.polylines = [geometry];    lengthParams.lengthUnit = esri.tasks.GeometryService.UNIT_METER;     lengthParams.geodesic = true;        geometryService.lengths(lengthParams);//调用几何服务的函数处理       var graphic = map.graphics.add(new esri.Graphic(geometry, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([255, 0, 0]), 2)));}   else{  var graphic = map.graphics.add(new esri.Graphic(geometry, new esri.symbol.SimpleFillSymbol()));                              map.graphics.clear();                                                        var areasAndLengthParams = new esri.tasks.AreasAndLengthsParameters();                             areasAndLengthParams.lengthUnit = esri.tasks.GeometryService.UNIT_FOOT;                             areasAndLengthParams.areaUnit = esri.tasks.GeometryService.UNIT_ACRES;                             geometryService.simplify([geometry], function(simplifiedGeometries) {                             areasAndLengthParams.polygons = simplifiedGeometries;                             geometryService.areasAndLengths(areasAndLengthParams);                             });}   }
...
 
<div id="draw" dojoType="dijit.form.DropDownButton" data-dojo-props="iconClass:'drawIcon'" >                    <!-- <span>图形绘制</span> -->                    <div dojoType="dijit.Menu">                        <div dojoType="dijit.MenuItem" label="点" ><script type="dojo/method" event="onClick" args="evt">        drawtb.activate(esri.toolbars.Draw.POINT);        </script></div>                        <div dojoType="dijit.MenuItem" label="线" ><script type="dojo/method" event="onClick" args="evt">        drawtb.activate(esri.toolbars.Draw.POLYLINE);        </script></div>                        <div dojoType="dijit.MenuItem" label="面" ><script type="dojo/method" event="onClick" args="evt">        drawtb.activate(esri.toolbars.Draw.POLYGON);        </script></div><div dojoType="dijit.MenuItem" label="返回漫游状态"><script type="dojo/method" event="onClick" args="evt">                            //返回标准drawtb.deactivate(); navToolbar.activate(esri.toolbars.Navigation.PAN);        </script></div>        <div dojoType="dijit.MenuItem" label="清除"><script type="dojo/method" event="onClick" args="evt">        map.graphics.clear();                          //返回标准drawtb.deactivate();        </script></div>                    </div>                </div>        <div dojoType="dijit.Tooltip" connectId="draw" showDelay="0" label="图形绘制" position="below"></div>                     <div id="measure" dojoType="dijit.form.DropDownButton" data-dojo-props="iconClass:'measureIcon'" >                    <!-- <span>量测</span> -->                    <div dojoType="dijit.Menu">                        <div dojoType="dijit.MenuItem" label="距离"><script type="dojo/method" event="onClick" args="evt">  measuretb.activate(esri.toolbars.Draw.FREEHAND_POLYLINE); dojo.connect(geometryService, "onLengthsComplete", function(result){dojo.byId("distance").innerHTML = dojo.number.format(result.lengths[0] / 1000) + " 千米";                             dijit.byId("distancedialog").show();                           });         </script></div>                        <div dojoType="dijit.MenuItem" label="面积" ><script type="dojo/method" event="onClick" args="evt">       measuretb.activate(esri.toolbars.Draw.FREEHAND_POLYGON); dojo.connect(geometryService, "onAreasAndLengthsComplete", function(result){dojo.byId("area").innerHTML = result.areas[0].toFixed(3) + " acres";                             dojo.byId("length").innerHTML = result.lengths[0].toFixed(3) + " feet";                              dijit.byId("areadialog").show();                           });         </script></div><div dojoType="dijit.MenuItem" label="返回漫游状态"><script type="dojo/method" event="onClick" args="evt">                                                    //返回标准measuretb.deactivate(); navToolbar.activate(esri.toolbars.Navigation.PAN);        </script></div>        <div dojoType="dijit.MenuItem" label="清除"><script type="dojo/method" event="onClick" args="evt">        map.graphics.clear();                          //返回标准  measuretb.deactivate();        </script></div>                    </div>                </div>        <div dojoType="dijit.Tooltip" connectId="measure" showDelay="0" label="量测(请耐心等待结果)" position="below"></div>

一直想把用户绘制图形功能和用户绘制线和面的量测功能分开,开始的时候发现定义一个drawtb总是不行,两个功能之间相互出现逻辑错误,然后定义又定义了measuretb,这两个都是new esri.toolbars.Draw(map)对象,我认为是对象的多态性,根据不同的选择对象在dojo.connect(drawtb,"onDrawEnd",addToMap);和dojo.connect(measuretb,"onDrawEnd",measure)选择了不同的调用方法。希望有人能详细解释一下!

原创粉丝点击