1.效果图
分析经过停靠点,避开障碍点之间的最优路径
2.发布服务
在ArcMap中进行网络分析制图后需要发布地图服务才可以被调用。
- 为了以后方便,全选择
- 打开工具条,进行新建路径等,结束制图后进行服务发布
发布服务时,需要增加Network Analysis功能
- 成功发布之后进入
http://localhost:6080/arcgis/rest/services
找到存放目录
这样说明服务发布成功了 - 选择
(NAServer)
后缀的链接,复制URL
- 创建好之后
- 新建路径
- 新建的路径图层名称
- 创建路径分析对象的时候参数为
URL+/图层名称
- 例如:
http://localhost:6080/arcgis/rest/services/webgis/fzkt_streets_ND/NAServer/路径
2.引入模块
"esri/tasks/RouteTask",
"esri/tasks/FeatureSet",
3.分析
-
定义
- 停靠点符号
- 障碍点符号
- 文本符号
- 路径符号
-
网络分析
- 创建路径分析对象
- 创建路径分析参数对象
- 设置分析参数参考坐标系
- 设置分析参数对象的障碍点和停靠点属性实例化要素集
- 设置分析参数返回无方向
- 设置分析参数返回路径
-
事件
- 添加停靠点的点击事件
- 添加障碍点的点击事件
- 添加地图的mouse-down监听事件
- 添加分析的点击事件
-
函数
- 添加简单图形符号函数
- 添加文本符号函数
- 路径分析返回结果处理函数
4. 完整代码
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Geometric _Network</title>
<link rel="stylesheet" href="https://js.arcgis.com/3.28/esri/css/esri.css" />
<script src="https://js.arcgis.com/3.28/"></script>
<style type="text/css">
.MapClass {
width: 100%;
height: 600px;
border: 1px solid #000;
}
</style>
<script type="text/javascript">
require(["esri/map",
"dojo/on",
"dojo/dom",
"esri/layers/ArcGISDynamicMapServiceLayer",
"esri/tasks/RouteTask",
"esri/tasks/FeatureSet",
"esri/symbols/SimpleMarkerSymbol",
"esri/symbols/TextSymbol",
"esri/toolbars/draw",
"esri/symbols/SimpleLineSymbol",
"esri/tasks/RouteParameters",
"dojo/colors",
"esri/graphic",
"dojo/domReady!"],
function (Map, on, dom,
ArcGISDynamicMapServiceLayer,
RouteTask,
FeatureSet,
SimpleMarkerSymbol,
TextSymbol,
Draw,
SimpleLineSymbol,
RouteParameters,
Color,
Graphic
) {
var map = new Map("MyMapDiv");
var layer = new ArcGISDynamicMapServiceLayer("http://localhost:6080/arcgis/rest/services/webgis/fzkt_streets_ND/MapServer");
map.addLayer(layer)
//创建路径分析对象
var shortestAnalyst = new RouteTask("http://localhost:6080/arcgis/rest/services/webgis/fzkt_streets_ND/NAServer/路径");
//创建路径参数对象
var routeParas = new RouteParameters();
//障碍点
routeParas.barriers = new FeatureSet();
//停靠点
routeParas.stops = new FeatureSet();
routeParas.returnDirections = false;
routeParas.returnRoutes = true;
//空间参考
routeParas.outSpatialReference = map.SpatialReference;
var selectPointID;
on(dom.byId("stop"), "click", function () {
selectPointID = 1;
})
on(dom.byId("barriers"), "click", function () {
selectPointID = 2;
})
//停靠点的符号
var stopSymbol = new SimpleMarkerSymbol();
stopSymbol.style = SimpleMarkerSymbol.STYLE_CROSS;
stopSymbol.setSize(15);
//障碍点的符号
var barrierSymbol = new SimpleMarkerSymbol();
barrierSymbol.style = SimpleMarkerSymbol.STYLE_CIRCLE;
barrierSymbol.setSize(14);
barrierSymbol.setColor(new Color("#f1a340"));
on(map, "mouse-down", function (evt) {
switch (selectPointID) {
case 0:
break;
case 1:
var pointStop = evt.mapPoint;
var gr = new Graphic(pointStop, stopSymbol);
routeParas.stops.features.push(gr);
break;
case 2:
var pointBarrier = evt.mapPoint;
var gr = new Graphic(pointBarrier, barrierSymbol);
routeParas.barriers.features.push(gr);
break;
}
if (selectPointID != 0) {
addPoint(pointStop, stopSymbol)
addTextPoint("障碍点", pointBarrier, barrierSymbol);
selectPointID = 0;
}
});
//单一
function addPoint(point, symbol) {
var graphicpoint = new Graphic(point, symbol);
map.graphics.add(graphicpoint);
}
//文本
function addTextPoint(text, point, symbol) {
var textSymbol = new TextSymbol(text);
textSymbol.setColor(new Color([128, 0, 0]));
var graphicText = Graphic(point, textSymbol);
var graphicpoint = new Graphic(point, symbol);
map.graphics.add(graphicpoint);
map.graphics.add(graphicText);
}
on(dom.byId("analyse"), "click", function () {
if (routeParas.stops.features.length == 0) {
alert("ERROR");
return;
}
shortestAnalyst.solve(routeParas, showRoute)
})
//处理路径分析返回的结果。
function showRoute(solveResult) {
console.log(solveResult)
var routeResults = solveResult.routeResults;
//路径分析的长度
var res = routeResults.length;
routeSymbol = new SimpleLineSymbol(SimpleLineSymbol.STYLE_DASH, new Color([0, 0, 255, 0.5]), 3);
if (res > 0) {
for (var i = 0; i < res; i++) {
var graphic = routeResults[i].route;
graphic.setSymbol(routeSymbol);
map.graphics.add(graphic);
}
}
else {
alert("Null");
}
}
});
</script>
</head>
<body>
<input id="stop" type="button" value="停靠点" />
<input id="barriers" type="button" value="障碍点" />
<input id="analyse" type="button" value="分析" />
<div id="MyMapDiv" class="MapClass"></div>
</body>
</html>