Arcgis Javascript API 开发笔记

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:

  • Map Layers - The code loops through each layer in the map and reports the layer ID, visibility, and opacity.
  • Spatial Reference - Reports the well-known ID (WKID) of the map's spatial reference.
  • Scales - Reports information about each scale level in the portlandParcels tiled map service layer. The function uses the ArcGISTiledMapServiceLayer.tileInfo property, which can show you how many scale levels are in the map cache, what scales they are, and what the resolution is at each scale.
  • Map width and height - Reports the map width and height in pixels.

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 地图切换控件(影像、栅格)

function
createBasemapGallery(){

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,自己写

上一篇:PyCharm实现高效远程调试代码


下一篇:fetch简明学习