目录
路径分析
注:本片文章只着重介绍发布最短路服务和调用服务,ArcGIS最短路分析只执行最简单的步骤,如【高级编辑→打断相交线】、【拓扑检查】等操作省略
对path.shp的线要素,新建网络数据集
连通性
一直【下一步】,直到【连通性】,设置为“任意节点”
新建路径
当然如果需求,也一并【新建服务区】、【新建最近设施】等
最短路径服务发布
在【功能】中选择Network Analysis
在ArcGIS Server(http://localhost:6080/arcgis/manager/ )中查看服务
http://localhost:6080/arcgis/rest/services在可以看到有两个服务
MapServer:地图服务
NAServer:网络数据集服务(这个解释也不知道对不对,反正是我们要的服务)
调用NAService服务
为什么MapServer服务和NAServer服务一起调用呢,是因为空间参考坐标要一致,这样对初学者来说简单。
当然可以只调用NAServer,这个NAServer也可在WebScene中调用,但是shp中的线不能用Z(高程)坐标
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>最优路径分析</title>
<link rel="stylesheet" href="http://js.arcgis.com/3.9/js/esri/css/esri.css">
<script src="http://js.arcgis.com/3.9/"></script>
</head>
<body class="claro">
<button onclick="addStops()">增加站点</button>
<button onclick="clearStops()">清除站点</button>
<button onclick="addBarriers()">增加路障</button>
<button onclick="clearBarriers()">清除路障</button>
<button onclick="solveRoute()">路径分析</button>
<button onclick="clearRoutes()">清除路径</button>
<br /><br />
<div id="map" style="width:600px; height:400px; border:1px solid #000;"></div>
<ul>
<li>单击“增加站点”按钮,然后在地图中点击,增加路径需要经过的站点。</li>
<li>单击“增加路障”按钮,然后在地图中点击,增加路障</li>
<li>单击“路径分析”按钮,进行路径分析</li>
</ul>
</body>
</html>
<script>
var map, routeTask, routeParams, routes = [];
var stopSymbol, barrierSymbol, routeSymbol;
var mapOnClick_addStops_connect = null, mapOnClick_addBarriers_connect = null;
require(["esri/map", "esri/geometry/Extent", "esri/SpatialReference", "esri/layers/ArcGISTiledMapServiceLayer",
"esri/symbols/SimpleMarkerSymbol", "esri/symbols/SimpleLineSymbol", "esri/Color",
"esri/tasks/RouteTask", "esri/tasks/RouteParameters", "esri/tasks/FeatureSet", "dojo/domReady!"],
function (Map, Extent, SpatialReference, ArcGISTiledMapServiceLayer, SimpleMarkerSymbol, SimpleLineSymbol, Color,
RouteTask, RouteParameters, FeatureSet) {
map = new Map("map", {
center:[117.998926,36.812481],
});
var layer = new esri.layers.ArcGISDynamicMapServiceLayer("http://localhost:6080/arcgis/rest/services/path/MapServer");
//var streetMap = new ArcGISTiledMapServiceLayer("http://localhost:6080/arcgis/rest/services/SampleWorldCities/MapServer");
map.addLayer(layer);
//http://localhost:6080/arcgis/rest/services/%E6%9C%80%E7%9F%AD%E8%B7%AF/MapServer
routeTask = new RouteTask("http://localhost:6080/arcgis/rest/services/path/NAServer/路径");
routeParams = new RouteParameters();
routeParams.stops = new FeatureSet();
routeParams.barriers = new FeatureSet();
stopSymbol = new SimpleMarkerSymbol().setStyle(SimpleMarkerSymbol.STYLE_CROSS).setSize(15);
stopSymbol.outline.setWidth(3);
barrierSymbol = new SimpleMarkerSymbol().setStyle(SimpleMarkerSymbol.STYLE_X).setSize(10);
barrierSymbol.outline.setWidth(3).setColor(new Color([255, 0, 0]));
routeSymbol = new SimpleLineSymbol().setColor(new Color([0, 0, 255, 0.5])).setWidth(5);
});
//Begins listening for click events to add stops
function addStops() {
removeEventHandlers();
mapOnClick_addStops_connect = map.on("click", addStop);
}
//Clears all stops
function clearStops() {
removeEventHandlers();
for (var i = routeParams.stops.features.length - 1; i >= 0; i--) {
map.graphics.remove(routeParams.stops.features.splice(i, 1)[0]);
}
}
//Adds a stop. The stop is associated with the route currently displayed in the dropdown
function addStop(evt) {
require(["esri/graphic"], function (Graphic) {
var graphic = new Graphic(evt.mapPoint, stopSymbol);
routeParams.stops.features.push(
map.graphics.add(graphic)
);
});
}
//Begins listening for click events to add barriers
function addBarriers() {
removeEventHandlers();
mapOnClick_addBarriers_connect = map.on("click", addBarrier);
}
//Clears all barriers
function clearBarriers() {
removeEventHandlers();
for (var i = routeParams.barriers.features.length - 1; i >= 0; i--) {
map.graphics.remove(routeParams.barriers.features.splice(i, 1)[0]);
}
}
//Adds a barrier
function addBarrier(evt) {
require(["esri/graphic"], function (Graphic) {
var graphic = new Graphic(evt.mapPoint, barrierSymbol);
routeParams.barriers.features.push(
map.graphics.add(graphic)
);
});
}
//Stops listening for click events to add barriers and stops
function removeEventHandlers() {
if (mapOnClick_addStops_connect != null) {
mapOnClick_addStops_connect.remove();
}
if (mapOnClick_addBarriers_connect != null) {
mapOnClick_addBarriers_connect.remove();
}
}
//Solves the routes. Any errors will trigger the errorHandler function.
function solveRoute() {
removeEventHandlers();
routeTask.solve(routeParams, showRoute, errorHandler);
}
//Clears all routes
function clearRoutes() {
for (var i = routes.length - 1; i >= 0; i--) {
map.graphics.remove(routes.splice(i, 1)[0]);
}
routes = [];
}
//Draws the resulting routes on the map
function showRoute(result) {
clearRoutes();
var routeResults = result.routeResults;
routes.push(
map.graphics.add(routeResults[0].route.setSymbol(routeSymbol))
);
var msgs = ["服务器消息:"];
for (var i = 0; i < result.messages.length; i++) {
msgs.push(result.messages[i].type + " : " + result.messages[i].description);
}
if (msgs.length > 1) {
alert(msgs.join("\n - "));
}
}
//Reports any errors that occurred during the solve
function errorHandler(err) {
alert("发生错误\n" + err.message + "\n" + err.details.join("\n"));
}
</script>