因为在上一章中已经介绍了四个用于查询的Task类了,有关ArcGIS Server怎样公布NAServer

要说网页端最经典的GIS应用,非互联网分析莫属了。

怎么着?你没用过?百度高德谷歌地图的门路分析就是实实在在的例子啊!只然则它们是根据大实际背景优化了结果突显而已。

这些事例使用RouteTask进行互连网分析,作者会先讲讲怎么着是RouteTask,再讲讲这些事例是怎么用的,那么些例子代码量不多。

在法定的例子中,标题为:SimpleRouting –
RouteTask

要说网页端最经典的GIS应用,非网络分析莫属了。

什么?你没用过?百度高德谷歌(谷歌)地图的门道分析就是无可争议的事例啊!只可是它们是依据大实际背景优化了结果呈现而已。

其一事例使用RouteTask举办互连网分析,小编会先讲讲怎么着是RouteTask,再讲讲那几个例子是怎么用的,这几个事例代码量不多。

在合法的例子中,标题为:SimpleRouting –
RouteTask



探望结果

图片 1

点击七个点,安静等待十秒左右就会出现那些玉玉石白的门道了。当然右键点击也是同样的。反应比较慢。

看看结果

图片 2

点击多少个点,安静等待十秒左右就会油然则生那几个黑褐的门路了。当然右键点击也是一模一样的。反应比较慢。

RouteTask类

本条例子用到了那一个类,务必先介绍一下,因为在上一章中已经介绍了五个用于查询的Task类了。

图片 3

介绍上说,RouteTask允许用户在AJS中有益地在加以的点上进行最短路径查询,RouteTask使用ArcGIS
Server公布的互联网分析服务(NAServer)。

有关ArcGIS Server怎么着发表NAServer,小编会在作者另1个多重中写一写。

那就表明了RouteTask是行使Server的REST UKoleosL进行实例化的。

它最常用的是solve()方法。(与AO3遍开发类似)

如出一辙的,它也有相应的RouteParameters和RouteResult类。

RouteTask类

这些事例用到了这一个类,务必先介绍一下,因为在上一章中已经介绍了七个用于查询的Task类了。

图片 4

介绍上说,RouteTask允许用户在AJS中有益地在加以的点上举行最短路径查询,RouteTask使用ArcGIS
Server发表的网络分析服务(NAServer)。

关于ArcGIS Server怎样发表NAServer,作者会在自个儿另一个漫山遍野中写一写。

那就认证了RouteTask是选用Server的REST U讴歌ZDXL举行实例化的。

它最常用的是solve()方法。(与AO三遍开发类似)

同一的,它也有照应的RouteParameters和RouteResult类。

RouteParameters和RouteResult类

图片 5

其一参数类具有互联网分析特有的质量:如途径点、障碍点、阻抗属性等,见桌面GIS互连网分析的文档。

图片 6

RouteTask的回到结果。取决于RouteParameters的参数设置。


 

好,大家正式开班吧。

RouteParameters和RouteResult类

图片 7

以此参数类具有互联网分析特有的属性:如途径点、障碍点、阻抗属性等,见桌面GIS互联网分析的文档。

图片 8

RouteTask的回到结果。取决于RouteParameters的参数设置。


 

好,我们正式开班吧。

提交引用 

require([
  "esri/Map", "esri/views/MapView",
  "esri/Graphic", "esri/layers/GraphicsLayer",
  "esri/tasks/RouteTask", "esri/tasks/support/RouteParameters",
  "esri/tasks/support/FeatureSet",
  "esri/symbols/SimpleMarkerSymbol", "esri/symbols/SimpleLineSymbol",
  "esri/Color",
  "esri/core/urlUtils",
  "dojo/on",
  "dojo/domReady!"
  ], 
  function(Map, MapView, Graphic, GraphicsLayer, RouteTask, RouteParameters,
  FeatureSet, SimpleMarkerSymbol, SimpleLineSymbol, Color, urlUtils, on) {
   ...
  }
);

用到的模块很多。

付出引用 

require([
  "esri/Map", "esri/views/MapView",
  "esri/Graphic", "esri/layers/GraphicsLayer",
  "esri/tasks/RouteTask", "esri/tasks/support/RouteParameters",
  "esri/tasks/support/FeatureSet",
  "esri/symbols/SimpleMarkerSymbol", "esri/symbols/SimpleLineSymbol",
  "esri/Color",
  "esri/core/urlUtils",
  "dojo/on",
  "dojo/domReady!"
  ], 
  function(Map, MapView, Graphic, GraphicsLayer, RouteTask, RouteParameters,
  FeatureSet, SimpleMarkerSymbol, SimpleLineSymbol, Color, urlUtils, on) {
   ...
  }
);

用到的模块很多。

函数骨架

function(...){
    urlUtils.addProxyRule({...});
    var routeTask = new RouteTask({
        url: "https://route.arcgis.com/arcgis/rest/services/World/Route/NAServer/Route_World"
    });
    var routeLyr = new GraphicsLayer();
    var routeParams = new RouteParameters({...});

    var stopSymbol = new SimpleMarkerSymbol({...});
    var routeSymbol = new SimpleLineSymbol({...});

    var map = new Map({...});
    var view = new MapView({...});

    on(view, "click", addStop);

    function addStop(event){...};
    function showRoute(event){...};
)

主要应该是routeTask、routeParams那八个变量,和view的click事件、addStop()方法、showRoute()方法。

五个变量用于实施互联网分析中的最短路径分析,而事件和章程就举办对分析结果的处理和呈现。

routeTask使用了NAServer,那是一个ArcGIS
Server的劳动,参考Server的文档即可。

urlUtils类和addProxyRule是何许?查询API得知:那是个对url举行管理设置的一个类,addProxyRule好像是添加一条代理设置。//有待考证,删除是不是足以推行网络分析。

八个标志:stopSymbol和routeSymbol是点击出现的十字点符号和路径分析结果的土红线。

所以最紧要就放在了routeParams、view的click事件和八个方法体上:

函数骨架

function(...){
    urlUtils.addProxyRule({...});
    var routeTask = new RouteTask({
        url: "https://route.arcgis.com/arcgis/rest/services/World/Route/NAServer/Route_World"
    });
    var routeLyr = new GraphicsLayer();
    var routeParams = new RouteParameters({...});

    var stopSymbol = new SimpleMarkerSymbol({...});
    var routeSymbol = new SimpleLineSymbol({...});

    var map = new Map({...});
    var view = new MapView({...});

    on(view, "click", addStop);

    function addStop(event){...};
    function showRoute(event){...};
)

要害应该是routeTask、routeParams这三个变量,和view的click事件、addStop()方法、showRoute()方法。

多个变量用于实施网络分析中的最短路径分析,而事件和办法就开展对分析结果的拍卖和呈现。

routeTask使用了NAServer,那是一个ArcGIS
Server的劳动,参考Server的文档即可。

urlUtils类和addProxyRule是怎么着?查询API获知:那是个对url进行管制设置的三个类,addProxyRule好像是添加一条代理设置。//有待考证,删除是或不是可以实施网络分析。

多少个标志:stopSymbol和routeSymbol是点击现身的十字点符号和路径分析结果的黑褐线。

于是最首要就坐落了routeParams、view的click事件和三个方法体上:

routeParams对象

var routeParams = new RouteParameters({
  stops: new FeatureSet(),
  outSpatialReference: {
    wkid: 3857
  }
});

stops是RouteParameters类的二个脾气,其体系为DataLayer只怕FeatureSet。

意思是:举行网络分析时所需求的途径点集合。

在此地,直接实例化了三个FeatureSet对象,可是是空对象。

routeParams对象

var routeParams = new RouteParameters({
  stops: new FeatureSet(),
  outSpatialReference: {
    wkid: 3857
  }
});

stops是RouteParameters类的三个属性,其项目为DataLayer可能FeatureSet。

意思是:进行互连网分析时所急需的途径点集合。

在那边,间接实例化了一个FeatureSet对象,然而是空对象。

click事件和1个方法体

on(view, "click", addStop);

function addStop(event) {
  var stop = new Graphic({
    geometry: event.mapPoint,
    symbol: stopSymbol
  });
  routeLyr.add(stop);

  routeParams.stops.features.push(stop);
  if (routeParams.stops.features.length >= 2) {
    routeTask.solve(routeParams).then(showRoute);
  }
}
function showRoute(data) {
  var routeResult = data.routeResults[0].route;
  routeResult.symbol = routeSymbol;
  routeLyr.add(routeResult);
}

视图的点击事件,即addStop方法。

先是会时有暴发三个新的图纸对象,其geometry属性赋值为了:点击的点地点对应的Point对象(在事变流中)。

标记则用上方定义的点符号/

下一场把这一个图片对象stop添加到routeLyr那么些图片图层中。

随即,把那些图形对象传递给routeParams。它说到底传递到了何地?

正好说了,stops给了2个FeatureSet对象,FeatureSet对象则有所1个features属性(类型为Graphic[]),将刚刚实例化的stop对象push进去。

诸如此类,RouteTask所需的RouteParameters中就多了一个内需停靠的点的新闻。

然后,判断停靠点的数据是还是不是高于等于2(两点才能一向嘛)

借使>=2,那么执行routeTask的solve方法,接着一个异步操作,回调函数为showRoute()。

showRoute()方法的功力是收获传入参数data的routeResults属性(其为routeResults[]类型)的首先个因素,即RouteResult对象。//data类型未知,查不到,应该是solve的回传。不过官方写着solve的再次回到值是RouteResult的实例…

然后把那几个RouteResult对象的route属性获取,并设置其标志为上方实例化的线符号,加入到routeLyr图形图层中。

——————

click事件和1个方法体

on(view, "click", addStop);

function addStop(event) {
  var stop = new Graphic({
    geometry: event.mapPoint,
    symbol: stopSymbol
  });
  routeLyr.add(stop);

  routeParams.stops.features.push(stop);
  if (routeParams.stops.features.length >= 2) {
    routeTask.solve(routeParams).then(showRoute);
  }
}
function showRoute(data) {
  var routeResult = data.routeResults[0].route;
  routeResult.symbol = routeSymbol;
  routeLyr.add(routeResult);
}

视图的点击事件,即addStop方法。

率先会生出三个新的图样对象,其geometry属性赋值为了:点击的点地点对应的Point对象(在事变流中)。

标志则用上方定义的点符号/

然后把那一个图形对象stop添加到routeLyr这几个图形图层中。

跟着,把那么些图片对象传递给routeParams。它最后传递到了哪个地方?

正好说了,stops给了1个FeatureSet对象,FeatureSet对象则拥有2个features属性(类型为Graphic[]),将刚刚实例化的stop对象push进去。

这么,RouteTask所需的RouteParameters中就多了3个亟需停靠的点的音信。

然后,判断停靠点的数目是或不是超过等于2(两点才能始终嘛)

假设>=2,那么执行routeTask的solve方法,接着一个异步操作,回调函数为showRoute()。

showRoute()方法的功效是拿到传入参数data的routeResults属性(其为routeResults[]序列)的首先个因素,即RouteResult对象。//data类型未知,查不到,应该是solve的回传。不过官方写着solve的再次回到值是RouteResult的实例…

然后把那一个RouteResult对象的route属性获取,并安装其标志为上方实例化的线符号,参与到routeLyr图形图层中。

——————

小结一下

标记、图层、地图、场景都是老调重弹了。

最根本的一部分即view的click事件,所接触的装有音讯,包罗RouteParameters对象的天性设置、RouteTask对象的solve方法的使用及RouteResult对象的数额处理。

点击视图——获取点位——设置RouteParameters对象——执行RouteTask.solve()——处理RouteResult对象。

 

最终交给完整代码:

图片 9图片 10

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no">
  <title>Simple Routing - RouteTask - 4.2</title>
  <style>
    html,
    body,
    #viewDiv {
      padding: 0;
      margin: 0;
      height: 100%;
      width: 100%;
    }

    #paneDiv {
      position: absolute;
      top: 10px;
      left: 62px;
      padding: 0 12px 0 12px;
      background-color: rgba(0, 0, 0, 0.5);
      color: white;
    }
  </style>

  <link rel="stylesheet" href="https://js.arcgis.com/4.2/esri/css/main.css">
  <script src="https://js.arcgis.com/4.2/"></script>

  <script>
    require([
      "esri/Map",
      "esri/views/MapView",
      "esri/Graphic",
      "esri/layers/GraphicsLayer",
      "esri/tasks/RouteTask",
      "esri/tasks/support/RouteParameters",
      "esri/tasks/support/FeatureSet",
      "esri/symbols/SimpleMarkerSymbol",
      "esri/symbols/SimpleLineSymbol",
      "esri/Color",
      "esri/core/urlUtils",
      "dojo/on",
      "dojo/domReady!"
    ], function(
      Map, MapView, Graphic, GraphicsLayer, RouteTask, RouteParameters,
      FeatureSet, SimpleMarkerSymbol, SimpleLineSymbol, Color, urlUtils, on
    ) {

      // proxy the route requests to avoid prompt for log in
      urlUtils.addProxyRule({
        urlPrefix: "route.arcgis.com",
        proxyUrl: "/sproxy/"
      });

      // Point the URL to a valid route service
      var routeTask = new RouteTask({
        url: "https://route.arcgis.com/arcgis/rest/services/World/Route/NAServer/Route_World"
      });

      // The stops and route result will be stored in this layer
      var routeLyr = new GraphicsLayer();

      // Setup the route parameters
      var routeParams = new RouteParameters({
        stops: new FeatureSet(),
        outSpatialReference: { // autocasts as new SpatialReference()
          wkid: 3857
        }
      });

      // Define the symbology used to display the stops
      var stopSymbol = new SimpleMarkerSymbol({
        style: "cross",
        size: 15,
        outline: { // autocasts as new SimpleLineSymbol()
          width: 4
        }
      });

      // Define the symbology used to display the route
      var routeSymbol = new SimpleLineSymbol({
        color: [0, 0, 255, 0.5],
        width: 5
      });

      var map = new Map({
        basemap: "streets",
        layers: [routeLyr] // Add the route layer to the map
      });
      var view = new MapView({
        container: "viewDiv", // Reference to the scene div created in step 5
        map: map, // Reference to the map object created before the scene
        center: [-117.195, 34.057],
        zoom: 14
      });

      // Adds a graphic when the user clicks the map. If 2 or more points exist, route is solved.
      on(view, "click", addStop);

      function addStop(event) {
        // Add a point at the location of the map click
        var stop = new Graphic({
          geometry: event.mapPoint,
          symbol: stopSymbol
        });
        routeLyr.add(stop);

        // Execute the route task if 2 or more stops are input
        routeParams.stops.features.push(stop);
        if (routeParams.stops.features.length >= 2) {
          routeTask.solve(routeParams).then(showRoute);
        }
      }
      // Adds the solved route to the map as a graphic
      function showRoute(data) {
        var routeResult = data.routeResults[0].route;
        routeResult.symbol = routeSymbol;
        routeLyr.add(routeResult);
      }
    });
  </script>
</head>
<body>
  <div id="viewDiv"></div>
  <div id="paneDiv">
    <div>
      <p>Click on the map to add stops to the route. The route from the last stop to
        the newly added stop is calculated. If a stop is not reachable, it is removed
        and the last valid point is set as the starting point.</p>
    </div>
  </div>
</body>
</html>

完整HTML代码

统计一下

标记、图层、地图、场景都以老生常谈了。

最关键的一对即view的click事件,所接触的具有新闻,包含RouteParameters对象的品质设置、RouteTask对象的solve方法的应用及RouteResult对象的数据处理。

点击视图——获取点位——设置RouteParameters对象——执行RouteTask.solve()——处理RouteResult对象。

 

末段交给完整代码:

图片 11图片 12

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no">
  <title>Simple Routing - RouteTask - 4.2</title>
  <style>
    html,
    body,
    #viewDiv {
      padding: 0;
      margin: 0;
      height: 100%;
      width: 100%;
    }

    #paneDiv {
      position: absolute;
      top: 10px;
      left: 62px;
      padding: 0 12px 0 12px;
      background-color: rgba(0, 0, 0, 0.5);
      color: white;
    }
  </style>

  <link rel="stylesheet" href="https://js.arcgis.com/4.2/esri/css/main.css">
  <script src="https://js.arcgis.com/4.2/"></script>

  <script>
    require([
      "esri/Map",
      "esri/views/MapView",
      "esri/Graphic",
      "esri/layers/GraphicsLayer",
      "esri/tasks/RouteTask",
      "esri/tasks/support/RouteParameters",
      "esri/tasks/support/FeatureSet",
      "esri/symbols/SimpleMarkerSymbol",
      "esri/symbols/SimpleLineSymbol",
      "esri/Color",
      "esri/core/urlUtils",
      "dojo/on",
      "dojo/domReady!"
    ], function(
      Map, MapView, Graphic, GraphicsLayer, RouteTask, RouteParameters,
      FeatureSet, SimpleMarkerSymbol, SimpleLineSymbol, Color, urlUtils, on
    ) {

      // proxy the route requests to avoid prompt for log in
      urlUtils.addProxyRule({
        urlPrefix: "route.arcgis.com",
        proxyUrl: "/sproxy/"
      });

      // Point the URL to a valid route service
      var routeTask = new RouteTask({
        url: "https://route.arcgis.com/arcgis/rest/services/World/Route/NAServer/Route_World"
      });

      // The stops and route result will be stored in this layer
      var routeLyr = new GraphicsLayer();

      // Setup the route parameters
      var routeParams = new RouteParameters({
        stops: new FeatureSet(),
        outSpatialReference: { // autocasts as new SpatialReference()
          wkid: 3857
        }
      });

      // Define the symbology used to display the stops
      var stopSymbol = new SimpleMarkerSymbol({
        style: "cross",
        size: 15,
        outline: { // autocasts as new SimpleLineSymbol()
          width: 4
        }
      });

      // Define the symbology used to display the route
      var routeSymbol = new SimpleLineSymbol({
        color: [0, 0, 255, 0.5],
        width: 5
      });

      var map = new Map({
        basemap: "streets",
        layers: [routeLyr] // Add the route layer to the map
      });
      var view = new MapView({
        container: "viewDiv", // Reference to the scene div created in step 5
        map: map, // Reference to the map object created before the scene
        center: [-117.195, 34.057],
        zoom: 14
      });

      // Adds a graphic when the user clicks the map. If 2 or more points exist, route is solved.
      on(view, "click", addStop);

      function addStop(event) {
        // Add a point at the location of the map click
        var stop = new Graphic({
          geometry: event.mapPoint,
          symbol: stopSymbol
        });
        routeLyr.add(stop);

        // Execute the route task if 2 or more stops are input
        routeParams.stops.features.push(stop);
        if (routeParams.stops.features.length >= 2) {
          routeTask.solve(routeParams).then(showRoute);
        }
      }
      // Adds the solved route to the map as a graphic
      function showRoute(data) {
        var routeResult = data.routeResults[0].route;
        routeResult.symbol = routeSymbol;
        routeLyr.add(routeResult);
      }
    });
  </script>
</head>
<body>
  <div id="viewDiv"></div>
  <div id="paneDiv">
    <div>
      <p>Click on the map to add stops to the route. The route from the last stop to
        the newly added stop is calculated. If a stop is not reachable, it is removed
        and the last valid point is set as the starting point.</p>
    </div>
  </div>
</body>
</html>

完整HTML代码