ArcGIS 提供两种网络分析,即基于Geometric Network的有向网络或者设施网络和基于Network Dataset的无向网络,在这里网络的分析指后者,ArcGIS api支持网络分析中的最短路径分析、服务区分析、临近设施分析。本文主要讲的是临近设施分析,关于发布网络服务在这里就不在叙述了,三种分析发布相同,只是在后台ArcMap中处理方式有点区别。

一、概述

1、概念

临近设施服务计算事件和设施之间的行驶成本,并决定那一个距离最近,最后给出最佳的路径,在这里认为,这算是最短距离的升级版本

2、相关的类

  • ClosestFacilityTask(执行命令,声明需要一个Rest资源,即NAServer服务)
  • ClosestFacilityParameters(参数)
  • ClosestFacilitySolveResult(处理结果)(这里没用到,该类用处非常大)

二、参数声明与设置

            closestFacilityTask = new ClosestFacilityTask("http://localhost:6080/arcgis/rest/services/Test/CloseFacilityTest/NAServer/CloseFacility");//临近设施分析参数var params = new ClosestFacilityParameters();//单位params.impedenceAttribute = "Miles";params.defaultCutoff = 7.0;//是否返回事件信息params.returnIncidents = false;//是否返回路径params.returnRoutes = true;//路径是否有参数params.returnDirections = true;//服务点params.facilities = new FeatureSet();//事件点params.incidents = new FeatureSet();//点障碍params.pointBarriers = new FeatureSet();//空间参考params.outSpatialReference = map.SpatialReference;

在这里有很多参数可以设置,服务点、事件点、路径、空间参考,是必须要设置的,其他参数可以根据自己需要设置,这里FeatureSet是要素类的轻量级的表示,相当于地理数据中的一个要素类,Feature的集合,FeatureSet中的每个Feature可能包含Geometry、属性、符号、InfoTemplate。FeatureSet是api和arcgis server通讯的非常重要的对象。当使用查询、地理出咯i和路径分析的时候,FeatureSet常常作为这些分析功能的输入或输出参数。

三、符号样式

            //服务点符号样式var facilityPointSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.STYLE_SQUARE,20,new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,new Color([89, 95, 35]), 2),new Color([130, 159, 83, 0.40]));//事件点符号样式var incidentPointSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.STYLE_CIRCLE,16,new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,new Color([89, 95, 35]), 2),new Color([130, 159, 83, 0.40]));//障碍点的符号样式var barrierSymbol = new SimpleMarkerSymbol();barrierSymbol.style = SimpleMarkerSymbol.STYLE_X;barrierSymbol.setSize(12);barrierSymbol.setColor(new Color("#f1a340"));incidentsGraphicsLayer = new GraphicsLayer();//结果路径线符号样式var routePolylineSymbol = new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,new Color("#0078df"),4.0);

四、分析结果处理

function showRoute(solveResult) {//路径分析的结果var routeResults = solveResult.routes;//路径分析的长度var res = routeResults.length;if (res > 0) {for (var i = 0; i < res; i++) {var graphicroute = routeResults[i];var graphic = graphicroute;graphic.setSymbol(routePolylineSymbol);map.graphics.add(graphic);}}else {alert("没有返回结果");}}

五、全部源码

<!DOCTYPE html>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no"><title>Closest Facilities</title><link rel="stylesheet" href="https://js.arcgis.com/3.25/dijit/themes/claro/claro.css"><link rel="stylesheet" href="https://js.arcgis.com/3.25/esri/css/esri.css"><style type="text/css">#map{width: 100%;height: 600px;border: 1px solid #000;}</style><script src="https://js.arcgis.com/3.25/"></script><script src="../Scripts/jquery-1.7.1.js"></script></head><body><div id="map"></div><input id="server" type="button" value="服务点" /><input id="eventPoint" type="button" value="事件点" /><input id="barriers" type="button" value="障碍点" /><input id="analyse" type="button" value="分析" /><input id="clear" type="button" value="清除" /><script>       require(["dojo/on","dojo/dom","dojo/_base/array","esri/Color","dojo/parser","dijit/registry","esri/urlUtils","esri/map","esri/lang","esri/graphic","esri/InfoTemplate","esri/layers/GraphicsLayer","esri/renderers/SimpleRenderer","esri/layers/ArcGISDynamicMapServiceLayer","esri/geometry/Point","esri/tasks/FeatureSet","esri/tasks/ClosestFacilityTask","esri/tasks/ClosestFacilityParameters","esri/symbols/SimpleMarkerSymbol","esri/symbols/SimpleLineSymbol","esri/symbols/TextSymbol","dijit/form/ComboBox","dijit/layout/BorderContainer","dijit/layout/ContentPane"], function (on, dom, array, Color, parser, registry,urlUtils, Map, esriLang, Graphic, InfoTemplate, GraphicsLayer, SimpleRenderer, ArcGISDynamicMapServiceLayer,Point, FeatureSet,ClosestFacilityTask, ClosestFacilityParameters,SimpleMarkerSymbol, SimpleLineSymbol, TextSymbol) {var incidentsGraphicsLayer, routeGraphicLayer, closestFacilityTask;var map = new Map("map");var layer = new esri.layers.ArcGISDynamicMapServiceLayer("http://localhost:6080/arcgis/rest/services/Test/CloseFacilityTest/MapServer");map.addLayer(layer)closestFacilityTask = new ClosestFacilityTask("http://localhost:6080/arcgis/rest/services/Test/CloseFacilityTest/NAServer/CloseFacility");//临近设施分析参数var params = new ClosestFacilityParameters();//单位params.impedenceAttribute = "Miles";params.defaultCutoff = 7.0;//是否返回事件信息params.returnIncidents = false;//是否返回路径params.returnRoutes = true;//路径是否有参数params.returnDirections = true;//服务点params.facilities = new FeatureSet();//事件点params.incidents = new FeatureSet();//点障碍params.pointBarriers = new FeatureSet();//空间参考params.outSpatialReference = map.SpatialReference;//服务点符号样式var facilityPointSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.STYLE_SQUARE,20,new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,new Color([89, 95, 35]), 2),new Color([130, 159, 83, 0.40]));//事件点符号样式var incidentPointSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.STYLE_CIRCLE,16,new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,new Color([89, 95, 35]), 2),new Color([130, 159, 83, 0.40]));//障碍点的符号样式var barrierSymbol = new SimpleMarkerSymbol();barrierSymbol.style = SimpleMarkerSymbol.STYLE_X;barrierSymbol.setSize(12);barrierSymbol.setColor(new Color("#f1a340"));incidentsGraphicsLayer = new GraphicsLayer();//结果路径线符号样式var routePolylineSymbol = new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,new Color("#0078df"),4.0);//定义一个标志//selectPointID=0什么都不做//selectPointID=1是添加服务点//selectPointID=2是添加事件点//selectPointID=3是添加障碍点var selectPointID;//添加服务点$("#server").click(function () {selectPointID = 1;});//添加事件点$("#eventPoint").click(function () {selectPointID = 2;});//添加障碍点$("#barriers").click(function () {selectPointID = 3;});//清除所有障碍、事件、服务点和路径线on(map, "mouse-down", function (evt) {//通过selectPointID判断是添加是停靠点还是障碍点switch (selectPointID) {case 0:break;case 1://获得服务点的坐标var pointServer = evt.mapPoint;var gr = new Graphic(pointServer, facilityPointSymbol);//构建服务点的参数params.facilities.features.push(gr);break;case 2://获得事件点的坐标var pointEvent = evt.mapPoint;var gr = new Graphic(pointEvent, incidentPointSymbol);//构建事件点的参数params.incidents.features.push(gr);break;case 3://获得障碍点的坐标var pointBarrier = evt.mapPoint;var gr = new Graphic(pointBarrier, barrierSymbol);//构建障碍点的参数params.pointBarriers.features.push(gr);break;}//如果selectPointID不等于0,将点的坐标在地图上显示出来if (selectPointID != 0) {addTextPoint("服务点", pointServer, facilityPointSymbol);addTextPoint("事件点", pointEvent, incidentPointSymbol);addTextPoint("障碍点", pointBarrier, barrierSymbol);}});//文本符号:文本信息,点坐标,符号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);}//分析执行事件$("#analyse").click(function () {selectPointID = 0;//如果服务点或者事件点的个数有一个为0,提示用户参数输入不对if (params.facilities.features.length == 0 || params.incidents.features.length == 0) {alert("输入参数不全,无法分析");return;}//执行路径分析函数closestFacilityTask.solve(params, showRoute)});//处理路径分析返回的结果。function showRoute(solveResult) {//路径分析的结果var routeResults = solveResult.routes;//路径分析的长度var res = routeResults.length;if (res > 0) {for (var i = 0; i < res; i++) {var graphicroute = routeResults[i];var graphic = graphicroute;graphic.setSymbol(routePolylineSymbol);map.graphics.add(graphic);}}else {alert("没有返回结果");}}});</script>
</body>
</html>

六、成果图

七、总结

在这里我为了省事参数设置的不多,三种分析其实差别不是很大,使用的方式也比较相似,如果说恶心应该是在发布数据之前的构造网络,错误出一堆,奈何我对着不是个很了解,浪费了很多的时间,技术不行还需要很多努力。

转载于:https://www.cnblogs.com/tuboshu/p/10752345.html

ArcGIS API For JS之网络分析(临近设施分析)相关推荐

  1. arcgis api for js共享干货系列之一自写算法实现地图量算工具

    众所周知,使用arcgis api for js实现地图的量算工具功能,无非是调用arcgisserver的Geometry服务(http://localhost:6080/arcgis/rest/s ...

  2. arcgis api for js共享干货系列之二自定义Navigation控件样式风格

    arcgis api for js默认的Navigation控件样式风格如下图: 这样的风格不能说不好,各有各的爱好,审美观,这里也不是重点,这里的重点是如何自定义一套自己喜欢的样式风格呢:自己自定义 ...

  3. arcgis api for js之echarts开源js库实现地图统计图分析

    前面写过一篇关于arcgis api for js实现地图统计图的,具体见:http://www.cnblogs.com/giserhome/p/6727593.html 那是基于dojo组件来实现图 ...

  4. Arcgis API For js 的离线部署

    之前,因为所做的项目不大,一直用的都是在线的Arcgis API For js,后来意识到了搞开发,离线部署是必须要掌握的,在线资源属于不可控范畴,能够避免的尽量避免.所以有了这次记录,以防以后忘记. ...

  5. 【完整的WebGIS教程】7.1 ArcGIS API for JS行政区划导航(上)

    前一节回顾 在[完整的WebGIS教程]6.1 使用ArcGIS Server发布要素服务中,我们发布了三个要素服务,分别是省.市.区县的行政区划边界,其属性表中包含了Code(地区编码)和Name( ...

  6. GIS开发之二维地下管线综合管理系统(Arcgis)第四节 使用arcgis api for js 加载天地图

    GIS开发之二维地下管线综合管理系统(Arcgis)第四节 使用arcgis api for js 加载天地图 核心js文件 调用方式 调用结果 核心js文件 #通过定义加载天地图js文件,引用并组织 ...

  7. ArcGIS API for JS 4.x + Vue 【1】—— 显示地图和添加点线面

    系列文章目录 [1] ArcGIS API for JS 4.x + Vue 之 显示地图和添加点线面 文章目录 系列文章目录 前言 一.显示地图 安装依赖 1. 添加模块 2. 引入CSS样式 3. ...

  8. arcgis api for js入门开发系列三地图工具栏(含源代码)

    上一篇实现了demo的地图加载展示,在上篇实现的基础上,新增了地图工具栏以及通用地图控件功能,比如地图框选缩放.地图漫游.清空.量算工具.地图导航控件.地图比例尺控件.地图鹰眼图等等,总共分为5个部分 ...

  9. 使用HTML5定位的经纬度来实现ArcGIS API for js 中的定位

    文章目录 前言 一.arcgis api定位 二.HTML5+Arcgis JS实现定位 2.1 利用HTML5获取当前位置的经纬度 2.2 点击按钮执行定位 2.3 全部代码 总结 前言 定位功能的 ...

最新文章

  1. HASH 大量插入与查询
  2. 【转】C# 二维码生成
  3. Spark数据倾斜-采样倾斜key并分拆join操作-详细图解与代码
  4. 一个有关Update类型的存储过程的问题
  5. DreamWeaver连接Tomcat用以编辑和测试JSP
  6. 推荐:26种NLP练手项目(代码+数据)
  7. linux相关系统下qtcreator调试程序
  8. JavaScript学习(七十七)—统计字符串中出现次数最多的字符和每个字符出现的次数
  9. 如何自建云存储平台?
  10. (三)【机器人路径规划】Astar算法
  11. Kettle 添加备注
  12. 平面几何----用角平分线逆定理证明阿氏圆定理
  13. 实时云渲染+虚拟仿真实验解决方案
  14. log4j从入门到了解
  15. 致敬!那些在计算机科学领域闪耀的女性
  16. 解决spacedesk卸载/重装软件时显示 指定的账户已存在
  17. IPFS-Cluster 集群安装与验证测试
  18. 创业者的噩梦 -商业竞争究竟有多残酷和黑暗
  19. 中职组网络安全教你如何正确的颁发证书
  20. python实现匈牙利算法

热门文章

  1. 搭建PHP本地服务器(XAMPP)
  2. 使用Myeclipse完成Hibernate的逆向工程
  3. 字符串系列函数(不断跟新)
  4. 很口语blood-aholic
  5. C# CheckedListBox控件的用法
  6. echarts的tree怎么控制位置_自动化考研保研面试—线性系统控制器设计
  7. docker开放的端口_关于docker自动开放端口解决方案
  8. python3虚拟环境使用教程_python虚拟环境完美部署教程
  9. jsoup 获取html中body内容_Java 进阶 利用Jsoup获取HTML页面的各分页中的标题信息...
  10. argb可以和rgb同步吗_神光同步酷炫幻彩,安钛克光棱120 RGB风扇套装