Arcgis Javascript API 开发笔记

时间:2014-04-02 11:32:52   收藏:0   阅读:3183

JS API3.4的要求

à(1)  IE9或以上版本

否则dijit1.8.3不匹配

 

1.如何发布ArcgisJavascript API应用

0.准备工作:

       (1).有web应用:

      

 

 

 

 

       (2).有jsapi开发包

 

 

 

 

 

 

1.将jsapi目录拷贝到自己的Web应用目录下

      

2.在页面中添加引用(2个css,1个js)

<link rel="stylesheet" type="text/css" href="jsapi/js/dojo/dijit/themes/claro/claro.css">

<link rel="stylesheet" href="jsapi/js/esri/css/esri.css">

<script src="jsapi/init.js"></script>

 

3.在页面中添加加载地图的脚本

dojo.ready(function(){  

   mapObj=new esri.Map("map");

   var districtLayer = new esri.layers.ArcGISDynamicMapServiceLayer(“http://localhost:6080/arcgis/rest/services/TF/baseMap/MapServer”, { id: "districLayer"});

   mapObj.addLayer(districtLayer);  

});

 

 

 

 

 

 

 

 

 

 

 

3.发布Web应用

web应用发布的地址是:

  localost/webLab/layerOper

 

 

 

 

4.写出访问jsapi/js/dojo/dojo/dojo.js的url

 

http://localhost/webLab/layerOper/jsapi/js/dojo/dojo/dojo.js

 

在浏览器中检查

 

 

确认地址正确后,截取url一段

localhost/webLab/layerOper/jsapi/js/dojo/dojo

 

5.将Url片段替换init.js中的baseUrl:

在init.js中搜索 baseUrl:

baseUrl:(location.protocol === ‘file:‘ ? ‘http:‘ : location.protocol) + ‘//‘ + "[HOSTNAME_AND_PATH_TO_JSAPI]js/dojo/dojo"

 

将localhost/webLab/layerOper/jsapi/js/dojo/dojo替换掉

 [HOSTNAME_AND_PATH_TO_JSAPI]js/dojo/dojo

 

保存init.js并退出。

 

5.将Url片段替换dojo.js的baseUrl:

对dojo/dojo/dojo.js施加同样的操作。

 

 

6.发布成功后,可以浏览地图了

 

 

 

 

1. 如何部署本地sdk

 

什么是sdk?

sdk=tutorials+API Referenc+Samples

 

 

 

如何部署sdk?

(1)下载sdk,解压得到目录arcgis_js_v37_sdk

(2)将arcgis_js_v37_sdk\ arcgis_js_api\sdk目录拷贝到tomcat Webapp目录下

(3)startUp tomcat, 访问localhost/sdk

 

 

接下来存在的问题:

拔掉网线,会发现reference页面,无法向下滚动. 解决方式:

(1)鼠标左下向下拉动

 

 

发布GIS应用常见问题

 

Init.js 和 dojo.js编码

  默认使用的编码是 ANSI

  不要改变编码,否则 发布后 加载init.js出问题

 

<script src=”Init.js”></script>提示ieDefineFailed

 

 

原因:页面中引用了purl.js和xdate.js,冲突

 

服务端自带的服务加载脚本

使用方法:

-1将两个css指向本地服务的css

2-将init.js指向本地服务的init.js

 

 

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<meta http-equiv="X-UA-Compatible" content="IE=7" />

<title>ArcGIS JavaScript API: TF/newmap</title>

<style type="text/css"> @import "http://serverapi.arcgisonline.com/jsapi/arcgis/2.6/js/dojo/dijit/themes/tundra/tundra.css";

@import "/arcgis/rest/static/jsapi.css";

</style> <script type="text/javascript"> var djConfig = { parseOnLoad: true };

</script> <script type="text/javascript" src="http://serverapi.arcgisonline.com/jsapi/arcgis/?v=2.6"> </script> <script type="text/javascript"> dojo.require("dijit.layout.BorderContainer");

dojo.require("dijit.layout.ContentPane");

dojo.require("esri.map");

var map;

function init() {

    map = new esri.Map("map");

          var layer = new esri.layers.ArcGISDynamicMapServiceLayer("http://10.254.53.85:6080/arcgis/rest/services/TF/newmap/MapServer");

          map.addLayer(layer);

    var resizeTimer;

    dojo.connect(map, ‘onLoad‘, function(theMap) {

      dojo.connect(dijit.byId(‘map‘), ‘resize‘, function() {

        clearTimeout(resizeTimer);

        resizeTimer = setTimeout(function() {

          map.resize();

          map.reposition();

         }, 500);

       });

     });

    }

dojo.addOnLoad(init);

</script> </head>

<body class="tundra">

 <div dojotype="dijit.layout.BorderContainer" design="headline" gutters="true" style="width: 100%; height: 100%; margin: 0;">

   <div dojotype="dijit.layout.ContentPane" region="top" id="navtable">

<div style="float:left;" id="breadcrumbs">ArcGIS JavaScript API: TF/newmap</div>

<div style="float:right;" id="help">

Built using the <a href="http://help.arcgis.com/en/webapi/javascript/arcgis/">ArcGIS JavaScript API</a>

</div> </div> <div id="map" dojotype="dijit.layout.ContentPane" region="center"> </div> </div> </body>

</html>

2. 图层操作(layers)

      

 

Prerequirement:

必须添加的引用:

  <link rel="stylesheet" type="text/css" href="../gis/jsapi/3.4/js/dojo/dijit/themes/claro/claro.css"/><!--GISCSS-->

        <link rel="stylesheet" href="../gis/jsapi/3.4/js/esri/css/esri.css"/>

 

   <script type="text/javascript" src="../gis/jsapi/3.4/init.js" charset="utf-8"></script><!--GISAPI-->

        <script type="text/javascript">    var dojoConfig = { parseOnLoad: true };</script>

 

 

 

 

关键:4句。dojo.require(“esri.map”);

var map=new esri.map(“map”);

var layer=new esri.layer.DynamicLayer(“REST Service URL”)

map.addlaer(layer)

详细:参见1.

图层对象

矢量图:ArcGISDynamicMapServiceLayer

影像图:ArcGISImageServiceLayer

GraphicsLayer

 

….

 

加载矢量图(mxd)

关键:esri.layers.ArcGISDynamicMapServiceLayer

     map.addLayer

 

var districtLayer = new esri.layers.ArcGISDynamicMapServiceLayer(gSettings.serviceUrl.districtMapUrl, { id: "baseMapLayer" }); mapAppObj.map.addLayer(districtLayer);

 

//url:

http://10.254.53.85:6080/arcgis/rest/services/TF/baseMap/MapServer

 

 

加载影像图层

keyWord:esri.layers.ArcGISImageServiceLayer

 

 

var imageLayer = new esri.layers.ArcGISImageServiceLayer(gSettings.serviceUrl.imageServiceUrl, { id: "baseMapLayer" });

                   mapAppObj.map.addLayer(imageLayer);

               

 

备注:影像图层有两种方式

   (1)在arccatLog中,右键点击,share as imageService.如果这样,使用ArcGISImageServiceLayer加载影像

   (2)在arcMap中,share as Service.如果这样,使用ArcGISDynamicMapService加载。

 

加载GraphicsLayer

//创建graphicsLayer

var graphicLines=new esri.layers.GraphicsLayer();

var graphicLines=new esri.layers.GraphicsLayer({id:”graFun”});

 

//添加到地图

map.addLayer(graphicLines)

 

//查询line图层,获取feature

var queryTask = new esri.tasks.QueryTask(getQueryUrl(1));

         var query = new esri.tasks.Query();

         query.outSpatialReference = gSettings.spatialReference;

         query.returnGeometry = true;

         query.outFields = ["*"];

         query.where = "1=1";

         var tempAr = [queryTask.execute(query)];

         var deferList = new dojo.DeferredList(tempAr);

        

deferList.then(function (results) {

if (results[0][0] == false || results[0][1].features.length == 0) {

                console.log("获取线路图层失败,请检查GIS服务");

                 return;

             }

console.log("graphicLines get,count:"+results[0][1].features.length);

             var lineFeatures = results[0][1].features;

 

  //从feature生成graphic

for (var i = 0; i <= lineFeatures.length - 1; i++) {

   var lineName = lineFeatures[i].attributes.KEY_NAME;

var lineWidth = 4;

var lineSymbol = new esri.symbol.SimpleLineSymbol().setColor(new dojo.Color([255,255,0])).setWidth(lineWidth);

 

 //生成lineGraphic并放入graphicsLayer

_this.graphicLines.add(new esri.Graphic(lineFeatures[i].geometry, lineSymbol, lineFeatures[i].attributes, null));

}

 

GraphicsLayer添Graphic(点、线、面)

前提:feature创建Graphic.

如果无feature,请参考从坐标生成feature.

 

步骤:为feature设置symbol

关键句: var gra=new esri.Graphic(feature,symbol,attributes,infoTemplate);

       graphicsLayer.add(gra);

 

备注:-1.graphic的feature是传址引用。

-2.如果需要从坐标生成feature,参考feature操作。

 

设置点symbol,生成 graphic

 

var graphicLayer=new esri.layers.GraphicsLayer();

 

//方法1

feature.setSymbol(new esri.symbol.PictureMarkerSymbol(“start.png”, 21, 21));

feature.setInfoTemplate("起点信息", "${NAME}");

graphicLayer.add(feature);

 

 

//方法2

var pointGra=new esri.Graphic(feature,symbol,attributes,infoTemplate);

graphicLayer.add(pointGra);

 

备注:创建graphic,feature是必须的.

必须有symbol才能显示.

attributes,可选。

infoTemplate,点击graphic弹出的信息窗体,可选.

 

 

 

设置线symbol,生成 graphic

var graphicLayer=new esri.layers.GraphicsLayer();

//方法1

var lineSymbol = new esri.symbol.SimpleLineSymbol().setColor(new dojo.Color([255,255,0])).setWidth(4);

 

var lineGra=new esri.Graphic(linefeature,lineSymbol,null,null);

graphicLayer.add(lineGra);

 

//方法2

var lineSymbol = new esri.symbol.SimpleLineSymbol().setColor(new dojo.Color([255,255,0])).setWidth(4);

linefeature.setSymbol(lineSymbol);

 

 

graphicLayer.add(linefeature);

 

 

 

 

 

 

 

 

 

 

 

 

设置面symbol,生成graphic

var ringPolygons=new esri.layers.GraphicsLayer();

 

//方法1:

polygonFeature.setSymbol(new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_SOLID, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_DASHDOT, new dojo.Color([255, 0, 0]), 2), new dojo.Color(colors.Yellow)));

 

graphicsLayer.add(polygonFeature);

 

方法2:

var graPolygon=new esri.Graphic(polygonFeature,symbol,null,null)

graphicsLayer.add(graPolygon);

 

加载自定义切片图层

 

参考 reference, Layers->Creating a custom tiled layer type

 

 

 

 

举例:

 

删除图层

关键:map.removeLayer(map.getLayer(id));

 

var targetLayer=mapAppObj.map.getLayer("baseMapLayer");

mapAppObj.map.removeLayer(targetLayer);

 

 

方法2:

var graFun=new esri.layers.GraphicsLayer();

map.addLayer(graFun);

 map.removeLayer(graFun)

图层显/隐

关键句:map.getLayer(id).show();

        map.getLayer(id).hide();

 

mapAppObj.map.getLayer("baseMapLayer").show()

mapAppObj.map.getLayer("baseMapLayer").hide()

               

设置图层可见scale

说明:设置图层可见比例尺。

 

参数:

minScale-最小比例尺-再远就看不见;minScale设置为0,则在无穷远也显示

  maxScale-最大比例尺-再近就看不见;maxScale设置为0,在无穷近也显示

 

关键句:

       Map.getLayer(“id”).setScaleRange(minScale,maxScale);

 

举例:

   Map.getLayer(“baseMapLayer”).setScaleRange(1155600,0)

   Map.getLayer(“baseMapLayer”).setScaleRange(800,0)

 

 

备注:

tileMapService中控制maxLevel和minLevel,

map加载 dynamicMapService, 那么dynamicMap的scale也会被限制.

设置图层透明度

试用图层:

 imageLayer,dynamicMapLayer,graphicsLayer,etc…

 

方法1:创建图层时设置

  var stationLayer = new esri.layers.ArcGISDynamicMapServiceLayer("http://10.254.53.85:6080/arcgis/rest/services/TF/newmap/MapServer", { "opacity": 0.5 });

 

map.addLayer(stationLayer);

 

方法2:

layer.setOpacity(0.5);

 

应用:

通过JqueryUI 滚动条控制透明度;

   $(".testScroll").slider(

         {

            max:10,//最右侧值           

            value:10,//初始值

            orientation:"horizonal",//朝向

            slide: function(event, ui) {//滑动回调函数

            var value=ui.value;

            var type=event.target.getAttribute("data");

            var percent=(value/$(event.target).slider("option","max")).toFixed(1);

            var targetLayer=mapObj.getLayer(type);

            if(targetLayer==null){return;}

            targetLayer.setOpacity(percent);

            return;

         }

         });

 

 

 

 

 

 

 

 

图层顺序

dynamicLayer,imageLayer,tileLayer之间切换

引用:jquery-ui.js

 

前端:

<ul id="layerController" class="operUI">

<li class="layerItem" data="imageLayer">

   <div class="layerItemFirstRow"><div class="layerCb operUI layerOn" title="显隐图层" data="imageLayer"></div><div class="layerText" title="拖拽,改变图层顺序">影像图</div></div>

   <div class="testScroll" data="imageLayer" title="改变影像图透明度"></div>

</li>

<li class="layerItem" data="districtLayer">

<div class="layerCb operUI layerOn" data="districtLayer" title="显隐图层"></div><div class="layerText" title="拖拽,改变图层顺序">行政图</div>

      <div class="testScroll" data="districtLayer" title="改变行政图透明度"></div>

</li>

<li class="layerItem" data="titleLayer">

   <div class="layerCb operUI layerOn" data="tileLayer" title="显隐图层"></div><div class="layerText" title="拖拽,改变图层顺序">百度图</div>

   <div class="testScroll" data="titleLayer" title="改变百度图透明度"></div>

</li>

</ul>

js:

 

   //拖拽,改变图层顺序

   //拖拽,改变图层顺序

   $("#layerController").sortable({

      stop:function(event,ui){

         console.log("layerController.stop is triggered");

         var layerSortArr=[];

         var itemCount=$(".layerItem").length;

         $(".layerItem").each(function(i,item){

            var tempObj={layer:mapObj.getLayer(item.getAttribute("data")),index:itemCount-1-i};

            layerSortArr.push(tempObj);

         });

         resortMapLayers(layerSortArr);//重排序图层        

      }

   });

 

 

//重排序图层

//obj,Array[{layer:,index},{layer:,index}];

function resortMapLayers(obj){

   console.log("resortMapLayers is triggered");  

   var tempStr="[";  

   for(var i=0;i<=obj.length-1;i++){          

      if(obj[i].layer!=null){

         tempStr+="{id:"+obj[i].layer.id+",index:"+obj[i].index+"},";

         mapObj.reorderLayer(obj[i].layer,obj[i].index);//index越大,则优先级越高

      }    

   }

   tempStr+="]";

   console.log(tempStr);

}

 

 

常见问题

添加图层的步骤?

1.添加li标签到ul中;

 2.将li下 所有data改成图层的id;

dynamicLayer内部layers切换

背景:dynamicMapService 包含两个图层station,line

   MapServer/0,station

   MapServer/1,line

显示效果:站在线上。

目标:jsAPI,让站在线下。

 

 

mapObj.getLayer("themeLayer").setDynamicLayerInfos

 

 

获取原始DynamicLayerInfos

var firstLayerInfo=mapObj.getLayer("themeLayer").createDynamicLayerInfosFromLayerInfos();

 

 

设置DynamicLayerInfos

setDynamicLayerInfos(dynamicLayerInfos, doNotRefresh)

 

//code snippets

var firstLayerInfo=mapObj.getLayer("themeLayer").createDynamicLayerInfosFromLayerInfos();

var newOrder=[firstLayerInfo[2],firstLayerInfo[1],firstLayerInfo[0]];

mapObj.getLayer("themeLayer").setDynamicLayerInfos(newOrder,false);

 

变更DynamicLayerInfo.id

背景:.id决定在上还是在下,0在最上,越小越下

 

 

图层事件

graphicsLayer-onMouseOver

 

描述:mouseOver graphic时,显示属性信息

总结:map.infoWindow.show(map.toScreenPoint(evt.mapPoint));

 

   if(equipMouseOverHandler==null){           

        equipMouseOverHandler=dojo.connect(equipmentGraphics,"onMouseOver",function(evt){           

            console.log("equipMouseOver triggered");         

            evt.graphic.setSymbol(highlightSymbol);

            mapAppObj.map.infoWindow.setTitle("设备类型:"+evt.graphic.attributes.type);

            mapAppObj.map.infoWindow.setContent("设备名称:"+evt.graphic.attributes.NAME);         

            //x方向偏小

            mapAppObj.map.infoWindow.show(mapAppObj.map.toScreen(evt.mapPoint));

         });

         console.log("equipMouseOver binded");

      }

graphicsLayer点击,显示属性信息框

 

 

说明:graphicsLayer={graphic};

esri.Graphic对象

       graphic.setInfoTemplate(infoTemplate).点击时会则弹出属性窗口。

      无需绑定graphic.onclick.

      

var infoTemplate = new esri.InfoTemplate("Attributes", "<tr>State Name: <td>${STATE_NAME}
  </tr></td><br><tr>Population:<td>${Pop2001}</tr></td>");

 

graphic.setInfoTemplate(infoTemplate);

 

 

其它细节

map.graphics 和GraphicsLayer

 

 

map.graphics:

map.graphcis对象:map对象默认的一层graphicsLayer.

//map.graphics=GraphicsLayer of a map;

//map.graphics.graphics  = all the graphics of map.graphics

 

graphicsLayer:

esri.layers.GraphicsLayer

={graA,graB,….};

备注:graEle的geometry type可以是任意的。即,允许同时存放lineGra,pointGra,

sectionGra

 

 

 

3.要素操作(geometry)

 

geometry的类型

 

String,type.

The type of geometry.

Known values: point | multipoint | polyline | polygon | extent

 

 

point操作:

坐标生成point

var point=new esri.geometry.Point(x,y,{wkid:102113});

 

var point= new esri.geometry.Point(-118.15, 33.80, newesri.SpatialReference({ wkid: 4326 }));

 

 

复制point feature

   this.getCopyOfTransfers=function(){    

       var results=[];

       for(var i=0;i<=pointFeatures.length-1;i++){

            var geoJson= pointFeatures [i].geometry.toJson();

            var attrJson=JSON.stringify(pointFeatures [i].attributes);

            var newAttr=JSON.parse(attrJson);

            newAttr.odType="w";

            var newTransfer=new esri.Graphic(new esri.geometry.Point(geoJson),null,newAttr,null);

            results.push(newTransfer);

         }     

         return results;

   };

 

Point和MultiPoint

通过geometry引用第一个点

  Point:geometry.point

  Multipoint: geometry.points[0]

 

通过geometry获取第一个点的坐标

geometry.point.x, geometry.point.y

geometry.points[0][0], geometry.points[0][1]

 

polyline操作

坐标生成polyline

 

var newLine=new esri.geometry.Polyline(lineJSON);      

 

复制polyline

this.getCopyOfLines=function(){

      var results=[];

      for(var i=0;i<=lineFeatures.length-1;i++){

         var geoJson=lineFeatures[i].geometry.toJson();

         var attrJson=JSON.stringify(lineFeatures[i].attributes);

         var newAttr=JSON.parse(attrJson);       

         var newLine=new esri.geometry.Polyline(geoJson);

         var tempGra=new esri.Graphic(newLine,null,newAttr,null);

         results.push(tempGra);

      }     

      return results;

   };

 

 

 

 

 

 

polyline抗锯齿

方案1:发布service时,使用antiAliasing

方案2:(1)随意发布

       (2)query.where=”1=1”;queryTask(url=”line.url”);

          获取到lineFeatures,使用GraphicsLayer绘制线图层

 

 

效果对比:

antiAliasing

 

graphicsLayer重新绘制

 

 

 

结论:

使用GraphicsLayer绘制线图层效果比 antiAliasing 好。

 代价是,写queryTask,setSymbol…..

 

 

polygon操作

坐标生成polygon

/*描述:给定圆心,半径,生成缓冲圆

     * pt-点,radius 米

*/

    var createCircleGeometry=function(pt,radius){

        var polygon = new esri.geometry.Polygon();

        var points = [];

        for (var i = 0; i <= 360; i += 10) {

            var radian = i * (Math.PI / 180.0);

            var x = pt.x + radius * Math.cos(radian);//r *[-1.1]

            var y = pt.y + radius * Math.sin(radian);

            points.push(new esri.geometry.Point(x, y));

        }

        polygon.addRing(points);

        polygon.spatialReference = mapAppObj.map.spatialReference;

        return polygon;

    };

复制polygon

var geoJson=polygon.geometry.toJson();

var polygon = new esri.geometry.Polygon(geoJson);

 

 

geometry.Polygon contains

 

Sentence:

polygonGeometry.contains(pointGeometry)

Description: check whether a point is inside or outside polygon

 

Code Snippets

     var feature = dojo.byId("imgSelectDistrict").district;//feature.geometry.type="polygon"

                    for (var i = graLayerSelectO.graphics.length - 1; i >= 0; i--) {

                        if (feature.geometry.contains(graLayerSelectO.graphics[i].geometry)) {

                            graLayerSelectO.remove(graLayerSelectO.graphics[i]);

                        }

                    }

 

 

extent操作

坐标生成extent

 

function createExtentGeometry(point,delta) {

    var xmin = point.x - delta;

    var xmax = point.x + delta;

    var ymin = point.y - delta;

    var ymax = point.y + delta;

    var extent = new esri.geometry.Extent(xmin, ymin, xmax, ymax, new esri.SpatialReference({ wkid: 4326 }));

    return extent;

}

 

复制extent

var geoJson=extent.geometry.toJson();

var newExtent=new esri.geometry.Extent(geoJson);

extent扩大缩小

map.setExtent(map.extent.expand(0.5));

map.setExtent(map.extent.expand(2));

 

给定半径,生成圆

 

function createCircleGeometry(pt, radius) {

    var polygon = new esri.geometry.Polygon();

    var points = [];

    for (var i = 0; i <= 360; i += 10) {

        var radian = i * (Math.PI / 180.0);

        var x = pt.x + radius * Math.cos(radian);//r *[-1.1]

        var y = pt.y + radius * Math.sin(radian);

        points.push(new esri.geometry.Point(x, y));

    }

    polygon.addRing(points);

    polygon.spatialReference = map.spatialReference;

    return polygon;

}

 

4 Graphic系列

构造函数

       var graphic=new esri.Graphic(geometry,symbol,attributes,infotemplate);

 

Note: Graphic and feature are equivalent

new esri.Graphic(geometry, symbol, attributes, infoTemplate)

 

Note:

1.graphic is used to store queried feature,

       var graphic=new esri.Graphic(feature,null,null,null);

       then graphic stored the feature Object. for further deal;

 

2.both feature and symbol are required for showing a graphic on map.

 

 

click事件

举例:点击graphic,然后从graphicsLayer中删除

 

dojo.connect(map.graphics, "onClick", function(e){

       var graphic=evt.graphic;

       map.graphics.remove(graphic);

});

 

 

 

 

 

 

 

 

Graphic.attriutes

复制

var attrJson=JSON.stringify(graphic.attributes);

var newAttrObj=JSON.parse(attrJSON);

setAttributes

方法1:

var JsonObj={

       Name:”西直门”,

       id:”01”

}

graphic.setAttributes(JsonObj);

 

方法2:

graphic.atrributes.Name=”西直门”;

graphic.attributes.id=”01”;

 

 

设置

graphic.atrributes.Name=”西直门”;

graphic.attributes.id=”01”;

 

 

onMouseOver/onMouseOut事件

举例:鼠标悬浮在pointGraphic上,graphic图片放大。

              鼠标移开,图片变小。

 

  dojo.connect(map.graphics, "onMouseOver", function(e){

              var graphic=e.graphic;

              var bigSymbol=new esri.symbol.PictureMarkerSymbol(imgUrl,25,20)

              graphic.setSymbol(bigSymbol);

});

 

  dojo.connect(map.graphics, "onMouseOut", function(e){

              var graphic=e.graphic;

              var smallSymbol=new esri.symbol.PictureMarkerSymbol(imgUrl,20,20)

              graphic.setSymbol(smallSymbol);

});   

 

Graphic部件 infoTemplate

说明:graphic的弹出窗体 通过 infoTemplate控制。

       graphic.setInfoTemplate(infoTemplate);

 

 

构造函数:

var  infoTemplate = new esri.InfoTemplate("Attributes", "<tr>State Name: <td>${STATE_NAME}
  </tr></td><br><tr>Population:<td>${Pop2001}</tr></td>");

 

 

举例,infoTemplate插入链接

  var infoTemplate = new esri.InfoTemplate("${title}", "<tr>途经换乘:<a href=‘http://www.baidu.com‘>http://www.baidu.com</a><td>${routeName}</tr></td><br><tr>点到点OD总量:<td>${ODTotal}</tr></td><br><tr>本方案OD量:<td>${ODValue}</tr></td><br><tr>占比:<td>${ODPartition}</tr></td>");

                    middlefeature.setInfoTemplate(infoTemplate);

 

显示所有属性的infoTemplate

var template = new esri.InfoTemplate("${name}", "${*}");

 

带按钮,input录入框的popWindow[动态Popwindow]

路子:

function createPopUpWindow(){

       var operPane=document.createElement(“div”);

       operPane.innerHTML=htmlString;

       operPane.onclick=function(e){

       var operId=e.target.id;

       if(operId==””){

}

else if(operId==””){

}

return operPane;

}

 

  var infoContent =getODWPopup(tempGra);                 

 mapAppObj.map.infoWindow.setTitle("站点信息");

mapAppObj.map.infoWindow.setContent(infoContent);

mapAppObj.map.infoWindow.resize(300, 260);                  

mapAppObj.map.infoWindow.show(tempGra.geometry, mapAppObj.map.getInfoWindowAnchor(tempGra.geometry));

                   

 

Graphic 部件 Symbol

说明:graphic必须设置symbol,才能显示

 

 

 

 

 

 

 

 

 

 

symbol种类

 

 

 

线symbol

 

构造函数:esri.symbolSimpleLineSymbol(线型,颜色,宽度)

 

举例:

var sls = new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_DASH,

  new dojo.Color([255,0,0]), 3);

 

 

填充 simpleFillSymbol

var sfs = new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_SOLID,

  new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_DASHDOT,

  new dojo.Color([255,0,0]), 2),new dojo.Color([255,255,0,0.25]));

 

点symbol

参见 simpleFillSymbol

 

图片 symbol

 

 

new esri.symbol.PictureMarkerSymbol(‘http://www.esri.com/graphics/aexicon.jpg‘, 51, 51);

 

Symbol-分类渲染(ClassBreaksRender)

 

Desciption:render by a the value range  of specific field

 

Steps:

  à1 set field for ClassBreaksRenderer

  à2 addBreaks for each value Range, set color ,size for them

 

Code Snippet:

var observationRenderer = new esri.renderer.ClassBreaksRenderer(new esri.symbol.SimpleMarkerSymbol(), "CheckOut"); //(fieldName)

                            //(symbol for each value range)

                            observationRenderer.addBreak(700, 100000000, new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_CIRCLE, dojox.gfx.px2pt(30), new esri.symbol.SimpleLineSymbol().setStyle(esri.symbol.SimpleLineSymbol.STYLE_SOLID).setColor(new dojo.Color([100, 100, 100])), new dojo.Color([255, 0,0,255])));

                            observationRenderer.addBreak(600, 700, new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_CIRCLE, dojox.gfx.px2pt(25), new esri.symbol.SimpleLineSymbol().setStyle(esri.symbol.SimpleLineSymbol.STYLE_SOLID).setColor(new dojo.Color([100, 100, 100])), new dojo.Color([255, 0, 0, 255])));

                            observationRenderer.addBreak(500, 600, new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_CIRCLE, dojox.gfx.px2pt(20), new esri.symbol.SimpleLineSymbol().setStyle(esri.symbol.SimpleLineSymbol.STYLE_SOLID).setColor(new dojo.Color([100, 100, 100])), new dojo.Color([255, 0, 0, 200])));

                            observationRenderer.addBreak(400, 500, new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_CIRCLE, dojox.gfx.px2pt(15), new esri.symbol.SimpleLineSymbol().setStyle(esri.symbol.SimpleLineSymbol.STYLE_SOLID).setColor(new dojo.Color([100, 100, 100])), new dojo.Color([255, 0, 0, 150])));

                            observationRenderer.addBreak(300, 400, new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_CIRCLE, dojox.gfx.px2pt(10), new esri.symbol.SimpleLineSymbol().setStyle(esri.symbol.SimpleLineSymbol.STYLE_SOLID).setColor(new dojo.Color([100, 100, 100])), new dojo.Color([255, 0, 0, 100])));

                            observationRenderer.addBreak(0, 300, new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_CIRCLE, dojox.gfx.px2pt(5), new esri.symbol.SimpleLineSymbol().setStyle(esri.symbol.SimpleLineSymbol.STYLE_SOLID).setColor(new dojo.Color([100, 100, 100])), new dojo.Color([255, 0, 0, 50])));

                            graLayerSelect.setRenderer(observationRenderer); //(render)

 

详细:参考Reference

 

Graphic 编辑控件

file:///F:/DevelopSoftware/ArcGIS%20Server%2010.1%20SP1_%E8%AF%B4%E6%98%8E_%E6%95%99%E7%A8%8B/JSAPI%E5%BC%80%E5%8F%91%E7%AC%94%E8%AE%B0/JavascriptAPI_Reference/v33_Samples/arcgis/toolbar_edit.html

 

5 feature系列

 

feature=geometry+attributes+infoTemplate+symbol

feature is equivalent to graphic.

 geometry存矢量信息

 attributes存属性信息

 infoTemplate 弹出窗体

 symbol  feature的符号

 

 

feature设置属性和读取属性

à1设置属性

   à(1) setAttributes(Json)

  feature.setAttributes(fieldValuePair);

       à(2)

 

 

 

feature.setInfoTemplate

//弹出窗体的 标题和内容

  middlefeature.setInfoTemplate(new esri.InfoTemplate(this.title, "<tr>途经换乘:<td>${routeName}</tr></td><br><tr>点到点OD总

 

量:<td>${ODTotal}</tr></td><br><tr>本方案OD量:<td>${ODValue}</tr></td><br><tr>占比:<td>${ODPartition}</tr></td>"));

 

 

 

 

 

 

 

 

 

feature添加属性

  à1stMethod

   var attrObj = feature.attributes;

    attrObj.routeID = i.toString();

    attrObj.routeName = routesArray[i - 2].routeName;

    ….

    feature.setAttributes(attrObj);

 

à2ndMethond

this.feature.attributes.ODTYPE = "o";

 

 

 

 

show features on Map

Summary:

   Feature.setAttribute(json)

   Feature.setSymbol()

   Feature.setInfoTemplate(“${name}”,”${*}”);

 

Example

  dojo.connect(geocoder, "onFindResults", function(response) {
          console.log("find results: ", response);
          var l = map.getLayer("results");
          l.clear();
          map.infoWindow.hide();
          dojo.forEach(response.results, function(r) {
            r.feature.attributes.name = r.name;
            r.feature.setSymbol(symbol);
            r.feature.setInfoTemplate(template);
            l.add(r.feature);

          });

 

拷贝feature

Feature=geometry+attributes

Geometry拷贝:var geoJson=geometry.toJson();

                        Var newgeo =new esri.geometry(geoJson);

 

Attributes.拷贝:

                            Var attrStr=JSON.stringify(feature.attributes);

                            Var newAttr=JSON.parse(attrStr);

 

返回feature:

             Var gra=new esri.Graphic(geometry,null,attributes,null)

 

 

 

var pointJSON=stationFeatures[i].geometry.toJson();                    

            var newPt=new esri.geometry.Point(pointJSON);    

            var attrJSON=JSON.stringify(stationFeatures[i].attributes);

            var newAttr=JSON.parse(attrJSON);

            newAttr.routeId=routeId;

            var tempGra=new esri.Graphic(newPt,null,newAttr,null);

            if(newPt!=stationFeatures[i].geometry){

                console.log("new point created");

            }

            else{

                console.log("fail to create newPoint");

            }

            return tempGra;

 

6. Map操作

map组件

说明:new esri.Map(div,{options}); map组件指options

   mapObj=new esri.Map("map",{

      nav:true,//8个pan 箭头

      slider:false,//左上的缩放 +/-;

      logo:false,//右下的esri logo

      showAttribution:false,//右下的gisNeu (logo左侧)

      extent://地图的extent

      });  

 

控制ZoomSlider的方法

(1)map.showZoomSlider();

   (2)map.hideZoomSlider();

 

控制nav的方法

  (1)map.showPanArrows();

  (2)map.hidePanArrows();

 

执行nav8个方向移动的方法

  .panUpperLeft()

  .panUp();

  .panUpperRight()

  .panLeft()

  .panRight()

  .panLowerLeft();

  .panDown()

  .panLowerRight();

 

dijit Map组件

scalebar

背景:scalebar控制单位

var scalebar=new esri.dijit.Scalebar({map:map,scalebarUnit:”english/metric”});

 

map尺寸改变

背景:客户要求地图大小有两种模式

--模式1:窗体模式,450*450

--模式2:全屏模式:document.documentElement.clientHeight*clientWidth

 

 

路子

   在mapDiv外层放置mapPanel,

       mapDiv的尺寸设置 100%,100%

       通过改变mapPanel直接调整mapDiv的尺寸。不必直接操作mapDiv

 

html布局

 <div id=”mapPanel” class=”part”>

   <div id=”mapDiv” style=”height:100%;width:100%”>

<div class=”operUI partStatus” id=”mapSizeBtn”></div>

</div>

</div>

 

css:

.part:{

       height:450px;

   width:450px;

}

 

js:

   $(".operUI").on("click",function(e){

      var targetId=e.target.id;  

      if(targetId=="mapSizeBtn"){//change map size

         if($(“#mapPanel”).hasClass(“part”)){

   $(“#mapPanel”).removeClass(“part”);

   $(“#mapPanel”).css(“width”,document.documentElement.clientWidth+”px”);

  $(“#mapPanel”).css(“height”,document.documentElement.clientHeight+”px”);  

}

else{

$(“#mapPanel”).addClass(“part”);

}

}

      return false;

   });

 

map 导航 (pan/zoom/preview/fullExtent)

1.     使用esri.tools.navigation实现

 

 

 

 

 

2.使用代码实现

 

$(".toolNavigateItem").on("click",function(){//导航项

        if(this.id!="pan"&&this.id!="zoomin"&&this.id!="zoomout"&&this.id!="fullextent"){

           return false;

        }

        if(this.id=="pan"){

         mapAppObj.drawHandler.disconnectPrevious();      

         removeSelectTypeDown();

        }

        else if(this.id=="zoomin"){//放

           var extent=mapAppObj.map.extent;

           mapAppObj.map.setExtent(extent.expand(0.5));

        }

        else if(this.id=="zoomout"){//缩

           var extent=mapAppObj.map.extent;

           mapAppObj.map.setExtent(extent.expand(2));

        }

        else{//全

           mapAppObj.map.setExtent(new esri.geometry.Extent({ "xmin": gSettings.originExtent.xMin, "ymin": gSettings.originExtent.yMin, "xmax": gSettings.originExtent.xMax, "ymax": gSettings.originExtent.yMax, "spatialReference":gSettings.spatialReference}));

        }

     });

 

 

map坐标和Screen坐标

mapPoint转screenPoint

var sPt=map.toScreen(mapPoint)

 

screenPoint转mapPoint

var mPt=map.toMap(screenPoint);

map.setExtent

 

关键:

       var extent=new esri.geometry.extent(xmin,ymin,xmax,ymax,srObj);

    map.setExtent(extent);

 

举例:

mapAppObj.map.setExtent(new esri.geometry.Extent({ "xmin": gSettings.originExtent.xMin, "ymin": gSettings.originExtent.yMin, "xmax": gSettings.originExtent.xMax, "ymax": gSettings.originExtent.yMax, "spatialReference":gSettings.spatialReference}));

        }

     });

 

举例2:

map.setExtent(map.extent.expand(0.5));

map.setExtent(map.extent.expand(2));

 

map.infoWindow

description: map.infoWindow is show infoWindow on map.

尺寸

   map.infoWindow.resize(800,600);

   map.infoWindow.show(pt, map.getInfoWindowAnchor(pt));

 

显示

方法1:

var pt = new esri.geometry.Point(middlefeature.geometry.paths[0][tempLoc], map.spatialReference);

map.infoWindow.show(pt, map.getInfoWindowAnchor(pt));//手动控制

 

方法2:

   mapAppObj.map.infoWindow.show(mapAppObj.map.toScreen(evt.mapPoint));

setFeatures/clearFeatures

 

setFeatures([graphics]);

description:which graphics attributes are showed in infoWindow.(one infoWindow will show all features, pager show one feature at once)

 

clearFeatures();

map.infoWindow doesn’t show any features

 

 

 

 

 

map.getLayer(id)

// get layer by id

var l = map.getLayer("results");

 

map.addLayer

备注:id用于在 getLayer(id)获取图层

//add layer to map

 

map.addLayer(new esri.layers.GraphicsLayer({

          id: "results"

 }));

 

map.removeLayer

 

map.removeLayer(map.getLayer("layer0"));

 

map 取中心坐标

var centerPt=new esri.geometry.Point((mapAppObj.map.extent.xmin+mapAppObj.map.extent.xmax)/2,(mapAppObj.map.extent.ymin+mapAppObj.map.extent.ymax)/2,mapSettings.spatialReference);

 

map设置中心 和 extent

Description:set the Extent of Map

 

对于dynamicMapLayer

dojo.require("esri.geometry");

  var initialExtent = new esri.geometry.Extent({ "xmin": 116.0391859574468, "ymin": 39.69010477397335, "xmax": 116.8337859574469, "ymax": 40.19729626333512, "spatialReference": { "wkid": 4326} });

 

   map.setExtent(mapExtent);

 

description: set Map Center

map.centerAt(feature.geometry.points[0]);

 

 

对于tileMapLayer

mapAppObj.map.setZoom(11);//设置级别

                     var centerPt=new esri.geometry.Point(mapSettings.centerPt.x-30000,mapSettings.centerPt.y+6000,mapSettings.spatialReference);                           

                     mapAppObj.map.centerAt(centerPt);

 

map事件 onload

Fires when the first or base layer has been successfully added to the map.

Code snippet:

 

map = new esri.Map("map");

    var baselayer = new esri.layers.ArcGISDynamicMapServiceLayer(baseMapUrl); //districtMap

    map.addLayer(baselayer);

    dojo.connect(map, "onLoad", function (results) {

             

});

查看map上所有layers

Properties are following:

 

Code snippets:

----------------------------------

Layers:
          var layerInfo = [];
          dojo.forEach(map.layerIds,function(id){
            var layer = map.getLayer(id);
            layerInfo.push("id: " + layer.id + " visible: " + layer.visible + " opacity: " + layer.opacity + "<br />");
          });
 
--------------------------
Scales:  basemap.tileInfo
basemap = new esri.layers.ArcGISTiledMapServiceLayer("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/TaxParcel/AssessorsBasemap/MapServer");
 
dojo.forEach(basemap.tileInfo.lods,function(lod){
            var level = lod.level;
            var scale = lod.scale;
            resolution = lod.resolution;
            scales.push( "level: " + level + " scale: " + scale + " resolution: " + resolution + "<br />");
});
 
------------------------
Width,height,and spatialReference:
  map.spatialReference.wkid 
  map.width 
map.height 

 

鼠标移动 显示坐标

Code snippets:

  dojo.connect(map, "onMouseMove", showCoordinates);
 
   function showCoordinates(evt) {
        //get mapPoint from event
        //The map is in web mercator - modify the map point to display the results in geographic
        var mp = esri.geometry.webMercatorToGeographic(evt.mapPoint);
        //display mouse coordinates
        dojo.byId("info").innerHTML = mp.x.toFixed(3) + ", " + mp.y.toFixed(3);
      }
 

鼠标事件 down/up/drag

支持:mouseDown,mouseUp

不支持:mouseMove,mouseDrag

 

//surpport in 3.4

      dojo.connect(map,"onMouseDown",function(evt){

         console.log("mouseDown triggered");

      });

      //sur int 3.4

      dojo.connect(map,"onMouseUp",function(evt){

         console.log("mouseUp triggered");

      });

     

      //not sur in 3.4

      dojo.connect(map,"onMouseMove",function(evt){

         console.log("mouseMove triggered");

      });     

      dojo.connect(map,"onMouseDragStart",function(evt){

          console.log("dragStart trigered");

         startPt=evt;

          console.log("drawStart triggered,start point:"+evt.mapPoint.x+","+evt.mapPoint.y+".screenPoint:"+evt.clientX+","+evt.clientY);         

       });

      dojo.connect(map,"onMouseDrag",function(evt){

         console.log("mouseDrag triggered");

      });

      dojo.connect(map,"onMouseDragEnd",function(evt){

         console.log("mouseDragEnd triggered");

      });

 

 

 

map. setMapCursor 设置地图指针

 

 

map.setMapCursor("help") //

map.setMapCursor("default")//

map.setMapCursor("pointer")//

map.setMapCursor("wait")//

map.setMapCursor("progress")//

map.setMapCursor("cell")// 粗十字

map.setMapCursor("crosshair")// 细十字

map.setMapCursor("text")//文本I

map.setMapCursor("vertical-text")//放倒的I

 

//自定义图标

map.setMapCursor("url(../src/assets/images/cursors/4WAY01.CUR),auto")

 

//圆选图标

map.setMapCursor("url(../src/assets/images/cursors/ellipse-pro.cur),auto")

 

//矩形图标

map.setMapCursor("url(../src/assets/images/cursors/move-pro.cur),auto")

 

 

7.绘制要素操作

基础类

 

 

 

 

画完军规

军规:activateDrawTool,必须启动deactivate使鼠标恢复正常

 

//鼠标画矩形

drawTool.activate(esri.toolbars.Draw.POINT);

//鼠标终止矩形

drawTool.deactivate

 

drawTool.activate(esri.toolbars.Draw.POINT);

线

drawTool.activate(esri.toolbars.Draw.POLYLINE);

 

矩形

drawTool.activate(esri.toolbars.Draw.EXTENT);

 

drawTool.activate(esri.toolbars.Draw.CIRCLE);

8.查询

几何查询

引用:dojo.DefferedList

 

举例:

       var queryTask=new esri.tasks.QueryTask(url);

       var query = new esri.tasks.Query();

       query.outSpatialReference=map.spatialReference;

       query.geometry=geom;

        if (layerID == "0") {//点 查询

            query.spatialRelationship = esri.tasks.Query.SPATIAL_REL_CONTAINS;

         }

        else {//框选、圆选相交

            query.spatialRelationship = esri.tasks.Query.SPATIAL_REL_INTERSECTS;

        }

       query.outFields=”*”;

        query.returnGeometry = true;

      

       var tempAr=new Array();

        tempAr.push(queryTask.execute(query));

var deferList=new Dojo.DeferredList(tempAr);

       deferList.then(function(results){

 

});

    

 

备注: Query.SPATIAL_REL_CONTAINS参见reference;

 

 

 

 

 

 

 

 

 

 

 

 

 

属性查询

引用:dojo.DefferedList

 

 

 

    var queryTask=new esri.tasks.QueryTask(url);

       var query = new esri.tasks.Query();

       query.outSpatialReference=map.spatialReference;

              query.Where=”1=1”

query.outFields = ["*"];  //查询所有字段

        query.returnGeometry = true;

      

       var tempAr=new Array();

        tempAr.push(queryTask.execute(query));

var deferList=new Dojo.DeferredList(tempAr);

       deferList.then(function(results){

 

});

 

备注:

query.where, 可先在arcgis/manager中写好。再copy到此处

 

等于/or/and

à字段等于

 

 

àor

 

 

 

àand

 

deferList一次提交多个query

  var whereClause1 = “…”;  

    var whereClause2 =”..”;

                 

    var queryTask = new esri.tasks.QueryTask(themeMapUrl + "/2"); //查询section

    var query= new esri.tasks.Query();

    query1.where = whereClause1;

    query1.outFields = ["*"];

    query1.outSpatialReference = map.spatialReference;

    query1.returnGeometry = true;

      

       var tempAr=new Array();

       tempAr.push(queryTask.execute(query1));

 

    query1.where = whereClause2;

       tempAr.push(queryTask.execute(query1));

 

    var deferList = new dojo.DeferredList(tempAr);

    deferList.then(function (results) {

      …

    });    //回调函数

 

9常用功能

 

距离面积量算

 

备注:

以下document mode 能够触发 mouseDrag事件()

<meta http-equiv="X-UA-Compatible" content="IE=9"/>

<meta http-equiv="X-UA-Compatible" content="IE=8"/>

<meta http-equiv="X-UA-Compatible" content="IE=7"/>

 

以下document mode 不能触发 mouseDrag事件()

<meta http-equiv="X-UA-Compatible" content="IE=10"/>

 

 

 

 

//计算,显示圆的半径 (圆选)

function shapeCalculator(){

   this.downPt=null;//drag down pt

   this.onMapDragStart=null;

   this.onMapDragging=null;

   this.onMapDragEnd=null;

   this.measureDiv=null;//result div

   this.targetShape=-1;//-1 null;0 rectangle;1 circle

  

   var _this=this;

  

   //初始化div,绑定

    this.init=function(div){

       console.log("shapeCalculator.init() called");

       if(div==null){console.log("unexpected para,function init");}            

       this.measureDiv=div;        

    };   

   //东西向偏移

    var getDeltaX=function(ptB){

       if(_this.downPt==null||_this.downPt.mapPoint==null){

         console.log("unexpected para,function getDeltaX()");

         return "";

       }

       return ptB.x-_this.downPt.mapPoint.x;

    };   

    //南北向偏移

    var getDeltaY=function(ptB){

       if(_this.downPt==null||_this.downPt.mapPoint==null){

         console.log("unexpected para,function getDeltaY()");

         return "";

       }

       return ptB.y-_this.downPt.mapPoint.y;

    };       

   //两点距(米)

   var getDistance=function(ptB){  

     if(_this.downPt==null||_this.downPt.mapPoint==null){

         console.log("unexpected para,function getDistance()");

         return "";

     }

     var ptA=_this.downPt.mapPoint;

     return Math.sqrt(Math.pow(ptA.x-ptB.x,2)+Math.pow(ptA.y-ptB.y,2));  

    };

    //A圆心,B圆周点.return 面积(平方米)

    var getArea=function(ptB){   

       var r=getDistance(ptB);

       if(r==null){

          console.log("unexpected para,function getArea()");

          return "";

       }

       return Math.PI*r*r;   

    };

   

    //长度格式化

    var formatLength=function(len){

       if(len<1000){        

          return (Math.ceil(len)+"米");              

      }

      else if(len>=1000&&len<1000000){    

         len=(Math.ceil(len)/1000).toFixed(2);

         return (len+"千米;");                         

      }

      else{//超过1000千米

         len=(Math.ceil(len)/1000).toFixed(2);

          return (len+"千米;");                              

      } 

    };

   

    //面积格式化

    var formatArea=function(tempArea){

       //面积

      if(tempArea<1000000){

         return Math.ceil(tempArea)+"平方米";          

      }

      //1平方公里-1万平方公里

      else if(tempArea>=1000000&&tempArea<10000000000){

         return ((Math.ceil(tempArea))/1000000).toFixed(2)+"平方公里";

      }

      //1万平方公里

      else{

         return ((Math.ceil(tempArea))/10000000000).toFixed(2)+"万平方公里";

      } 

    };

   

    //show radius

    this.showRadius=function(){

       if(this.measureDiv==null){

          console.log("no measureDiv,can‘t show radius");

          return;

       }

       console.log("showRadius() called");

       $(this.measureDiv).removeClass("dNone");

    };

   

    //clear radiusText,hide

    this.clearRadius=function(){

       console.log("shapeCalculator.clearRadius() called");

       $(this.measureDiv).html("");

       $(this.measureDiv).addClass("dNone");

    };

   

    //绑定mapMouseDrag事件

    this.bindDrags=function(type){

       if(type!=0&&type!=1){

          console.log("unexpected para,function bindDrags()");

          return;

       }     

       if(this.measureDiv==null){

          console.log("bindDrags(),failed. cause:measureDiv is null");

          return;

       }

      

       this.targetShape=type;//rectangle or circle to be measured

       console.log("radiusObj.targetShape is:"+type);

       if(this.onMapDragStart==null){

          console.log("dragStart binded");        

          this.onMapDragStart=dojo.connect(mapAppObj.map,"onMouseDragStart",function(evt){            

             console.log("dragStart triggered");

             mapAppObj.regionObj.hide();//隐藏区域

             mapAppObj.ringObj.hide();

             _this.downPt=evt; 

             _this.showRadius();     

          });        

       }     

   if(this.onMapDragging==null){

       console.log("dragging binded");

       this.onMapDragging=dojo.connect(mapAppObj.map,"onMouseDrag",function(evt){

         //console.log("dragging triggered");   

        

         if(_this.targetShape!=0&&_this.targetShape!=1){

            console.log("unexpected para,function onMapDragging");

            return;

         }

        

         var tempRad;

         var tempArea;

         var tempText="";

     

      if(_this.targetShape==1){//圆形

         tempRad=getDistance(evt.mapPoint);

         tempArea=getArea(evt.mapPoint);        

         tempText+="半径:"+formatLength(tempRad);

         tempText+="  面积:"+formatArea(tempArea);        

      }

      else{//矩形

         var tempWE=getDeltaX(evt.mapPoint);

         var tempNS=getDeltaY(evt.mapPoint);

         var weFlag=tempWE>0?"向东:":"向西:";

         var nsFlag=tempNS>0?"  向北:":"  向南:";

 

      tempText+=weFlag+formatLength(Math.abs(tempWE))+nsFlag+formatLength(Math.abs(tempNS));

         tempText+="  面积:"+formatArea(Math.abs(tempWE*tempNS));

      }       

         $(_this.measureDiv).html(tempText);

         $(_this.measureDiv).css("left",evt.clientX+15);

         $(_this.measureDiv).css("top",evt.clientY-15);      

      });     

    }

   if(this.onMapDragEnd==null){

      console.log("dragEnd binded");

       this.onMapDragEnd=dojo.connect(mapAppObj.map,"onMouseDragEnd",function(evt){

         console.log("dragEnd triggered");

         _this.clearRadius();

      });

   }     

    };//end bindDrags   

  

    //解除drags Events

   this.unbindDrags=function(){

      dojo.disconnect(this.onMapDragStart);  

      dojo.disconnect(this.onMapDragging);

      dojo.disconnect(this.onMapDragEnd);           

      this.onMapDragStart=null;

      this.onMapDragging=null;

      this.onMapDragEnd=null;

      this.targetShape=-1;

      console.log("drag events unbinded");

   };

}

/**************/

 

 

 

 

 

 

自动补全搜索

路子:

 

       1.将关键字字典存到dictionary对象中

       2.input每次keyPress时,从dictionary中查出similar对象

       3.update tipsDiv 的innerHTML,显示tipsDiv

       4.点击tipsDiv或者 点击document某个部分时,隐藏tipsDiv

 

界面设计:

              <input> <searchButton>

              <tipsDiv>

举例:

 

//搜索工具, input-button-tips

 

//搜索工具, input-button-tips

function searchTool(){

   var input=null;//关键字

   var button=null;//搜索

   var tips=null;//下拉选项

   var _this=this;

  

   //初始化

   this.init=function(inputDiv,butnDiv,tipsDiv){

      console.log("searchTool.init is called");

      if(inputDiv==null||inputDiv.tagName.toLowerCase()!="input"){

         console.log("invalid para,function searchToo.init()");

         return;

      }

      if(butnDiv==null||butnDiv.tagName.toLowerCase()!="input"){

         console.log("invalid para,function searchToo.init()");

         return;

      }

      if(butnDiv==null||tipsDiv.tagName.toLowerCase()!="div"){

         console.log("invalid para,function searchToo.init()");

         return;

      }

      input=inputDiv;

      button=butnDiv;

      tips=tipsDiv;

      console.log("searchTool widgets validated");

     

      //文本框获取焦点,显示tips

      $(input).on("focus",function(){

         console.log("input focus is triggered");

         _this.showTips(true);

      });  

       mapAppObj.bindMapClick();//点击地图关闭searchTool

     

       //文本框失去焦点

      //本地运行正常,但放在门户上,无法触发input的onblur事件.

      $(input).on("blur",function(e){        

         //onblur,e always be input itsself

         //when tips.children.click caused inputBlur,

         //if not delay, showTips(false) precede children().click,

         //then unable to selected tip;

        

         /*

         console.log("input blur triggered,hideTips delayed 200ms");

         setTimeout(function(){

            _this.showTips(false);  

         },200);

         */      

      });

      //关键字变更

      $(input).on("keyup",function(){

         console.log("input keyup is triggered");

         _this.updateTips($(this).val());//更新备选项

         _this.showTips(true);

      });     

      //搜索按钮

      $(button).on("click",function(){

         console.log("search click is triggered");

         var key=_this.getKey();

         console.log("关键字是:"+key);

         _this.showTips(false);

        

         var stationFea=mapAppObj.stationIDNameObj.createStationFeature(key);      

         if(stationFea!=null){         

            locateAndAddStation(stationFea);

            return;

         }

        

         console.log("key not match any station");

         var lineFea=mapAppObj.stationIDNameObj.createLineFeature(key);

        

         if(lineFea!=null){

            locateAndAddLine(lineFea);

            return;

         }

         alert("未找到要素:"+key);

      });

      //点击tips以外的区域,tips关闭

   };//end 初始化 

  

   //定位,添加站为备选

   //参数:stationFea,graphic

   var locateAndAddStation=function(stationFea){

      mapAppObj.map.centerAt(stationFea.geometry);

      formalizeFSAttributes([stationFea],"cp");

      var flag=mapAppObj.candidatesDLSS.checkCandidateSelected(stationFea);

      console.log("searched feauture in already in candidate?:"+flag);

      if(!flag){//if not added,add

         mapAppObj.candidatesDLSS.addCandidates([stationFea]);           

      }

      return false;

   };

  

   //定位,添加线为备选

   var locateAndAddLine=function(lineFea){

      console.log("key found match in lines");

      //centerAt

      var centerPt=mapAppObj.geometryUtil.getCenterPointOfLine(lineFea);                                    

      mapAppObj.map.centerAt(centerPt);                                  

     

      formalizeFSAttributes([lineFea],"cl");

      var flag=mapAppObj.candidatesDLSS.checkCandidateSelected(lineFea);

      console.log("searched feauture in already in candidate?:"+flag);

      if(!flag){//if not added,add

         mapAppObj.candidatesDLSS.addCandidates([lineFea]);           

      }

      return;

   };

   //获取输入的关键字

   this.getKey=function(){    

      return $.trim($(input).val());

   };

   //显隐备选项

   this.showTips=function(flag){

      console.log("showTips("+flag+") is called");

      if(flag){

         //显示

         if($(tips).hasClass("dNone")){

            if($(tips).children().length==0){

               console.log("no children in tips,tips won‘t be showed");

                return;

            }

            var left=$(input).css("left");

            var top=$(input).css("top")+$(input).css("height");

            console.log("tips location:"+left+","+top);

            $(tips).removeClass("dNone");

         }

         else{return;}

      }

      else{$(tips).addClass("dNone");}

   };

   //清空提示项,解除点击事件

   this.clearTips=function(){

      console.log("clearTips is called");

      var length=$(tips).children().length;

      console.log("tips.childeren.length is:"+length);

      $(tips).children().off("click");

      $(tips).empty();  

   };

   //查询,更新tips

   this.updateTips=function(key){

      console.log("updateTips is called");

      this.clearTips();

      //get stationTips,lineTips

      var stationTips=mapAppObj.stationIDNameObj.getSimilarStationNames(key);

      var lineTips=mapAppObj.stationIDNameObj.getSimilarLineNames(key);

      //into dvTips

      console.log("tips get,stations:"+$.toJSON(stationTips)+",lines:"+$.toJSON(lineTips));

      var tipsHtml="";

      for(var i=0;i<=stationTips.length-1;i++){

         tipsHtml+="<p class=‘similarItem‘ objType=0>"+stationTips[i]+"</p>";

      }

      for(var i=0;i<=lineTips.length-1;i++){

         tipsHtml+="<p class=‘similarItem‘ objType=1>"+lineTips[i]+"</p>";

      }

      $(tips).html(tipsHtml);

      //on click

      $(".similarItem").on("click",function(){

         console.log("tipItem "+this.innerHTML+" is clicked");        

         $(input).val(this.innerHTML);

         _this.showTips(false);

        

         var type=this.getAttribute("objType");

         console.log("objType is:"+type);

      if(type==0){//station

         //(1)locate; the feature

         var tempStation=mapAppObj.stationIDNameObj.createStationFeature(this.innerHTML);

         if(tempStation==null){

            return false;

         }

         locateAndAddStation(tempStation);      

         return false;

      }//end if station

      else{//line

         var tempLine=mapAppObj.stationIDNameObj.createLineFeature(this.innerHTML);

         if(tempLine==null){

            return false;

         }

         locateAndAddLine(tempLine);

         return false;

      }//end line

      });

   };

}

 

底图切换

界面:div影像,div行政区,divTieMap

 

效果描述:

   3个图层:影像图,行政区划图,tileMap

   点击UI,移除当前底图,切换到目标底图

 

function baseMapMgr(){

   //底图类型  -1-无,0-高德,1-影像,2-行政

   this.baseMapType=-1;

   //create autoNavi tile map calss;

   //MapABCClass can be used as constructor ONLY After this function executed

   this.createMapABCClass=function(){

      //relied Modules:esri.layers.agstiled,esri.geometry,

      dojo.declare("MapABCLayer", esri.layers.TiledMapServiceLayer, {

          constructor: function () {

             console.log("MapABCLayer constructor is called");

              this.spatialReference = new esri.SpatialReference({ wkid: 102113 });

              this.initialExtent = (this.fullExtent = new esri.geometry.Extent(-20037508.342787, -20037508.342787, 20037508.342787, 20037508.342787, this.spatialReference));

              this.id = "baseMapLayer";

              this.tileInfo = new esri.layers.TileInfo({

                  "rows": 256,

                  "cols": 256,

                  "compressionQuality": 0,

                  "origin": {

                      "x": -20037508.342787,

                      "y": 20037508.342787

                  },

                  "spatialReference": {

                      "wkid": 102113

                  },

                  "lods": [

      { "level": 0, "resolution": 156543.033928, "scale": 591657527.591555 },

      { "level": 1, "resolution": 78271.5169639999, "scale": 295828763.795777 },

      { "level": 2, "resolution": 39135.7584820001, "scale": 147914381.897889 },

      { "level": 3, "resolution": 19567.8792409999, "scale": 73957190.948944 },

      { "level": 4, "resolution": 9783.93962049996, "scale": 36978595.474472 },

      { "level": 5, "resolution": 4891.96981024998, "scale": 18489297.737236 },

      { "level": 6, "resolution": 2445.98490512499, "scale": 9244648.868618 },

      { "level": 7, "resolution": 1222.99245256249, "scale": 4622324.434309 },

      { "level": 8, "resolution": 611.49622628138, "scale": 2311162.217155 },

      { "level": 9, "resolution": 305.748113140558, "scale": 1155581.108577 },

      { "level": 10, "resolution": 152.874056570411, "scale": 577790.554289 },

      { "level": 11, "resolution": 76.4370282850732, "scale": 288895.277144 },

      { "level": 12, "resolution": 38.2185141425366, "scale": 144447.638572 },

      { "level": 13, "resolution": 19.1092570712683, "scale": 72223.819286 },

      { "level": 14, "resolution": 9.55462853563415, "scale": 36111.909643 },

      { "level": 15, "resolution": 4.77731426794937, "scale": 18055.954822 },

      { "level": 16, "resolution": 2.38865713397468, "scale": 9027.977411 },

      { "level": 17, "resolution": 1.19432856685505, "scale": 4513.988705 },/*equipents show,when scale inside 4513*/

      { "level": 18, "resolution": 0.597164283559817, "scale": 2256.994353 },

      { "level": 19, "resolution": 0.298582141647617, "scale": 1128.497176 },

      { "level": 20, "resolution": 0.15, "scale": 564 },/*the following scale is for showing equipment*/

      { "level": 21, "resolution":0.075, "scale":282 },

      { "level": 22, "resolution": 0.037, "scale": 141},

      { "level": 23, "resolution": 0.018, "scale": 70 },

      { "level": 24, "resolution": 0.09, "scale": 35 },

      { "level": 25, "resolution": 0.04, "scale": 17},

      { "level": 26, "resolution": 0.02, "scale": 8},

      { "level": 27, "resolution": 0.01, "scale": 4},

      { "level": 28, "resolution": 0.005, "scale": 2},

      { "level": 29, "resolution": 0.002, "scale": 1},

      { "level": 30, "resolution": 0.001, "scale": 0},

      { "level": 31, "resolution": 0.0001, "scale": 0}

      ]

              });

              this.loaded = true;

              this.onLoad(this);

          },

 

          //返回level下 row,col处切片的url

          getTileUrl: function (level, row, col) {

              //云端地址:http://emap0.mapabc.com/mapabc/maptile?v=w2.61&x=845&y=387&z=10

              //内网地址:http://10.254.3.56:8082/maptile-service/maptile?v=w2.61&x=845&y=387&z=10           

             return gSettings.serviceUrl.autoNaviTileMap+"&z=" + level + "&x=" + col + "&y=" + row;

          }

      });

   };

   /*描述:设置地图

    * para:-1-无,0-高德,1-影像,2-行政

    * */

   this.setBaseMap=function(para){

         console.log("baseMap.setBaseMap has been triggered");

         if(para!=-1&&para!=0&&para!=1&&para!=2){

            console.log("unexpected para,function setBaseMap");

            return;

         }

         if(para==this.baseMapType){//如果相同

            return;

         }

         else{//不同

            if(this.baseMapType!=-1){//clear previous

                var targetLayer=mapAppObj.map.getLayer("baseMapLayer");

                mapAppObj.map.removeLayer(targetLayer);

                this.baseMapType=-1;

            }

            if(para==-1){return;}

            else if(para==0){             

                var mapABCLayer = new MapABCLayer();

                  mapAppObj.map.addLayer(mapABCLayer);

                this.baseMapType=0;              

            }

            else if(para==1){

                 var imageLayer = new esri.layers.ArcGISImageServiceLayer(gSettings.serviceUrl.imageServiceUrl, { id: "baseMapLayer" });

                   mapAppObj.map.addLayer(imageLayer);

                 this.baseMapType=1;             

            }

            else{

                var districtLayer = new esri.layers.ArcGISDynamicMapServiceLayer(gSettings.serviceUrl.districtMapUrl, { id: "baseMapLayer" });

                  mapAppObj.map.addLayer(districtLayer);

                this.baseMapType=2;              

            }

            mapAppObj.themeMaps.reloadEquipmentLayer();         

         }//end 不同

   };//end setBaseMap

}

图层/要素闪烁

  //闪烁效果

              _this.selectedW.graphicLayer.hide();                            

              setTimeout(function(){

                console.log("W delayedShow has been called");

                _this.selectedW.graphicLayer.show();

              },200);

 

 

10常见错误

 

 

缓冲区查询  dt.join is not a function

原因:dojo传递参数的时候出错。

解决方式:这是仍然使用GeometryService.buffer的方式。(可以使用生成圆来取代)

function getCircleFromPoint(centerPointGraphic, radius)
{
    var geometryService = new esri.tasks.GeometryService(_thisMap.GeometryServiceUrl);
    var point = new esri.geometry.Point(centerPointGraphic.geometry.x,
                                        centerPointGraphic.geometry.y,
                                        new esri.SpatialReference({ wkid: 4326 })
                                        );
    var params = new esri.tasks.BufferParameters();
    params.geometries = [point];
    params.distances = [new Number(radius)];
    params.unit = esri.tasks.GeometryService.UNIT_STATUTE_MILE;
    params.bufferSpatialReference = new esri.SpatialReference({ wkid: 4326 });
    params.outSpatialReference = map.spatialReference;
    var obj = this;
    dojo.connect(geometryService, "onBufferComplete", obj, "geometryBufferCompleteCallback");
    geometryService.buffer(params);
}

buffer,queryTask, 服务端Proxy脚本配置和客户端调用

备注:框选的圆大时,query.geometry是个含40~50个点的polygon,长度超过2000,在IE浏览器中,需要设置esri.config.proxyUrl

ArcGIS API for JavaScript默认方式HTTP请求是GET方式, 而不是Post方式。

当HTTP为长URL请求时,GET将无法使用,而必须采用Post的方式。Esri默认的http请求方式是GET。对于这种应用,如:以缓冲后的几何为参数的QueryTask,此情况下就需要使用POST的Proxy来处理这种情况。

 

 

 

出错提示:

RequestError: Unable to load /proxy?http://10.254.53.85:6080/arcgis/rest/services/TF/station/MapServer/0/query status: 12030

 

----------------------------------------------------------

解决步骤:添加proxy.ashx->

添加proxy.ashx (IIS):

1,将proxy.ashx和proxy.config拷贝到网站目录下(IIS中,要将网站转为应用程序)

 

2.打开proxy.config,添加serverItem标签,url指向GISServer, 设置matchAll=false

    <serverItem url="http://localhost:6080/arcgis/rest/services/MyMapService/MapServer"

                matchAll="false" />

 

 

访问Url:

http://localhost/LocalJsoutput/proxy.ashx

 

测试方式

http://localhost/LocalJsoutput/proxy.ashx?ping

 

Buffer,queryTask页面添加代码:

 

esri.config.defaults.io.proxyUrl=

esri.config.defaults.io.alwaysUseProxy=false;

 

 

proxy拒绝访问

        esri.config.defaults.io.proxyUrl = gProxyUrl;(http://10.254.53.75/jsoutput/proxy.ashx)

        esri.config.defaults.io.alwaysUseProxy = false;

 

var gProxyUrl = "http://localhost/jsoutput/proxy.ashx";//防止跨域

 

备注:即使服务器是 10.254.53.75,在客户端设置10.254.53.75,仍然是跨域

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

11常用布局

Map全屏

说明:html,body,#map{width:100%,height:100%}

如果map外层套有其它标签,请把它们的width,height设置成100%;

 

<style type="text/css">

*{margin:0px; padding:0px;}

html,body,#map{width:100%;height:100%;}

</style>

<script type="text/javascript">

var mapObj=null;

dojo.ready(function(){

   mapObj=new esri.Map("map");

   var districtLayer = new esri.layers.ArcGISDynamicMapServiceLayer(gSettings.serviceUrl.districtMapUrl, { id: "baseMapLayer" });

   mapObj.addLayer(districtLayer);

});

</script>

</head>

<body>

<div id="map"></div>

</body>

 

 

12路径分析

 RouteParameters

 

routeParams = new esri.tasks.RouteParameters();

      routeParams.stops = new esri.tasks.FeatureSet();//push stop graphic into ithis

      routeParams.returnRoutes = true;

      routeParams.returnDirections = true;//sometime may error

      routeParams.returnStops = true;//stops you pushed into

      routeParams.directionsLengthUnits = esri.Units.KILOMETERS;

      routeParams.outSpatialReference = map.spatialReference;

 

RouteParametres 错误和解决方式

 

[Failed to convert the input propertyset into a recordset to load into the NAClass "Stops".  Input property [FID] could not be mapped to a valid field type or was not specified in the first PropertySet which is used to define the input fields.]

 

//Reason, attributes of stop graphic has extra attributes can’t be found in published service;

 

//solution: delete unnecessary attributes

var pathByGraphic = new esri.Graphic(noDuplicatedStations[i].geometry, null, {"NAME":noDuplicatedStations[i].attributes.NAME}, null);

 

 

 

 

 

RouteTask, solveResluts

 

 

 

 

 

 

 

 

在线例子列表:

 

Find a route

 

Find directions

驾车路线,每一段

 

Find a rounte around Barriers

 

Find Nearest facility

 

Find Area arriving with 1 minute

 

Dynamic show tranvle area  with time changing

 

 

 

 

 

 

 

 

 

 

Route  结构

 

最关键的部分是 polyline

RouteTask 和RouteParameter

Tips:

à(1)routeTaskUrl point to  NAServer

  (2)routeParameters.features must accept Graphic from Point(not multipoint);

 

Sentences:

var routeTask = new esri.tasks.RouteTask(networkService);

        var routeParas = new esri.tasks.RouteParameters();

        routeParas.outSpatialReference = map.spatialReference;//outspatialReference of rp

        routeParas.stops = new esri.tasks.FeatureSet();//stops of rp, each stop is a esri.Grahic

       var ptStart = new esri.geometry.Point(startFeatrue.geometry.points[0], map.spatialReference);

       var ptEnd = new esri.geometry.Point(endFeature.geometry.points[0], map.spatialReference);

       var tempGra1=new esri.Graphic(ptStart,symbol,null,null);

       var tempGra2=new esri.Graphic(ptEnd,symbol,null,null);

       routeParas.stops.features.push(tempGra1);//routeParameter.features must be type Graphic

       routeParas.stops.features.push(tempGra2);

 

----------------------------

      var routeSymbol = new esri.symbol.SimpleLineSymbol().setColor(new dojo.Color([0, 0, 255, 0.5])).setWidth(5);

        routeTask.solve(routeParas, function (solveResults) {

            for (var j = 0; j <= solveResults.routeResults.length - 1; j++) {

                var oneRouteGra = solveResults.routeResults[0].route;

                oneRouteGra.setInfoTemplate(new esri.InfoTemplate("奥林匹克公园-->天通苑", "<tr>途径换乘<td>奥林匹克公园-->霍营-->立水桥-->天通苑</tr></td><br><tr>OD量:<td>4503/tr></td><br><tr>OD占比:<td>83.1%</tr></td><br>"));

                oneRouteGra.setSymbol(routeSymbol);

                map.graphics.add(oneRouteGra);

            }

        }, function (error) {

            alert(error);

        });

 

 

Example:

var startGra = new esri.Graphic(ptStart, new esri.symbol.PictureMarkerSymbol("src/assets/images/layer.png", 24, 24), null, null);

var endGra = new esri.Graphic(ptEnd, new esri.symbol.PictureMarkerSymbol("src/assets/images/station_small.png", 24, 24), null, null);

 

var routeTask = new esri.tasks.RouteTask(networkService);//routeTask and routePara

var routeParas = new esri.tasks.RouteParameters();

 

routeParas.outSpatialReference = map.spatialReference;

routeParas.returnRoutes = true;

routeParas.stops = new esri.tasks.FeatureSet();

routeParas.stops.features.push(startGra);

routeParas.stops.features.push(endGra);

 

routeTask.solve(routeParas, function (solveResults) {//geRoute

    if (solveResults.routeResults.length == 0) { alert("failed to find route"); return; }

    var oneRouteResult = solveResults.routeResults[0];

    var routeSymbol = new esri.symbol.SimpleLineSymbol().setColor(new dojo.Color([255, 0, 0])).setWidth(5);

    var routeGraphic = new esri.Graphic(oneRouteResult.route.geometry, routeSymbol, null, null);

 

    graLayerRoute.clear(); //(clear previous)

    map.infoWindow.hide();

                                                    //(infoWindow location)

    var tempLoc = parseInt(oneRouteResult.route.geometry.paths[0].length / 2); //(中间段的 中间点)

    var pt = new esri.geometry.Point(oneRouteResult.route.geometry.paths[0][tempLoc], map.spatialReference);

    map.infoWindow.setTitle(endFeature.attributes.NAME + "-->" + destName);

    map.infoWindow.setContent("<tr>途经换乘:<td></tr></td><br><tr>点到点OD总量:<td></tr></td><br><tr>本方案OD量:<td></tr></td><br><tr>占比:<td></tr></td>");

    map.infoWindow.show(pt, map.getInfoWindowAnchor(pt));

 

    graLayerRoute.add(routeGraphic); //route gra

 

    graLayerRoute.add(startGra);

    graLayerRoute.add(endGra);

    map.addLayer(graLayerRoute);

}); //end routeTask callback

 

 

 

 

Get Route Length

solveResults[i][1].routeResults[0].route.attributes.Total_Length

 

Route sort by routeLength

 

//sort Function

<script type="text/javascript">

    var allRoutes = [{ "routeResults": [{ "route": { "attributes": { "Total_Length": 4, "NAME": "Route1"}}}] },

    { "routeResults": [{ "route": { "attributes": { "Total_Length": 3, "NAME": "Route2"}}}] },

    { "routeResults": [{ "route": { "attributes": { "Total_Length": 2, "NAME": "Route3"}}}] },

    { "routeResults": [{ "route": { "attributes": { "Total_Length": 1, "NAME": "Route4"}}}] }

    ];

 

    function sortFunction(a, b) {

        return a.routeResults[0].route.attributes.Total_Length - b.routeResults[0].route.attributes.Total_Length;

    }

 

       allRoutes.sort(sortFunction);

</script>

 

//get the top 3

 

  var noDupplicatedRoutes = clearSameLengthRoute(solveResults);

 

                var topThree = function () {

                    var sortedRoutes = noDupplicatedRoutes.sort(sortRouteFunction);

                    return sortedRoutes.slice(0,3);//only top 3 left

                } (); //get the 3 shortest routes

 

 

Route 地铁 前3换乘路径算法

1.传起点,终点,找出最短路径

   (1)如果起点,终点的lineID相同,显示最短路径。

       结束。

   (2)如果起点,终点的lineID不相同.

      -->1.得到最短路径

           奥林匹克公园->大屯路东->天通苑

     //方法1(换乘站个数比方法2多)

      (起点lineID:15号线,8号线

         终点lineID:5号线

         -->找出起点线相交的线

            (15号线)5号线,13号线,14号线

               (8号线)13号线,15号线,10号线,2号线,6号线

          )

         

     //方法2

      -->使用矩形范围,求出矩形范围内的换乘站

           望京西,霍营,立水桥,奥林匹克公园,大屯路东

         -->删除在最短路径上的换乘站

            删除: 奥林匹克公园,大屯路东,立水桥。

               余下:望京西,霍营

         -->求经过这两个换乘站的路径.

             (1)奥->霍->天

                (2)奥->望->大->天

         -->删除自相交的路线

            删除:奥->望->大->天

               余下:奥->霍->天

 

 

 

/*路径分析 (多条路径)*/

function queryRoutes(startName, endName) {

    var queryTask = new esri.tasks.QueryTask(analysisMapUrl + "/0");

    var query = new esri.tasks.Query();

    query.outSpatialReference = map.spatialReference;

    query.returnGeometry = true;

    query.outFields = ["*"];

    query.where = "NAME=‘" + startName + "‘";

 

    var tepmlist = new Array();

    tepmlist.push(queryTask.execute(query));

    query.where = "NAME=‘" + endName + "‘";

    tepmlist.push(queryTask.execute(query));

    var deferList = new dojo.DeferredList(tepmlist);

    deferList.then(function (results) {//get start and end

        if (results[0][1].features.length == 0) { alert("未找到起点站‘" + startName + "‘.如果该站已经开通,请更新数据"); return; }

        if (results[1][1].features.length == 0) { alert("未找到终点站‘" + endName + "‘.如果该站已经开通,请更新数据"); return; }

 

        var tempGra1 = new esri.Graphic(results[0][1].features[0].geometry, new esri.symbol.PictureMarkerSymbol("src\assets\images\startStation.png", 22, 22), results[0][1].features[0].attributes, new esri.InfoTemplate("起点信息:", "${NAME}"));

        var tempGra2 = new esri.Graphic(results[1][1].features[0].geometry, new esri.symbol.PictureMarkerSymbol("src\assets\images\end.png", 22, 22), results[1][1].features[0].attributes, new esri.InfoTemplate("终点信息:", "${NAME}"));

 

        //get shortestRoute

        var routeTask = new esri.tasks.RouteTask(networkService);

        var routeParas = new esri.tasks.RouteParameters();

        routeParas.outSpatialReference = map.spatialReference;

        routeParas.returnStops = true;

        routeParas.returnRoutes = true;

        routeParas.stops = new esri.tasks.FeatureSet();

        routeParas.stops.features.push(tempGra1);

        routeParas.stops.features.push(tempGra2);

 

        var tempAr = [routeTask.solve(routeParas)];

        var deferList = new dojo.DeferredList(tempAr);

        deferList.then(function (results) {//defer for shortest route

            if (results[0][0] == false) { alert("未能执行查询,请检查network service"); return; }

            if (results[0][1].length == 0) { alert("两站间没有可达路径"); return; }

            var routeSymbol = new esri.symbol.SimpleLineSymbol().setColor(new dojo.Color([255, 0, 0])).setWidth(5);

            var shortestRoute = results[0][1].routeResults[0].route;

 

            //start end at one line, show one only

            if (checkStationSameLine(tempGra1, tempGra2)) {

                //alert("在同一条线上");

                shortestRoute.setInfoTemplate(new esri.InfoTemplate(tempGra1.attributes.NAME + "-->" + tempGra2.attributes.NAME, "<tr>乘车路线<td>" + tempGra1.attributes.NAME + "-->" + tempGra2.attributes.NAME + "</tr></td><br><tr>OD量:<td>4503</tr></td><br><tr>OD占比:<td>83.1%</tr></td><br>"));

                shortestRoute.setSymbol(routeSymbol);

 

                var routeLength = results[0][1].routeResults[0].route.attributes.Total_Length;

                var li = document.createElement("li"); //创建li

                li.className = "marTB5";

 

                li.routeGraphic = shortestRoute; //li添加属性,features,起点,终点

                li.routeID = 1;

                li.startStation = tempGra1.attributes.NAME;

                li.endStation = tempGra2.attributes.NAME;

                li.startPoint = tempGra1.geometry;

                li.endPoint = tempGra2.geometry;

                li.title = tempGra1.attributes.NAME + "-->" + tempGra2.attributes.NAME;

                li.routeName = tempGra1.attributes.NAME + "-->" + tempGra2.attributes.NAME + "(距离:" + Math.round(routeLength) + "米)";

                li.ODTotal = 5638;

                li.ODValue = 4533;

                li.ODPartition = (li.ODValue / li.ODTotal * 100).toString().substr(0, 5) + "%";

                li.appendChild(document.createTextNode("1. " + li.title));

 

                li.onmouseover = function () {//悬浮 显示

                    this.style.cursor = ‘pointer‘;

                    graLayerRoute.clear(); //清空

                    map.infoWindow.hide();

 

                    graLayerRoute.add(this.routeGraphic); //线路

                    //起点,终点

                    var infoTemplate = new esri.InfoTemplate("起点信息", "站点名:" + this.startStation);

                    var startGra = new esri.Graphic(this.startPoint, new esri.symbol.PictureMarkerSymbol(‘src/assets/images/layer40.png‘, 22, 22), null, infoTemplate);

                    infoTemplate = new esri.InfoTemplate("终点信息", "站点名:" + this.startStation);

                    var endGra = esri.Graphic(this.endPoint, new esri.symbol.PictureMarkerSymbol(‘src/assets/images/end.png‘, 22, 22), null, infoTemplate);

                    graLayerRoute.add(startGra);

                    graLayerRoute.add(endGra);

                    map.addLayer(graLayerRoute);

                }

                dojo.byId("ulRoutes").appendChild(li);

            }

            else {//start,end not at same Line

                //alert("不在同一条线上");

                var xmin = (tempGra1.geometry.x >= tempGra2.geometry.x) ? tempGra2.geometry.x : tempGra1.geometry.x;

                var ymin = (tempGra1.geometry.y >= tempGra2.geometry.y) ? tempGra2.geometry.y : tempGra1.geometry.y;

                var xmax = (tempGra1.geometry.x <= tempGra2.geometry.x) ? tempGra2.geometry.x : tempGra1.geometry.x;

                var ymax = (tempGra1.geometry.y <= tempGra2.geometry.y) ? tempGra2.geometry.y : tempGra1.geometry.y;

                var transferExtent = new esri.geometry.Extent(xmin - 0.04, ymin - 0.03, xmax + 0.04, ymax + 0.03);

                var queryTask = new esri.tasks.QueryTask(analysisMapUrl + "/0");

                var query = new esri.tasks.Query();

                query.outSpatialReference = map.spatialReference;

                query.outFields = ["*"];

                query.where = "isTransfer=1";

                query.geometry = transferExtent;

                query.returnGeometry = true;

                var deferList = new dojo.DeferredList([queryTask.execute(query)]);

 

                esri.config.defaults.io.proxyUrl = gProxyUrl;

                esri.config.defaults.io.alwaysUseProxy = false;

 

                deferList.then(function (transferStations) {//transferStations

                    var routeSovleArray = [];

                    var noDuplicatedStations = clearSameNameFeatures(transferStations[0][1]); //clearSameName

                    var hasTransferStation = false;

                    for (var i = noDuplicatedStations.length - 1; i >= 0; i--) {

                        console.log("NO" + i.toString() + " transfer Name:" + noDuplicatedStations[i].attributes.NAME);

                        if (noDuplicatedStations[i].attributes.NAME == tempGra1.attributes.NAME || noDuplicatedStations[i].attributes.NAME == tempGra2.attributes.NAME) {

                            console.log("removed transfer: " + "NO " + i.toString() + ":" + noDuplicatedStations[i].attributes.NAME);

                            noDuplicatedStations.splice(i, 1); //remove station, if it is start or end

                        }

                    }

                    for (var i = noDuplicatedStations.length - 1; i >= 0; i--) {

                        console.log("NO" + i.toString() + " transfer Name:" + noDuplicatedStations[i].attributes.NAME);

                    }

                    if (noDuplicatedStations.length != 0) {// if has transfer within extent

                        hasTransferStation = true;

                        for (var i = 0; i <= noDuplicatedStations.length - 1; i++) {

                            var routeTask = new esri.tasks.RouteTask(networkService);

                            var routeParas = new esri.tasks.RouteParameters();

                            routeParas.returnStops = true;

                            routeParas.returnRoutes = true;

                            routeParas.outSpatialReference = map.spatialReference;

                            routeParas.stops = new esri.tasks.FeatureSet();

 

                            routeParas.stops.features.push(tempGra1);

                            var pathByGraphic = new esri.Graphic(noDuplicatedStations[i].geometry, null, { "NAME": noDuplicatedStations[i].attributes.NAME }, null);

                            routeParas.stops.features.push(pathByGraphic);

                            routeParas.stops.features.push(tempGra2);

 

                            routeSovleArray.push(routeTask.solve(routeParas));

                        }

                    }

                    else {// don‘t have transfer

                        var routeTask = new esri.tasks.RouteTask(networkService);

                        var routeParas = new esri.tasks.RouteParameters();

                        routeParas.returnStops = true;

                        routeParas.returnRoutes = true;

                        routeParas.outSpatialReference = map.spatialReference;

                        routeParas.stops = new esri.tasks.FeatureSet();

                        routeParas.stops.features.push(tempGra1);

                        routeParas.stops.features.push(tempGra2);

 

                        routeSovleArray.push(routeTask.solve(routeParas));

                    }

 

                    var derferListRoute = new dojo.DeferredList(routeSovleArray);

                    derferListRoute.then(function (solveResults) {

                        var routeSymbol = new esri.symbol.SimpleLineSymbol().setColor(new dojo.Color([255, 0, 0])).setWidth(5);

                        for (var j = 0; j <= solveResults.length - 1; j++) { //get transferName

                            if (solveResults[j][1].routeResults[0].stops.length > 2) {

                                solveResults[j][1].routeResults[0].routeName = solveResults[j][1].routeResults[0].stops[0].attributes.Name + "-->" + solveResults[j][1].routeResults[0].stops[1].attributes.Name + "-->" + solveResults[j][1].routeResults[0].stops[2].attributes.Name;

                            }

                            else { solveResults[j][1].routeResults[0].routeName = solveResults[j][1].routeResults[0].stops[0].attributes.Name + "-->" + solveResults[j][1].routeResults[0].stops[1].attributes.Name; }

                        }

                        var filtereddRoutes = filterRoutes(solveResults); //clear same length Routes

 

                        for (var j = 0; j <= filtereddRoutes.length - 1; j++) {

                            var oneRouteGra = filtereddRoutes[j][1].routeResults[0].route;

                            var transferName = filtereddRoutes[j][1].routeResults[0].stops[1].attributes.Name;

                            oneRouteGra.setInfoTemplate(new esri.InfoTemplate(tempGra1.attributes.NAME + "-->" + transferName + "-->" + tempGra2.attributes.NAME, "<tr>途径换乘<td>奥林匹克公园-->霍营-->立水桥-->天通苑</tr></td><br><tr>OD量:<td>4503</tr></td><br><tr>OD占比:<td>83.1%</tr></td><br>"));

                            oneRouteGra.setSymbol(routeSymbol);

 

                            var routeLength = filtereddRoutes[j][1].routeResults[0].route.attributes.Total_Length;

                            var li = document.createElement("li"); //创建li

                            li.className = "marTB5";

 

                            li.routeGraphic = oneRouteGra; //li添加属性,features,起点,终点

                            li.routeID = (j + 1).toString();

                            li.startStation = tempGra1.attributes.NAME;

                            li.endStation = tempGra2.attributes.NAME;

                            li.startPoint = tempGra1.geometry;

                            li.endPoint = tempGra2.geometry;

                            li.hasTransferStation = hasTransferStation;

                            if (hasTransferStation) {

                                li.title = tempGra1.attributes.NAME + "-->" + transferName + "-->" + tempGra2.attributes.NAME;

                                li.routeName = tempGra1.attributes.NAME + "-->" + transferName + "-->" + tempGra2.attributes.NAME + "(距离:" + Math.round(routeLength) + "米)";

                            }

                            else {

                                li.title = tempGra1.attributes.NAME + "-->" + tempGra2.attributes.NAME;

                                li.routeName = tempGra1.attributes.NAME + "-->" + tempGra2.attributes.NAME + "(距离:" + Math.round(routeLength) + "米)";

                            }

 

                            li.ODTotal = 5638;

                            li.ODValue = 4533;

                            li.ODPartition = (li.ODValue / li.ODTotal * 100).toString().substr(0, 5) + "%";

                            li.appendChild(document.createTextNode((j + 1).toString() + "  ." + li.title));

 

                            li.onmouseover = function () {//悬浮 显示

                                this.style.cursor = ‘pointer‘;

                                graLayerRoute.clear(); //清空

                                map.infoWindow.hide();

 

                                var middlefeature = this.routeGraphic; //infoWindow位置

                                var tempLoc = parseInt(middlefeature.geometry.paths[0].length / 2); //(中间段的 中间点)

                                var pt = new esri.geometry.Point(middlefeature.geometry.paths[0][tempLoc], map.spatialReference);

                                map.infoWindow.setTitle(this.title);

                                if (this.hasTransferStation) {

                                    map.infoWindow.setContent("<tr>途经换乘:<td>" + this.routeName + "</tr></td><br><tr>点到点OD总量:<td>" + this.ODTotal + "</tr></td><br><tr>本方案OD量:<td>" + this.ODValue + "</tr></td><br><tr>占比:<td>" + this.ODPartition + "</tr></td>");

                                }

                                else {

                                    map.infoWindow.setContent("<tr>乘车路线:<td>" + this.routeName + "</tr></td><br><tr>点到点OD总量:<td>" + this.ODTotal + "</tr></td><br><tr>本方案OD量:<td>" + this.ODValue + "</tr></td><br><tr>占比:<td>" + this.ODPartition + "</tr></td>");

                                }

                                map.infoWindow.resize(250, 200);

                                map.infoWindow.show(pt, map.getInfoWindowAnchor(pt));

 

                                graLayerRoute.add(this.routeGraphic); //线路

                                //起点,终点

                                var infoTemplate = new esri.InfoTemplate("起点信息", "站点名:" + this.startStation);

                                var startGra = new esri.Graphic(this.startPoint, new esri.symbol.PictureMarkerSymbol(‘src/assets/images/layer40.png‘, 22, 22), null, infoTemplate);

                                infoTemplate = new esri.InfoTemplate("终点信息", "站点名:" + this.startStation);

                                var endGra = esri.Graphic(this.endPoint, new esri.symbol.PictureMarkerSymbol(‘src/assets/images/end.png‘, 22, 22), null, infoTemplate);

                                graLayerRoute.add(startGra);

                                graLayerRoute.add(endGra);

                                map.addLayer(graLayerRoute);

                            }

                            dojo.byId("ulRoutes").appendChild(li);

                        } //for end

                    }); //end deferList.solveRoutes

                }); //end query transferStations

            }

        }); //end defer for shortest route

    });         //end defer start,end

}

 

13地图打印

代码打印

preRequirement: Printing tools must be started at ServerSide

http://localhost:6080/arcgis/rest/services/Utilities/PrintingTools/GPServer/Export%20Web%20Map%20Task

 

 

代码:

 

function startPrintTask() {

    //var url = ‘http://10.254.53.85:6080/arcgis/rest/services/TF/station/MapServer/export‘;

    var printTask = new esri.tasks.PrintTask(mapPrintService);

 

    esri.config.defaults.io.proxyUrl = gProxyUrl;

    esri.config.defaults.io.alwaysUseProxy = false;

    //get print templates from the export web map task

    var printInfo = esri.request({

        "url": mapPrintService,

        "content": { "f": "json" }

    });

   

    printInfo.then(function (resp) {

        var layoutTemplate, templateNames, mapOnlyIndex, templates;

 

        layoutTemplate = dojo.filter(resp.parameters, function (param, idx) {

            return param.name === "Layout_Template";

        });

 

        if (layoutTemplate.length == 0) {

            console.log("print service parameters name for templates must be \"Layout_Template\"");

            return;

        }

        templateNames = layoutTemplate[0].choiceList;

 

        // remove the MAP_ONLY template then add it to the end of the list of templates

        mapOnlyIndex = dojo.indexOf(templateNames, "MAP_ONLY");

        if (mapOnlyIndex > -1) {

            var mapOnly = templateNames.splice(mapOnlyIndex, mapOnlyIndex + 1)[0];

            templateNames.push(mapOnly);

        }

 

        // create a print template for each choice

        templates = dojo.map(templateNames, function (ch) {

            var plate = new esri.tasks.PrintTemplate();

            plate.layout = plate.label = ch;

            plate.format = "PDF";

            plate.layoutOptions = {

                "authorText": "北京轨道交通指挥中心",

                "copyrightText": "<北京轨道交通指挥中心>",

                "legendLayers": [],

                "titleText": "北京地铁路网图",

                "scalebarUnit": "Kilometers"

            };

            return plate;

        });

       

        // create the print dijit

        printer = new esri.dijit.Print({

            "map": map,

            //"templates": templates,

            url: mapPrintService

        }, dojo.byId("print_button"));

        printer.startup();

    },function () { }); //(handlerEnd, errohandler start)

 

}

 

 

用控件打印

Html code:

<div id="print_button"></div>

 

PrintCode:

var printer

function startPrintEasyTask() {

       printer = new esri.dijit.Print({

            "map": map,

            //"templates": templates,

            url: mapPrintService

        }, dojo.byId("print_button"));

        printer.startup();

}

 

 

 

 

 

 

 

 

 

14 jsAPI各版本新特性

3.7特性

支持 on(“mouse-move”,function(){});

map1.on("extent-change", onExtentChange);

     map1.on("pan",onPan);

     map1.on("mouse-move", drawCoordinates1);

     map1.on("mouse-drag", drawCoordinates1);

 

举例:

  map.on("mouse-move",function(evt){

            console.log("mouse coord is:(x,y)=("+evt.mapPoint.x+","+evt.mapPoint.y+")");           

         });

 

 

 

 

 

15 浏览器对事件支持

 

事件

支持版本

不支持

Mouse-move

IE7,IE8,IE9,IE10

 

Mouse-pan

IE7,IE8,IE9,IE10

 

Mouse-drag

Mouse-drag-start

Mouse-drag-end

IE7,IE8,IE9

IE10

Pan-out-of-box

IE10

IE9(IE9仅支持inside box pan)

 

 

 

 

 

 

95HTML5 特性

 Canvas to show Raster Layer

Cross-Origin-Resource Sharing

Requirement: both Server side and Browser support CORS

                     For server side, web servers must be pre-configured to support CORS.

           For browser , FF20 suppor CORS, while IE9 doesn’t by default

 

Boost: no proxy page needed any more

 

Details:

       Cross-Origin Resource Sharing(CORS) allows web applications to bypass a browser‘s same origin policy. When both the web server and browser support CORS, a proxy is not required to do cross-domain requests. This both simplifies application development and potentially provides a performance boost. Development is simplified because it is no longer necessary to maintain a proxy page on your server. The performance boost comes from accessing a resource directly rather than sending a request back to your server, which then requests the specified URL and returns the result.

 

Access Local file by drag/drop

 

 

Resource:

file:///F:/DevelopSoftware/ArcGIS%20Server%2010.1%20SP1_%E8%AF%B4%E6%98%8E_%E6%95%99%E7%A8%8B/JSAPI%E5%BC%80%E5%8F%91%E7%AC%94%E8%AE%B0/JavascriptAPI_Reference/v33_Samples/arcgis/exp_dragdrop.html

 

Local Storage

  原文地址:http://www.cnblogs.com/xiaowei0705/archive/2011/04/19/2021372.html

 

//判断是否支持:

if(window.localStorage){
  alert(‘This browser supports localStorage‘);
}else{
  alert(‘This browser does NOT support localStorage‘);
}

 

//读写:

localStorage.a = 3;//设置a为"3"
localStorage["a"] = "sfsf";//设置a为"sfsf",覆盖上面的值
localStorage.setItem("b","isaac");//设置b为"isaac"
var a1 = localStorage["a"];//获取a的值
var a2 = localStorage.a;//获取a的值
var b = localStorage.getItem("b");//获取b的值
localStorage.removeItem("c");//清除c的值

 

 

 

 

96POST & AJAX

解析Request的InputStream,QueryString

Post- InputStream

  /*descrition: convert, req data stream to string

     * when xhrPost, context.Request.InputStream will have data

     */

       public string getRequestInputStream(HttpContext context) {

        string result = "";

        System.IO.Stream stream = context.Request.InputStream;

        int dataLength=Convert.ToInt32(stream.Length);

        byte[] bufferBytes=new byte[dataLength];

        stream.Read(bufferBytes, 0, dataLength);

        //Decode format shall be same as charset in page

        result= HttpUtility.UrlDecode(bufferBytes, System.Text.Encoding.UTF8);

  

        return result;

    }

 

 

Get-QueryString

 

"OStations:苹果园,国贸,passStations:西直门,建国门,DStations:五道口,芍药居,Date:2013-04-01,Time:9:00-19:00"

服务端发httpRequest请求GET

          string newUrl = context.Request.QueryString["url"].ToString()+"?type=";

          System.Net.WebRequest newRequest = System.Net.WebRequest.Create(newUrl);

          System.Net.WebResponse response = newRequest.GetResponse();

          System.IO.Stream responseStream = response.GetResponseStream();

          System.IO.StreamReader readStream = new System.IO.StreamReader(responseStream);

          string results = readStream.ReadToEnd();

          context.Response.Write(results);

服务端发httpRequest请求POST

  public void ProcessRequest (HttpContext context) {

        System.IO.Stream dataStream = context.Request.InputStream;

        string url = context.Request.QueryString["href"] ;

        string result = SendPostWebRequest(url, "POST", dataStream);

        context.Response.ContentType = "text/plain";

        context.Response.Write(result);

    }

 

 

/// <summary>

    /// 转发post请求

    /// </summary>

    /// <param name="url">newUrl</param>

    /// <param name="method">"POST"</param>

    /// <param name="dataStream">data stream</param>

    /// <returns>resultString</returns>

    public string SendPostWebRequest(string url,string method,System.IO.Stream dataStream) {

        //data transported on internet are stream.

        //1.stream ->stream.read(byte[],0,stream.length)  stream into bytes[]

        //2.streamReader=new streamReader(stream), streamReader.ReadToEnd()   stream to string

        //3.stream.write(bytes[],0,bytes.length)   bytes write into stream   

        System.Net.WebRequest request = System.Net.WebRequest.Create(url);

        request.Method = method;

        request.ContentType = "application/x-www-form-urlencoded";

        byte[] dataBytes = new byte[dataStream.Length];

        dataStream.Read(dataBytes, 0,dataBytes.Length);//stream into bytes[]

        System.IO.Stream postStream = request.GetRequestStream();

        postStream.Write(dataBytes, 0, dataBytes.Length);//bytes[] into stream

        postStream.Close();

        System.Net.WebResponse response=request.GetResponse();

 

        System.IO.Stream responseStream = response.GetResponseStream();

        System.IO.StreamReader sr = new System.IO.StreamReader(responseStream);//stream to string

        string resultString = sr.ReadToEnd();

        return resultString;

    }

 

AJAX发送GET和POST

AJAX军规

在url后面添加?time=一个不会重复的时间, 否则将受缓存影响

   var url = "http://localhost/ODWeb/getODHandler.ashx?type=&time=" + new Date().toLocaleString();

        xmlHttp.open("POST", url, true);

        xmlHttp.send(postData);

 

 

AJAX GET

function sendReq() {

        var xmlHttp = GetXmlHttpObject();

        xmlHttp.onreadystatechange = function () {

            if (this.readyState == 4) {

                alert(this.responseText); //call back snippets, use responseText for data

              

            }

        };

        var url="photos.json";

        xmlHttp.open("GET", url, true);

        xmlHttp.send(null);

    }

 

    function GetXmlHttpObject() {

        var xmlHttp = null;

        try {

            // Firefox, Opera 8.0+, Safari

            xmlHttp = new XMLHttpRequest();

        }

        catch (e) {

            // Internet Explorer

            try {

                xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");

            }

            catch (e) {

                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");

            }

        }

        return xmlHttp;

    }

AJAX POST

 

function sendReq() {

        var xmlHttp = GetXmlHttpObject();

        xmlHttp.onreadystatechange = function () {

            if (this.readyState == 4) {

                alert(this.responseText); //call back snippets, use responseText for data

            }

        };

        var url = "../getODHandler.ashx";

        xmlHttp.open("POST", url, true);

        xmlHttp.send(postData);

    }

 

    function GetXmlHttpObject() {

        var xmlHttp = null;

        try {

            // Firefox, Opera 8.0+, Safari

            xmlHttp = new XMLHttpRequest();

        }

        catch (e) {

            // Internet Explorer

            try {

                xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");

            }

            catch (e) {

                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");

            }

        }

        return xmlHttp;

    }

 

 

 

 

 

 

97 Type of Services in GIS Server

Dynamic Map Service

   

   MapDocument, share as Service

 

 

NetworkAnalysis  Service

 Tool:ArcMap ->share as

 Data requirements:  Network Dataset->New Route.

 Operation: Enable NAService in publish process

 Publish: Publish the Route is enough.

 

 

Geocoder Service

Introductions:

http://localhost:6080/arcgis/help/en/#/Geocode_services/01540000035t000000/

 

Steps:

  à1.create address locator in catlog

  à2.publish address locator as geocoder service

  à3.use javascript API to call service

 

 

Example:

Step1 Create a station Locator:

   à(1)open toolbox, search ”address Locator”,

   à(2) address Locator Style: General single field

        Reference data, station.shp

        Key Field:NAME

   à(3) select a place for locator, 3 files will be created:

              stationLocator.loc,

              stationLocator.loc.xml

              stationLocator.lox

   à(4) add the stationLocator into arcMap, Use the Find button

 In toolbar, select tab “Locator”, input a name ”xizhimen”, you’ll find a point shrink on map. By now, you’ve created a locator.

 

Step2 publish address locator to geocode service

 

After published to Server, visit this page, stationLocator/GeocodeServer, click the

Find address candidate, then input a address for search, if location returned, works well.

Example:

http://localhost:6080/arcgis/rest/services/subwayWGS84/stationLocator/GeocodeServer/findAddressCandidates?SingleKey=%E4%B8%9C%E7%9B%B4%E9%97%A8&Single+Line+Input=&outFields=&outSR=&searchExtent=&f=html

 

 

 

 

 

 

Image Service

 

What dataSource can be published as Image Service

à1Raster Dataset (栅格数据集)

à2Raster Layer(数据集中的某个图层)

à3Mosaic Dataset (镶嵌数据集)

à4Mosaic Layer(数据集中的某个图层)

 

 

备注,RasterCatalog 是“栅格目录”

Steps:

 Right click the raster dataset in Arccatlog, share as image Service

 

 

Key:

image service  (arcMap help)

 

ResultURL:

http://10.254.53.85:6080/arcgis/rest/services/2012bjsubwayrouteCopy/ImageServer

 

 

à不拷贝数据到server目录下,如何发布服务

   设置影像数据为共享(有更好解决方式)

 

 

 

 

 

3 tools to publish services

Range: Server help

 

Key:How to publish service

http://localhost:6080/arcgis/help/en/#/How_to_publish_a_service/0154000004n3000000/

 

summary:

   service type:                                    tool

   àmap service, NA service                        arcMap

   àgeocoder service, geodatabase, imageService        catlog

   àgeoprocessing tool,Model                                  Results window

 

 

98 widget

Measurement widget

 

Geocoder And Locator

Workflow: shpà address Locatorà geocode service

 

 

 

Required service:

       stationLocator/GeocodeServer

    A geocodeserver contains geocode service

 

Required pre-data processing:

Toolbox create address locator

Catlog publish address locator as Geocode Service

 

Geocoder  snippets

 dojo.require("esri.dijit.Geocoder"); //geocoder widget (the searchTextBox)

 

var geocoderParas = [{ //self-defined geocoder

                url: "http://localhost:6080/arcgis/rest/services/subwayWGS84/stationLocator/GeocodeServer",

                name: "stationLocator"// name of Locator  in geocodeService

            }];

 

            geocoder = new esri.dijit.Geocoder({// construct geocoder widget

                map: map,

                autoComplete: true,

                arcgisGeocoder: false, //don‘t use argis global geocoder

                geocoders: geocoderParas,

                outFields: ["*"]

            }, "search");

            geocoder.startup();

 

             dojo.connect(geocoder, "onSelect", function (result) {//when one result is selected

                //result.feature is type graphic

                map.graphics.clear(); //clear previous graphics

                map.infoWindow.hide();

 

 

 

 

Locator snippets

备注:自己实现效率高

 

dojo.require("esri.tasks.locator");

 

++++++++++++++++++++++++++++++++++++++++++

  locator = new esri.tasks.Locator("http://localhost:6080/arcgis/rest/services/subwayWGS84/stationLocator/GeocodeServer");

          locator.outSpatialReference = map.spatialReference;

 

++++++++++++++++++++++++++++++++++++

//paras for locator. The address attributes coud be found in server side //geocoder’s locator

          var optionsFrom = {

              //address:{"SingleLine":dojo.byId("fromTxf").value},

              //outFields:["Loc_name"]

              address: { "SingleKey": dojo.byId("fromTxf").value },

              outFields: ["*"]

          }

 

var fromAddress = locator.addressToLocations(optionsFrom);//find the location

 

  var dList = new dojo.DeferredList([fromAddress]);

          dList.then(function(result){

                            var fromStop = getCandidate(results[0][1]);

});

 

 

Dijit.Menu

 

Dojo.connect(map,”onLoad”,function(){

//contextMenu

            ctxMenuForMap = new dijit.Menu({

                onOpen: function (box) {

                    currentLocation = getMapPointFromMenuPosition(box);

                }

            });

            ctxMenuForMap.addChild(new dijit.MenuItem({//add menuItem

                label: "设为起点",

                onClick: function (evt) {

                    if (graLayerCandidate.graphics.length == 0) { alert("未选中备选站"); return; }

                    var tempFeatureSet = { "features": [] };

                    for (var i = 0; i <= graLayerCandidate.graphics.length - 1; i++) {

                         var feature = graLayerCandidate.graphics[i];

                        tempFeatureSet.features.push(feature);

                    }

 

                    var formalizedFeatures = formalizeFSAttributes(tempFeatureSet, "o", "");

                    var ulObj = getUlByFeature(formalizedFeatures.features[0]);

                    var addedFeatures = addFeaturesToUlList(formalizedFeatures); //查询结果添加到列表,已经添加的不会再被添加

                    var featureSum = getLifeatureCount(ulObj);

                    updateFeaturesCount(ulObj, featureSum); //更新要素个数

 

                    for (var i = 0; i <= addedFeatures.length - 1; i++) {

                        var tempGra = new esri.Graphic(addedFeatures[i].geometry, new esri.symbol.PictureMarkerSymbol("src/assets/images/layer.png", 24, 24), addedFeatures[i].attributes, null);

                        graLayerSelectO.add(tempGra);

                    }

                    map.infoWindow.resize(200, 200);

                    map.infoWindow.hide();

                    graLayerCandidate.clear();

                    Navigation("pan");

                } //onclick end

            })); //menu set as start Points End

            ctxMenuForMap.addChild(new dijit.MenuItem({//add menuItem

                label: "设为终点",

                onClick: function (evt) {

                    if (graLayerCandidate.graphics.length == 0) { alert("未选中备选站"); return; }

                    var tempFeatureSet = { "features": [] };

                    for (var i = 0; i <= graLayerCandidate.graphics.length - 1; i++) {

                        var feature = graLayerCandidate.graphics[i];

                        tempFeatureSet.features.push(feature);

                    }

 

                    var formalizedFeatures = formalizeFSAttributes(tempFeatureSet, "d", "");

                    var ulObj = getUlByFeature(formalizedFeatures.features[0]);

                    var addedFeatures = addFeaturesToUlList(formalizedFeatures); //查询结果添加到列表,已经添加的不会再被添加

                    var featureSum = getLifeatureCount(ulObj);

                    updateFeaturesCount(ulObj, featureSum); //更新要素个数

 

                    for (var i = 0; i <= addedFeatures.length - 1; i++) {

                        var tempGra = new esri.Graphic(addedFeatures[i].geometry, new esri.symbol.PictureMarkerSymbol("src/assets/images/station_small.png", 24, 24), addedFeatures[i].attributes, null);

                        graLayerSelectD.add(tempGra);

                    }

 

                    map.infoWindow.resize(200, 200);

                    map.infoWindow.hide();

                    graLayerCandidate.clear();

                    Navigation("pan");

                } //onclick end

            })); //menu set as end Points End

            ctxMenuForMap.addChild(new dijit.MenuItem({//add menuItem

                label: "清空备选站",

                onClick: function (evt) {

                    graLayerCandidate.clear();

                    Navigation("pan");

                }

            }));

            ctxMenuForMap.bindDomNode(map.container);

            ctxMenuForMap.startup();

 

            // Helper Methods

            function getMapPointFromMenuPosition(box) {

                var x = box.x, y = box.y;

                switch (box.corner) {

                    case "TR":

                        x += box.w;

                         break;

                    case "BL":

                        y += box.h;

                        break;

                    case "BR":

                        x += box.w;

                        y += box.h;

                        break;

                }

 

                var screenPoint = new esri.geometry.Point(x - map.position.x, y - map.position.y);

                return map.toMap(screenPoint);

            }

 

})//end map onLoad

 

 

解除右键菜单显示

function selectDistrict() {

    //dojo.byId("map").style.cursor = "pointer";

    ctxMenuForMap.unBindDomNode(map.container);

}

 

MenuItem显隐

ctxMenuForMap.containerNode.childNodes;

ctxMenuForMap.containerNode.childNodes[0].disabled=true;//是否可选

ctxMenuForMap.containerNode.childNodes[0].style.display="block"//显隐

 

dgrid.OnDemandGrid

 

 

 

 

备注:自己实现效率高

 

 

 

Download the js

 

 

 

require

dojo.require("dgrid.OnDemandGrid");//grid

    dojo.require("dgrid.Selection");

    dojo.require("dojo.store.Memory");

    dojo.require("dojo._base.declare");

    dojo.require("dojo.number");

    dojo.require("dojo.parser");

    dojo.require("dojo.domReady!");

 

create grid and fill in data

function createGrid(startStations, destinations) {

    if (startStations.length == 0 || destinations.length == 0) {

        alert("D or O hasn‘t been selected");

        return;

    }

 

     window.grid = new (dojo.declare([dgrid.OnDemandGrid, dgrid.Selection]))({

              bufferRows: Infinity, //show all records

              columns: {

                  "OriginName": "发站名",

                  "DestinationName": "到站名", //(columnName and columeTitle)

                  "CheckOutNum": "到站人数"

              }

          }, "grid");//create Grid

 

……………………………

 

var data = []; //set Data

   for (var i = 0; i <= validStartStations.length - 1; i++) {//(data for grid)

                  for (var j = 0; j <= validdestiNationFs.length - 1; j++) {

                      data.push({ "OriginName": validStartStations[i].attributes.NAME, "DestinationName": validdestiNationFs[j].attributes.NAME, "CheckOutNum": 1000 });

                   }

              }

              var memStore = new dojo.store.Memory({ data: data });

              window.grid.set("store", memStore);

              window.grid.refresh();

 

 

clearData

window.grid.set(‘store‘,new dojo.store.Memory({data:[]}));

 

 

singleSelect when clickRow

//添加 id属性,  grid.select(rowID)

//ID不能含中文字符

          grid.on(".dgrid-row:click", function (e) {

              clearRoutes();

              var rowID;

              var orinName;

              var destName;

 

              if (navigator.appName == "Netscape") {//FF

                  rowID = this.childNodes[0].childNodes[0].innerHTML;

                  orinName = this.childNodes[0].childNodes[1].innerHTML;

                  destName = this.childNodes[0].childNodes[2].innerHTML;

              }

              else { //IE

                  var tempData = this.innerText.split("\r\n\r\n");

                  rowID = dojo.trim(tempData[0]);

                  orinName = dojo.trim(tempData[1]);

                  destName = dojo.trim(tempData[2]);

              }

              grid.clearSelection();//clear selection

              grid.select(rowID);//select OneRow

          });

 

Get a Row

grid.row(gRowID[0])

 

移除row:

grid.row(gRowID[0]).remove()

 

Get selectedRow ID ,Clear Selected

Grid.selection

grid.clearSelection();

 

 

 

 

 

 

设置列宽

How to figure out: showGrid(), 复制innerHTML,找到列 class规则

添加css限制列宽

 

/*grid 列宽,其余部分在js/dgrid/css/dgrid*/

.dgrid-column-id{ width:50px;}

.dgrid-column-OriginName{ width:80px;}

.dgrid-column-DestinationName{ width:80px;}

.dgrid-column-TransferName{ width:150px;}

.dgrid-column-Directions{ width:400px;}

.dgrid-column-Distance{ width:50px;}

.dgrid-column-StationCount{ width:50px;}

.dgrid-column-CheckOutNum{ width:50px;}

.dgrid-column-ODPartition{ width:50px;}

.dgrid-column-ODTotal{ width:50px;}

.dgrid-column-Price{ width:50px;}

.dgrid-cell {font-size:14px;}

 

 

Grid三样式

HowTodo:

开着console玩

 

Dijit.TitlePane 控制展开/收缩

dijit.byId("dvSearchPart").set("open",false)

dijit.byId("dvSearchPart").set("open",true)

 

获取状态

dijit.byId("dvSearchPart").get("open")

dijit.byId("dvSearchPart").get("open")

 

 

备注:自己实现效率高

 

 

 

 

BasemapGallery 地图切换控件(影像、栅格)

 

 

functioncreateBasemapGallery(){

       var basemaps=[];

    require(["esri/dijit/BasemapLayer","esri/dijit/Basemap","esri/dijit/BasemapGallery"],

             function(BasemapLayer,Basemap,BasemapGallery){

                var streetMap = new esri.dijit.Basemap({

                    layers: [new esri.dijit.BasemapLayer({

                       url: "http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer"

                    })],

                    id: "StreetMap",

                    title: "Street Map View",

                    thumbnailUrl:"img/lightColor.jpg"

                 });

                 basemaps.push(streetMap);

                

                 var satelliteMap = new esri.dijit.Basemap({

                     layers: [new esri.dijit.BasemapLayer({

                       url: "http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer"

                     })],

                    id: "Satellite",

                    title: "Satellite View",

                    thumbnailUrl:"img/sateImage.jpg"

                   });

                

                 basemaps.push(satelliteMap);  

                 basemapGallery = new esri.dijit.BasemapGallery({

                   showArcGISBasemaps: false,

                   basemaps: basemaps,

                   map: map

                 },"dvBmGallery");

                 basemapGallery.startup();

                 

             }//end para2

       );//end require      

    }//end createBmGallery

 

 

 

2.切换地图,专题图一直在

 

Key: Basemap Gallery with operational layer

 

BasemapGallery

   dojo.require("esri.map");

        dojo.require("dijit.form.Button");

        dojo.require("dijit.layout.BorderContainer");

        dojo.require("dijit.layout.ContentPane");

        dojo.require("esri.dijit.BasemapGallery");

        dojo.require("esri.arcgis.utils");

 

        var map;

 

        function init() {

            map = new esri.Map("map");

            createBasemapGallery();

        }

 

        function createBasemapGallery() {

            //manually create basemaps to add to basemap gallery

            var basemaps = [];

            var waterTemplateLayer = new esri.dijit.BasemapLayer({

                // url: "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/WaterTemplate/LocalGovernmentInfrastructureBasemap/MapServer"

                url: "http://10.254.53.85:6080/arcgis/rest/services/TF/2012bjsubwayrouteCopy1/ImageServer"

            });

            var waterBasemap = new esri.dijit.Basemap({

                layers: [waterTemplateLayer],

                title: "影像图",

                thumbnailUrl: "src/thumbnails/hydroimage.png"

            });

            basemaps.push(waterBasemap);

 

            var publicSafetyLayer = new esri.dijit.BasemapLayer({

                // url: "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/PublicSafety/PublicSafetyBasemap/MapServer"

                url: "http://10.254.53.85:6080/arcgis/rest/services/TF/baseMap/MapServer"

            });

            var publicSafetyBasemap = new esri.dijit.Basemap({

                layers: [publicSafetyLayer],

                 title: "行政图",

                thumbnailUrl: "src/thumbnails/district.png"

            });

            basemaps.push(publicSafetyBasemap);

 

            var basemapGallery = new esri.dijit.BasemapGallery({

                showArcGISBasemaps: false,

                basemaps: basemaps,

                map: map

            }, "basemapGallery");

 

            var selectionHandler = dojo.connect(basemapGallery, "onSelectionChange", function () {

                dojo.disconnect(selectionHandler);

                 //add the esri population layer to the map

                var stationLayer = new esri.layers.ArcGISDynamicMapServiceLayer("http://10.254.53.85:6080/arcgis/rest/services/TF/newmap/MapServer");

                map.addLayer(stationLayer);

            });//选择完成之后,加载地铁站

 

            basemapGallery.startup();

 

 

            dojo.connect(basemapGallery, "onError", function (error) { console.log(error) });

        }

 

        dojo.ready(init);

 

备注:自己实现效率高

 

HTML CSS

 

<div class="switchBaseMapWidget" data-dojo-type="dijit.TitlePane" data-dojo-props="title:‘切换‘,open:false">

             < div id="basemapGallery" class="dijitTitlePaneContentInner" role="region" aria-hidden="true" aria-labelledby="titlePane_titleBarNode" data-dojo-attach-point="containerNode"></div>

           </div><!--switchBaseMapWidget-->

 

.switchBaseMapWidget{ position:absolute; z-index:2; left:205px;}/*底图切换控件*/

#basemapGallery{ width:120px;}/*底图切换控件*/

 

 

 

 

军规

 

界面,功能是产品,不是作业

   没做的东西,就没做。

   做好的东西,要给做完的样子

减少参数到1

  当函数不面向界面,

  减少参数:把多个参数,封装成对象的属性。传值对象。

只调用1次的函数 不要独立

  如果函数被调用次数只有1次,那就直接作为代码片段。

 

清空挂载在DOM元素上的对象、属性

dojo.byId("byAzimuthStart").removeAttribute(feature);

备注:方法,属性,对象在DOM中都是 Attribute

 

举例1:

   setAttribute(“disabled”,”disabled”); //控制是否可以点击

  removeAttibute(“disabled”);

 

举例2:

    dojo.byId("byAzimuthStart").removeAttribute(feature)//删除绑定在DOM上的要素

 

参数是出错的主要原因

 

 

 

路径分析 启示

à1不要做:

正则提取站数组

美化左侧面板

Graphic提示

 

à2要做:

  数组的deferlist查询

 

à3如何做

   把语句集中在一个函数中  query,自己写

   Deferlist,自己写

  

 

 

Arcgis Javascript API 开发笔记,布布扣,bubuko.com

原文:http://www.cnblogs.com/imihiroblog/p/3636782.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!