ArcGIS API For JavaScript官方文档(二十二)之地理处理

ArcGIS API For JS官方文档解析目录

一、ArcGIS JavaScript API 的geoprocessing(地理处理)概览

    Geoprocessing允许您自动地和链式地进行GIS分析操作。通过使用ArcGIS创建自定义tools(工具)和models(模型),您可以做到这一点。model通常由一系列可以在ESRI的ArcToolbox中看到的tool组成,通过逻辑方式将它们链接到一起完成特定的事情。例如:一个模型可以从一组输入点高度插入一个高程曲面,然后从该曲面上创建轮廓,您只需运行model,而不是手动从ArcToolbox中打开两个不同的工具。如果您需要在100个数据集上执行此操作,您可以使model自动运行100次。这使得geoprecessing既强大又方便。

    ArcGIS JavaScript API中的geoprecessor类使您能够访问运行在ArcGIS Server上的geoprocessing models这些model通过geoprocessing services公开。这些服务非常有用,因为geoprocessing可以计算密集型、并且需要GIS软件运行的tools和models。通常,将geoprocessing工作发送到集中服务器更有效,而不是在每台机器上安装软件,并使用每个机器的处理能力来执行分析。

    要使用Geoprocessor,您需要知道:

  • 您正在使用的geoprocessing model(task)的URL。
  • task所需的输入和输出
  • task是异步还是同步

    您可以在“Services Directory”中找到上面项提到的内容,这是对ArcGIS Server上可用的内容的浏览器描述。Services Directory的URL是http://<服务器名称>/<实例名>/rest/services。如果您不确定如何构建此URL,请询问您的ArcGIS Server管理员。

    本节中的其余主题说明如何创建geoprocessor、找到任务所需的参数以及运行任务。


二、创建地理处理器

    要在ArcGIS JavaScript API中执行geoprocessing,您需要使用esri.tasks.Geoprocessor类。此类的构造函数需要您将要运行的geoprocessing任务的URL。您可以使用“Services Directory”来找到该URL。

    Services Directory包含所有可用服务的链接。下面的图片显示了一个当您单击Geoprocessing service链接时看到的内容的示例。


    标题栏下面的片段显示,这是在文件夹Elevation中的ESRI_Elevation_World Geoprocessing service。改地址栏显示该服务运行在ESRI 示例服务器 sampleserver2.arcgisonline.com中。在服务中,有一个任务,即Profile Service(剖面服务),它是服务器上一个可访问的geoprocessing model。一个geoprocessing service可以拥有多个任务,因为服务器管理员从可以容纳许多model的工具箱中发布服务。

    下面是您查看到Profile Service任务的链接的情况:


    

    从本页面中的URL是您在创建Geoprocessor时应该复制粘贴到代码中的内容:

require(["esri/tasks/Geoprocessor", ... ], function(Geoprocessor, ... ) {
  gp = new Geoprocessor("http://sampleserver2.arcgisonline.com/ArcGIS/rest/services/Elevation/ESRI_Elevation_World/GPServer/ProfileService");
});
  

三、地理处理器的参数

Supplying parameters for the Geoprocessor

    Services Directory中的参数列表显示了任何geoprocessing任务所需的输入和输出。您需要提供所有参数,其方向为esriGPParameterDirectionInput,其参数类型为esriGPParameterTypeRequired。由于输出总是作为一个ParameterValue的数组返回到回调函数中,所以不必提供输出参数。

    您可以使用JavaScript对象表示法(JSON)设置参数,如下所示:

var params = { "Input_Observation_Point":featureSet, "Viewshed_Distance":vsDistance };

    请确保使用“Services Directory”中显示的相同参数名称和顺序。

    开发人员所面临的一个重要挑战就是了解如何为模型构建所需参数。下面的图表显示了您需要为每个类型参数创建的内容。注意一些参数由原始JavaScript数据类型表示,例如string和number,有些参数由ArcGIS JavaScript API中的对象表示(如FeatureSet和RasterData)

    

   String参数可能需要您进行一些研究以了解模型期望从字符串中提取的语法。ArcGIS Desktop Help中的Geoprocessing Tool Reference是您了解如何为tool构建string参数的最佳资源。大多数工具都有一个命令行示例,可以让您很好的了解string参数。

    查明string语法的另一种策略是将geoprocessing service添加到ArcToolbox中,并从那里运行模型,检查出现的详细消息,然后您将看到参数是如何结构化的。例如,您可能会看到如下消息:

Executing (IDW): Idw C:\Data\spot_elev.shp ELEVATION %SCRATCHWORKSPACE%\Idw_hamilton1 45.76818 2 "VARIABLE 6 500" #

    当运行IDW工具时出现此消息。如果您不了解如何构建搜索半径参数,一个字符串,您可以从这个消息中学习它是结构化的“VARIABLE6 500”。换句话说,搜索类型、点数和最大距离都以该顺序出现,由空格分隔。Geoprocessing Tool Reference也会告诉你这个。

    关于参数的最后说明:如果您提交了一个具有许多feature或复杂geometry的FeatureSet,您应该在代码中引用proxy page(代理页面),以防您的请求超出了某些web浏览器所强加的GET request的2000字符的限制。查看Using the proxy page 学习更多。


四、Geoprocessing的结果

Running a geoprocessing task and getting the results

    运行一个geoprocessing任务和获得结果的方式取决于在任务的执行类型,这些任务在ArcGIS Server上可以是synchronous(同步)或asynchronous(异步)的。同步的geoprocessing服务一旦完成,就将每个操作的结果返回给客户端-服务器上没有存储结果。另外,异步服务将结果存储到服务器上,并将作业ID返回给客户端。然后客户端可以使用此ID在方便的时间取回结果。同步服务用于执行短时间的geoprocessing操作(例如小于3秒),而异步服务则应该用于运行较长时间的操作。

    任务的Services Directory页可以告诉您执行类型。如果任务的支持操作是“Execute task”,那么它就是一个同步任务。如果支持的操作是“Submit Job”,则任务是异步的。

    服务器管理员设置一个geoprocessing 服务的执行类型。如果您是服务器管理员,则应该为能够快速运行的任务或者不具有结果地图服务的任务选择同步。对于具有结果地图服务或运行较长时间的任务,您应该选择异步。异步任务确保浏览器超时不会干扰geoprocessing作业。

1、运行同步任务并获得结果

    若要运行同步任务,请调用Geoprocessor.execute()。您需要为任务提供输入参数,以及回调函数,该回调函数告诉应用程序如何处理结果。

gp.execute(params, drawViewshed);

    任务的结果作为一个ParameterValue的数组返回到回调函数中。如果服务器管理员启用了消息,那么您也将获得一个GPMessage对象数组。

    ParameterValue数组中元素的数量和类型将因模型输出参数的数量及其数据类型而异。如果您想知道数组中预期的javascript对象,请参见参数表

    您可以循环遍历结果数组中的每个元素并将其添加到map中,在屏幕上写入它们的属性,或者做任何适当的操作。下面的代码是如何循环遍历由一个模型返回的FeatureSet并将features添加到map的示例。此代码还将geoprocessing messages写入web浏览器的开发工具控制台窗口以供信息使用。    

function drawViewshed(results, messages) {

   //Write messages to the debug console
   var description;

   for (var m=0, ml=messages.length; m<ml; m++) {
      description = messages[m].description;
      console.log(description);
   }

   // Draw results
   var polySymbol = new esri.symbol.SimpleFillSymbol();
   var features = results[0].value.features;
   for (var f=0, fl=features.length; f<fl; f++) {
      var feature = features[f];
      feature.setSymbol(polySymbol);
      map.graphics.add(feature);
   }

}

2、运行异步任务并获得结果
转载自:https://blog.csdn.net/qq_35732147/article/details/80038570

You may also like...

退出移动版