三、编写查询

|   | “提问的艺术和科学是一切知识的源泉。” |   | |   | - 托马斯·伯杰 |

查询是通过应用编程接口向地图提问的通道。在 API 术语中,它们被视为任务,因为形成查询和获得答案的过程是一系列必须正确执行的操作。在本章中,我们将开发一个野火定位应用来理解以下概念:

  • 构建和执行查询任务
  • 构建和执行识别任务
  • 构建和执行查找任务
  • 查询、查找和识别任务的承诺、延期和结果对象
  • 使用FeatureTable dijit
  • 使用Infotemplates

开发野火应用

在本章中,我们将开发一个应用,该应用将显示美国活跃的野火位置,并带有一个背景地图,显示任何位置的野火潜力。我们还将尝试通过利用 API 提供的组件来提供搜索/查询功能。下面的截图提供了我们在本章结束时开发的最终应用的粗略描述:

Developing the Wildfire application

该应用将包含以下组件:

  • 深灰色底图
  • 两个可操作的地图服务,一个显示美国的野火潜力(栅格数据),另一个显示活跃的野火位置(点数据)
  • 显示添加到地图的图层符号系统的图例 dijit (dojo 小部件)
  • 显示活动野火位置的所有记录的报告小部件
  • 一个查询小部件,您可以在其中基于野火的区域范围查询活动野火位置(该信息在数据字段中可用)
  • 一个查找小部件,您可以在其中输入任何文本,匹配搜索文本的所有州或火名将被提取
  • 地图点击事件将在地图点击位置识别并显著显示潜在野火
  • 有两个操作数据源;一个是在http://maps 7 . ArcGIS online . com/ArcGIS/rest/services/USDA _ USFS _ 2014 _ 野火 _ 危害 _ 潜在/MapServer 提供的野火潜在地图服务,另一个是在http://LiveFeeds . ArcGIS . com/ArcGIS/rest/services/LiveFeeds/野火 _Activity/MapServer 提供的活动野火数据
  • 后一种地图服务是安全的地图服务,这意味着我们需要一个 ArcGIS Online 帐户或 ArcGIS Developer 帐户来使用它。除了上述数据源之外,要访问 ArcGIS Online 的大量数据以及《世界生物地图集》()中发布的数据,我们需要执行以下操作:
    • 在 ArcGIS Developer Portal 中注册该应用,并获取该应用的令牌
    • 在我们的应用中加入 ArcGIS 代理代码

在开发人员门户中注册应用

使用我们的 ArcGIS Developer 凭据(我们在第 1 章API 基础设置开发环境部分创建的凭据),登录到 ArcGIS Developer 门户网站(https://developers.arcgis.com/)。

接下来,通过单击下面截图中突出显示的相应图标,导航到开发人员门户的应用页面。你甚至可以通过访问https://developers.arcgis.com/applications/来做到这一点。

Registering the application in the developer portal

当我们点击注册新应用按钮时,系统会提示我们输入我们应用的详细信息,如下图截图所示。在提供所需的详细信息后,如果我们再次点击注册新应用按钮,我们将被引导至显示该应用令牌的另一个屏幕。此短期令牌可用于访问任何安全的 ArcGIS 在线地图服务。例如,请尝试在您的浏览器中访问此页面-http://live feeds . ArcGIS . com/ArcGIS/rest/services/live feeds/野火 _Activity/MapServer

您将被重定向到要求您输入令牌的页面。当您提供在上一屏幕中获得的令牌时,您可以看到我们想要查看的地图服务的服务目录。下面的截图解释了这个过程:

Registering the application in the developer portal

在应用中使用代理

在本项目中,我们需要使用 Esri 资源代理来访问安全的 ArcGIS Online 数据源。资源代理是服务器端代码,用于处理从客户端到 ArcGIS Server 的请求,并将 ArcGIS Server 的响应转发回客户端。Esri 提供了一个专门适用于 ArcGIS Server 和 ArcGIS Online 的代理实现。Github 代码可以在https://github.com/Esri/resource-proxy找到。

我们将只使用包含以下重要文件的资源代理的 ASP.NET 变体:

  • proxy.ashx
  • proxy.config
  • Web.config

proxy.ashx文件包含服务器端代码逻辑,用于发出请求并将响应转发回客户端。我们需要配置proxy.config并在其中包含我们的 ArcGIS Developer 凭据。以下截图显示了proxy.config页面示例:

Using a proxy in the application

要配置proxy.config文件,请执行以下步骤:

  1. proxy.config文件中,修改serverUrl标签中urlusernamepassword的属性值。对于tokenServiceUri属性,该值应该始终为https://www.arcgis.com/sharing/generateToken
  2. For the url property, the value will be the location of the ArcGIS Server service. Specify either the specific URL (in this case, you will set matchAll="false") or just the root URL (as shown in the preceding screenshot; in this case, the matchAll value will be "true").

    有关配置proxy.config文件的更多详细信息,请参考https://github . com/Esri/resource-proxy/blob/master/README . MD # proxy-configuration-settings

  3. 配置代理页面后,我们需要向应用中添加几行代码。我们需要加载esri/config模块,并在我们的应用代码中使用以下行:

    js esriConfig.defaults.io.proxyUrl = "/proxy/proxy.ashx"; esriConfig.defaults.io.alwaysUseProxy = true;

在我们的应用中,proxy.ashx页面位于应用根目录下的proxy文件夹中。如果代理页面在不同的应用中,我们需要更改esriConfig.defaults.io.proxyUrl变量的值。当我们将esriConfig.defaults.io.alwaysUseProxy值设置为true时,所有请求都由代理处理。如果我们只需要代理处理特定的 URL,我们可能需要添加几行代码,如下所示:

urlUtils.addProxyRule({
urlPrefix: "route.arcgis.com",
proxyUrl: "/proxy/proxy.ashx"
    });

urlUtils功能由esri/urlUtils模块提供。

下图显示了从客户端到安全的 ArcGIS Server 服务的 HTTP REST 请求的流程:

Using a proxy in the application

引导应用

本书中的所有应用都是使用引导映射库来设计和引导的。这些库的源代码可以在https://github.com/Esri/bootstrap-map-js找到。

一旦您下载了所需的库,我们需要将以下 CSS 和 JavaScript 库添加到我们的应用中:

<head>
<!-- Bootstrap-map-js& custom styles -->
<link href="css/lib/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="css/lib/bootstrapmap.css">
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css">
</head>
<body>

<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script src="js/lib/bootstrap.min.js"></script>
</body>

一旦添加了这些库,我们需要再添加一个 JavaScript 文件作为 dojo 模块,而不是脚本引用。在我们的应用中,正在讨论的 JavaScript 库位于/js/lib/bootstrapmap.js

当在 require 函数中添加这个库作为模块时,我们需要省略文件扩展名。下面的截图说明了这一说法:

Bootstrapping the application

因此,我们将使用bootstrapmap模块来创建地图,而不是使用esri/map模块。bootstrapmap模块接受esri/map提供的所有属性和方法,因为bootstrapmap模块只是esri/map模块的一个包装。

查询操作的类型

在 ArcGIS Server 提供的数据上,可以进行各种类型的查询操作。我们将在本章中讨论 API 提供的三个最重要的查询操作:

  • 查询任务
  • 查找任务
  • 确定任务

查询任务

查询任务只允许我们操作一个图层,因此查询任务的构造函数要求我们提供要素图层的 URL。查询任务允许我们使用属性(字段值;例如,查询人口超过 200 万的城市)或使用位置(例如,查找在地图的当前范围内或自定义范围内的所有加油站)。当满足查询条件的要素数量大于服务器设置的限制(ArcGIS Server 中的maxRecordCount设置)时,我们可以使用名为的要素分页以批处理模式检索所有要素。

查找任务

查找任务可以在一个地图服务的多个图层和多个字段上操作。查找任务基本上是在给定地图服务的所有图层的所有字段中搜索给定的文本。当我们不知道自己在搜索哪个字段,从而无法构造合适的 SQL where子句来查询数据时,这是一个理想的依赖操作。

确定任务

识别任务主要是一个基于位置的搜索操作,返回给定地图服务中与给定几何相交的所有图层(如地图点击点)的所有数据。

在前面的所有任务中,我们可以限制执行搜索操作的字段或图层。下面的矩阵总结了三种不同类型的查询操作的所有可用选项:

Identify task

构建和执行查询任务

查询任务为设计用于查询featureLayer。因此,要实例化querytask,我们需要提供featurelayer的网址。在 3.15 版本的 API 中,该模块被命名为esri/tasks/QueryTask

query task 构造函数

QueryTask构造函数的语法如下:

newQueryTask(url, options?)

QueryTask构造函数的例子如下:

require([
"esri/tasks/QueryTask", ...
], function(QueryTask, ... ) {
varqueryTask = new QueryTask("<Feature Layer URL>")
});

构造器参数

具有查询功能的要素图层的网址已启用,要验证要素图层上的查询功能已启用,我们必须访问地图服务的服务目录,并检查Query是否在我们要查询的要素图层的支持操作中。

例如,在我们正在处理的活动野火地图服务中,我们希望查询包含活动野火图层数据的图层。地图服务中只有一个图层,因此要素图层的图层索引为0

要素图层的网址为

当我们访问此链接并向下滚动到页面底部找到支持的操作部分时,我们会看到查询操作在那里列出:

Constructor parameters

使用查询任务执行查询包括以下步骤:

Constructor parameters

实例化查询任务对象

查询任务基于活动的野火要素图层。因此,我们将使用要素图层的网址来实例化QueryTask对象。下面几行代码解释了如何实例化QueryTask:

var wildFireActivityURL = "http://livefeeds.arcgis.com/arcgis/rest/services/LiveFeeds/Wildfire_Activity/MapServer/0";
var queryTask = new QueryTask(wildFireActivityURL);

构建查询对象

QueryTask对象只是定义了你要查询哪个图层或者数据,但是我们需要用Query对象来定义实际的查询是什么。查询对象由esri/tasks/Query模块提供。

查询对象执行以下操作:

  • 它形成了一个 SQL where子句,通过属性进行查询。
  • 它使用空间几何来执行查询。
  • 它指示必须执行查询的空间关系。
  • 它向服务器请求一组特征字段。
  • 它指示查询结果是否需要返回几何信息。

查询对象有一个名为where的属性。该属性接受 SQL 的where 子句,并获取满足where子句的数据。

where条款的格式如下:

query.where = "<Query Expression 1><AND/OR><Query Expression 2> …<AND/OR><QueryExpression n>"

其中Query Expression"<FieldName><operator><value>";<FieldName>是我们想要查询的功能中的字段名称。

<operator>是一种 SQL 运算符,如LIKE=><

下面的代码片段演示了where子句的用法:

query.where = "STATE = 'OK' OR STATE = 'WY'";

当我们想要从feature类中检索所有特征时,where子句需要设置为一个 truthy 表达式,例如1=1。真实的表达是在任何情况下都评估为true的东西。

您可以使用 truthy 表达式检索所有特征:

query.where = "1=1";

实际上,使用该表达式返回的特征数量由称为MaxRecordCount的服务器设置决定,如下图所示。默认值为1000。可以在 ArcGIS server 设置中更改此限制。

计算字符串时,一定要记住用单引号将字符串值括起来:

locQuery.where = "STATE_NAME = 'OK'";

输出特征集中所需的字段可以作为字段名称数组传递给名为outFieldsquery对象参数:

query.outFields = ["FIRE_NAME", "STATE ", "LATITUDE", "LONGITUDE"];

我们可以通过将值truefalse传递给名为returnGeometryquery对象参数来指示是否需要特征的几何信息:

query.returnGeometry = true;

下面的截图展示了如何构建一个完整的Query对象,该对象可以从Query任务对象中的要素图层集中检索所有要素:

Building the Query object

空间几何查询

我们可以从与另一个输入几何具有空间关系的要素图层中获取要素。我们需要定义输入几何和要检索的要素之间的空间关系。如果未定义,默认的空间关系将成为交集。这意味着我们试图获取与输入几何相交的要素。

Querying by spatial geometry

查询对象还提供其他类型的空间关系作为常量:

  • Query.SPATIAL_REL_CONTAINS:这将检索输入几何中完全包含的所有特征
  • Query.SPATIAL_REL_INTERSECTS:这是默认的空间关系,与输入要素相交的所有要素都会被提取
  • Query.SPATIAL_REL_TOUCHES:这里,所有接触输入几何的特征被提取

通常,输入的几何图形可能是从另一个要素、类或来自draw对象的几何图形中选择的要素,或者在我们的例子中是当前地图的范围,如以下代码片段所示:

var query = new Query();
query.outFields = ["FIRE_NAME", "STATE", "LATITUDE", "LONGITUDE"];
query.returnGeometry = false;
query.where = "1=1";
query.geometry = map.extent;
query.returnGeometry = false;

执行查询

当我们需要执行查询并检索结果时,我们需要调用 query 任务对象中的查询执行方法。可以执行查询任务来获取满足查询的实际特征。在某些情况下,我们可能只需要满足查询的特征数或查询结果的空间范围。可以对查询任务对象执行五种类型的查询操作:

  • 要素查询
  • 计数查询
  • 范围查询
  • 查询对象标识
  • 关系查询

所有操作都接受查询对象作为第一个参数,并返回一个延迟对象。让我们了解三个最重要的查询任务操作的使用:计数查询、范围查询和要素查询。

查询计数

当我们只想要满足查询条件的特征的计数时,我们可以使用这个操作。下面的截图显示了在给定一个查询对象(带有查询范围)的情况下,对一组查询要素的计数查询操作。结果将是满足查询对象的要素计数:

Querying for Count

图示按计数的特征查询

当我们使用查询任务的executeForCount()方法时,我们仍然使用查询对象作为方法参数。这可以是属性查询、空间查询或两者的组合。该方法的主要目的是快速评估一个查询操作返回的特征数量。有时,这可能是您需要向用户显示的唯一信息。

让我们继续创建一个用户界面来获取满足查询条件的功能的数量。下面的截图显示了一个引导面板,带有一个文本框来输入查询文本和获取计数按钮。我们还提供了另一个div,是隐藏的。div包含一个显示特征数量的标签。

Querying for Count

查询执行应在点击获取计数按钮时进行。当查询文本框中没有提供输入时,查询将计算为一个真实的表达式;也就是说,将返回地图范围内所有要素的计数。下面的代码正好实现了这一点:

on(dom.byId("queryBtn"), "click", function () {
query.outFields = ["FIRE_NAME", "STATE", "LATITUDE", "LONGITUDE"];
query.returnGeometry = false;
query.where = dom.byId("queryTxt").value || "1=1";
query.geometry = map.extent;
varqueryCountDeferred = queryTask.executeForCount(query);
queryCountDeferred.then(function (count) {
dom.byId("FeatCountDiv").style.display = "block";
dom.byId("featCountLbl").innerHTML = "Result: " + count + " Features";
}, function (err) {
console.log(err);
});
});

在前面的代码片段中,on是 dojo 提供的事件处理程序模块(dojo/on)。dom模块的byId()方法用于获取 ID 为— queryBtndom元素的引用。我们正在queryBtnclick事件上执行前一段代码。请注意,在突出显示的代码中,我们处理了没有从查询文本框接收到输入的情况。executeForCount()方法返回延期。当Deferred对象被解析时,.then()方法用于触发回调。在.then方法中,我们定义了两个函数;第一个函数在操作成功时触发,第二个函数在操作抛出错误时触发。我们也可以使用queryTask对象上的execute-for-count-complete事件来检索结果。

result对象只返回计数。

参考以下 API 文档,获取该方法返回的结果对象的更多信息—https://developers . ArcGIS . com/JavaScript/jsapi/querytask-amd . html # event-execute-for-count-complete

我们在地图上的操作结果如下图所示:

Querying for Count

我们还在用户界面中引入了获取特征按钮来检索满足查询条件的实际特征记录,并将其显示在一个 HTML 表格中。为此,我们将在queryTask对象上执行execute()方法。

特征查询

该方法提供被查询特征的最大信息。

下图显示了查询要素操作:

Query for Features

QueryTask对象中的execute()方法用于查询特征。该方法返回一个Deferred对象。该成功事件处理程序返回一个Featureset对象。Featureset对象返回一组要素以及关于几何类型和要素空间参考的其他辅助信息。

功能集包含以下内容:

  • 特征:图形阵列。图形数组中的每个项目都有以下属性:
    • 属性:名称与图形相关联的字段和字段值的值对
    • 几何图形:定义图形的几何图形
  • 几何类型:特征的几何类型。
  • 空间参考:要素的空间参考。

在我们的应用中,我们将尝试在单击一个按钮时调用execute方法,我们将构建一个 HTML 字符串,该字符串将使用名为FeatureSet的结果将其显示为一个 HTML 表。下面的屏幕截图演示了如何迭代结果特征集并创建 HTML 表字符串:

Query for Features

点击获取特征按钮,用于获取特征计数的查询对象也被用于执行该查询操作。所以理想情况下,每次我们更改查询文本或地图范围时,获取要素按钮和 HTML 查询结果都会被隐藏,我们需要先点击获取计数按钮,然后再点击获取要素按钮。我们已经编写了一个函数,它隐藏了显示特征计数的 div,并清除了 HTML 表。代码如下所示:

function clearQueryTbl() {
dom.byId("FeatCountDiv").style.display = "none";
dom.byId("QueryTbl").innerHTML = '';
}

下面的截图展示了我们在地图上的代码:

Query for Features

范围查询

当我们想知道满足查询的特征的范围时,我们可以使用这种方法。这将在许多方面帮助我们:

  • 我们可以对这些现象的空间范围有一个概念
  • 我们可以将地图缩放到要素的范围,而无需实际接收要素

下图说明了Extent操作的查询:

Query for Extent

建立和执行识别任务

IdentifyTask可以在地图服务中对多个图层进行操作,并从与给定几何相交的所有要素中获取信息。我们将使用 IdentifyTask 点击地图,并获取被点击位置的野火潜力值。要执行IdentifyTask,我们需要遵循三个步骤:

  1. 实例化标识任务。
  2. 构造识别参数。
  3. 执行识别任务。

实例化标识任务

实例化识别任务包括加载所需的模块,并用地图服务网址实例化它。执行IdentifyTask所需的模块如下:

  • esri/tasks/IdentifyTask
  • esri/tasks/IdentifyParameters

我们将在野火潜在地图服务上运行身份识别任务。地图服务包含单个栅格图层和代表野火潜在级别的像素值。下面的代码片段显示了 IdentifyTask 是如何实例化的:

varwildfirePotentialURL = "http://maps7.arcgisonline.com/arcgis/rest/services/USDA_USFS_2014_Wildfire_Hazard_Potential/MapServer";
varidentifyTask = new IdentifyTask(wildfirePotentialURL);

构造识别参数对象

识别参数提供了很多属性来定义正在执行的识别操作。在处理多个图层时,我们可以使用layerIds属性来限制可以进行识别的图层。geometry属性允许我们设置用于在地图服务中选择进行识别操作的要素的几何图形。在我们的应用中,我们使用地图click点作为识别参数的输入几何。当使用点几何图形时,我们还需要在标识参数中定义公差属性的值。公差值是指输入点几何图形周围可视为输入几何图形一部分的像素数。

在下面的截图中,我们构造了一个 identify 参数对象,它被映射click事件处理程序所包裹。地图click事件处理程序的mapPoint属性为识别操作提供输入几何图形:

Constructing the identify parameters object

执行识别任务

可以使用识别任务的execute()方法来执行任务。execute()方法返回Deferred对象,Deferred对象的成功回调返回IdentifyResult数组对象。

识别结果表示地图服务中一个图层的单个识别要素。该对象具有以下属性:

  • displayFieldName:这是图层主显示字段的名称
  • feature:一个feature对象包含一个数组对象和一个几何对象
  • layerId:这是包含特征的图层的唯一 ID
  • layerName:这是图层的名称

由于识别结果是一个数组对象,我们只显示一个值,所以我们将只从识别结果对象(result[0])中获取第一个值,如下图所示。我们需要显示的值在名为CLASS_DESC的属性字段中。由于该值的前缀是类代码,与类描述之间用冒号(:)分隔(例如,5:非常高),因此我们将基于冒号分隔字符串,单独使用描述部分。

以下截图显示了用于执行识别操作的代码,并将识别结果显示为map点击位置的标签,该位置由指针光标表示:

Executing IdentifyTask

构建和执行查找任务

“查找”任务基本上是对地图服务中所有字段的基于属性的搜索。查找任务结果与标识任务结果相同,只是多了一个foundFieldName值,表示在其中找到搜索文本的字段名。类似于查询任务和标识任务,执行查找任务的三个步骤如下:

  1. 实例化查找任务。
  2. 建立查找参数。
  3. 执行查找任务。

让我们逐一讨论这三个步骤。

实例化查找任务

要执行查找任务,需要加载以下模块:

  • esri/tasks/FindTask
  • esri/tasks/FindParameters

我们需要提供地图服务的网址来实例化一个查找任务。下面的代码片段显示了我们将如何在应用中做到这一点:

var find = new FindTask("http://livefeeds.arcgis.com/arcgis/rest/services/LiveFeeds/Wildfire_Activity/MapServer");

建立查找参数

要构造查找参数,我们需要使用esri/task/FindParameters模块。查找参数模块有searchTextlayerIdsseachFields等属性,让我们定义查找任务。searchText属性是需要搜索的文本。这需要来自用户界面文本框。layerIds让我们定义layerIds查找任务应该在其上操作。我们还可以限制执行搜索的字段。下面的截图显示了我们如何为查找任务构建用户界面,以及如何构建查找参数对象:

Building the Find parameters

执行查找任务

可以使用Find任务的execute()方法来执行。调用此方法将返回一个Deferred对象,将在其成功回调函数中返回一个查找结果对象。我们将尝试构建一个 HTML 表,就像我们对查询任务结果所做的那样,并在FindTbl div中显示它。以下几行代码用于实现这一点:

var findTaskDeferred = find.execute(findParams);
findTaskDeferred.then(function (result) {
  vartblString = '<table class="table table-striped table-hover">';
  tblString += '<thead><tr><th>FIRE NAME</th>';
  tblString += '<th>STATE</th>';
  tblString += '<th>LOCATION</th>';
  array.forEach(result, function (searchitem) {
    tblString += '<tr><td>' + searchitem.feature.attributes["Fire Name"] + '</td>';
    tblString += '<td>' + searchitem.feature.attributes["State"] + '</td>';
    tblString += '<td> (' + searchitem.feature.attributes["Longitude"] + ',' + searchitem.feature.attributes["Latitude"] + ')</td></tr>';
  });
  tblString += '</tbody></table >';
  dom.byId("FindTbl").innerHTML = tblString;
}, function (err) {
  console.log(err);
});

在下面的截图中,我们可以看到,当我们插入搜索文本W时,搜索文本已经从两个不同的字段火名状态中提取到:

Executing a Find task

构建特征表

要素表构建表,显示给定要素图层的所有信息,并将其放置在给定的dom元素中。特征表是 Esri 小部件,可以通过加载esri/dijit/FeatureTable模块来使用。该模块允许我们选择要显示的字段。以下屏幕截图显示了如何构建功能表以及它在应用中的显示方式:

Building a feature table

建造人群

当你的网络应用的用户点击感兴趣的功能时,他们应该会看到一大堆关于他们点击的功能的有用信息。弹出窗口是向用户显示特定于上下文的属性信息的媒介。弹出窗口补充了地图的空间信息。

最简单的弹出窗口只显示所有或选定的属性值。更高级和直观的弹出窗口利用了弹出窗口中的图表和图像。

帮助创建弹出窗口的模块有esri/InfoTemplateesri/dijit/PopupTemplateesri/dijit/InfoWindowesri/dijit/Popup

esri/dijit/PopupTemplate延伸esri/InfoTemplateesri/dijit/Popup延伸esri/dijit/InfoWindow。那么,让我们简单地讨论一下InfoTemplate并继续讨论Popup模板。

构建信息模板

可以使用占位符创建InfoTemplate对象。占位符通常是属性字段名称,以美元($)符号开始,用大括号({})括起来,例如${Fieldname}

当我们需要检索感兴趣特征提供的所有字段时,字段名可以用*代替,例如${*}

要素图层和图形对象具有InfoTemplate属性。infotemplate创建的可以设置为这些层。InfoTemplate构造器接受两个参数,标题和内容:

|

模块

|

价值观念

| | --- | --- | | 模块名 | esri/InfoTemplate | | 父对象 | 地图的要素图层、图形对象、动态图层和信息窗口 | | 构造器 | new InfoTemplate (title, content) |

下面的截图为Active wildfire要素图层创建了infotemplate,它在一个弹出窗口中显示了诸如州名、火名和被点击的野火要素的区域范围等字段。Infotemplate的标题也是由占位符创建的:

Building InfoTemplates

这个章节的代码列表可以在名为B04959_03_CODE的代码文件夹中找到。

总结

本章解释了搜索和查询数据的不同方法。我们构建了一个可以执行查询任务、查找任务和识别任务的应用。我们还发现了名为dijit的特征表和Infotemplates的效用。在下一章中,我们将看到如何将所有代码组织成模块化的小部件,并在我们的应用中使用它。我们还将讨论如何构建涉及使用绘制工具栏的空间查询,我们将创建由应用用户定义的输入几何图形。