ArcGIS API For JavaScript官方文档(十一)使用QueryTask
QueryTask、Query和FeatureSet一起用于查询地图中的一个图层并显示结果。
用户向Query提供输入参数,此输入参数可能包括选择地图上的要素的信息。输入参数用于创建查询筛选器。在流程的下一步,QueryTask根据查询筛选器执行查询任务。在流程的最后一步,结果被当做FeatureSet返回,这些结果包括为高亮地图上的要素而选择的每个要素的geometry,它还包括用于显示在infoWindow或HTML表中的数据。
下面的讨论假设您已经熟悉了JavaScript API和Dojo,并且了解了JavaScript API如何在HTML页面中工作的基本模式。有关更多信息,请参见Adding a map和Adding a task
1、创建init()函数
您可以使用init函数初始化将在后面的函数中使用的类
②初始化一个QueryTask layer,请注意,URL包含layer ID,在本例中为”0″
③初始化Query,您应该指定除实际筛选之外的所有内容。在本例中,输出字段的列表包含在outFields中。当您指定输出字段时,您应该将字段限制在您希望在查询或结果中使用的字段。包含的字段越少,响应速度就会越快。您必须使用实际字段名而不是alias name(别名),但是您可以在稍后显示结果时使用别名。
④初始化InfoTemplate。如果您计划使用InfoWindow来显示结果,则这是构建InfoTemplate的好时机。语法$(字段名)在运行时替换为实际的属性值。第一个值是标题,其余的值构成了InfoWindow的文本。您可以使用任何有效的HMTL。
⑤初始化在地图上高亮显示的要素的符号。
// AMD
require([
"esri/map",
"esri/layers/ArcGISDynamicMapServiceLayer",
"esri/tasks/QueryTask",
"esri/tasks/query",
"esri/symbols/SimpleMarkerSymbol",
"esri/InfoTemplate",
"dojo/_base/Color",
"dojo/dom",
"dojo/on",
"dojo/domReady!"
], function(Map, ArcGISDynamicMapServiceLayer, QueryTask, Query, SimpleMarkerSymbol, InfoTemplate, Color, dom, on) {
//create map and add layer
map = new Map("mapDiv");
var layer = new ArcGISDynamicMapServiceLayer(
"http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StatesCitiesRivers_USA/MapServer");
map.addLayer(layer);
//initialize query task
queryTask = new QueryTask("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StatesCitiesRivers_USA/MapServer/0");
//initialize query
query = new Query();
query.returnGeometry = true;
query.outFields = ["CITY_NAME", "STATE_NAME", "POP1990"];
//initialize InfoTemplate
infoTemplate = new InfoTemplate("${CITY_NAME}", "Name : ${CITY_NAME}<br/> State : ${STATE_NAME}<br />Population : ${POP1990}");
//create symbol for selected features
symbol = new SimpleMarkerSymbol();
symbol.setStyle(SimpleMarkerSymbol.STYLE_SQUARE);
symbol.setSize(10);
symbol.setColor(new Color([255,255,0,0.5]));
//write "Get Details" button's click event
on(dom.byId("runQuery"), "click", executeQueryTask);
});
2、executeQueryTask 函数——回调函数
根据用户输入创建查询过滤器并执行查询。用户输入参数可以包含所选择的地图上的要素的信息。在该示例中,指示用户输入人口值。
3、创建回调函数executeQueryTask()
回调函数被HTML页面中的input标签引用。在本例中,当用户输入人口值且单击“Get Details”按钮后,将调用一个名为“executeQueryTask”的函数。
“population”(人口)值被插入到Query.where。where属性是您可以在Query中使用的三个筛选器之一:
- Query.where:相当于SQL中的where语句。在用JavaScript编写where子句时,需要确保具有正确的单引号和双引号。
字符串查询:
query.where = "NAME = '" + stateName + "'";
数字查询:
query.where = "POP1990 > " + population;
- Query.text:类似于使用”like”的where子句。所使用的字段是在地图文档中定义的display field(显示字段)。您可以确定显示字段是是服务目录中一个layer的显示字段。
query.text = stateName;
- Query.geometry:用于空间查询,当用户选择地图上的要素时
query.geometry = evt.mapPoint;
在创建筛选器后,通过QueryTask.execute()方法执行查询。该方法的参数是Query和一个名为”showResults”的函数的引用。
function executeQueryTask() {
//set query based on what user typed in for population;
query.where = "POP1990 > " + dom.byId("population").value;
//execute query
queryTask.execute(query,showResults);
}
4、创建一个函数来显示结果
showResult()函数有一个Featureset作为输入,在执行查询时,FeatureSet被填充。这个函数解析了Featureset中的结果,并将它们添加到GraphicsLayer。geometry用于在地图中绘制图形要素。属性值使用InfoTemplate添加到graphic中。当用户单击高亮显示的要素时,会弹出一个InfoWindow。
function showResults(featureSet) {
//remove all graphics on the maps graphics layer
map.graphics.clear();
//Performance enhancer - assign featureSet array to a single variable.
var resultFeatures = featureSet.features;
//Loop through each feature returned
for (var i=0, il=resultFeatures.length; i<il; i++) {
//Get the current feature from the featureSet.
//Feature is a graphic
var graphic = resultFeatures[i];
graphic.setSymbol(symbol);
//Set the infoTemplate.
graphic.setInfoTemplate(infoTemplate);
//Add graphic to the map graphics layer.
map.graphics.add(graphic);
}
}
5、HTML body标签
body部分包含用户在HTML页面上看到的内容。
- 用户有一个输入人口值的位置。当用户单击”Get Details“按钮时,将触发onclick事件并调用executeQueryTask()函数
- 地图显示在mapDiv中。一旦执行了查询,所选的要素会被高亮显示。当用户单击某个要素时,就会出现一个InfoWindow
<body>
<br/>
US city population greater than : <input type="text" id="population" value="500000" />
<input type="button" value="Get Details" id="runQuery" />
<div id="mapDiv" style="width:600px; height:600px; border:1px solid #000;"></div>
Click on a city once it's highlighted to get an InfoWindow.
</body>
6、性能注意事项
您需要小心您正在构建的查询是否合理。您的用户不会像您一样理解这些数据,因此,用户可能会提出不切实际的查询或请求过多的数据。性能与所选要素的数量之间有直接的相关性。
- 如果选择了大量的要素,在地图上绘制图形可能需要一些时间。要素的类型也会造成绘制时间的差异,点绘制要比线条和多边形绘制快得多。因此,无论何时您可以使用点图形进行绘制,您都应该这样做。
- 如果您正在检索表格数据,并且不打算将图形添加到地图中,则不应该请求geometry。
- 如果查询经常太大,您应该将查询限制在一个较小的区域或细化查询,以便一次返回较少的要素。
缓存图层上的查询不具有比例尺依赖性。这意味着,即使图层没有显示在给定比例的地图上,也可以查询该图层的要素。因此,如果显示结果对最终用户没有意义,则您的查询不应该对该图层进行访问。
您还应该考虑用户可能不经意或恶意地请求无限数量的要素。返回的要素的最大数量可以在properties for each map service中指定。默认情况下,此最大值设置为1000个要素。用户可以请求一个图层的最大记录数的一些常见方式是:
- 请求具有人口数量大于0的所有城市
- 发送空where语句(where=””)
- 发送一个始终正确的语句(where=”1=1″)
- 选择一个图层中的所有要素
您可以在应用程序中捕获这些类型的查询。如果您正在托管其他用户可能在其应用程序中包含的服务,则您可能希望通过在MaxRecordCount中设置一个合理的值来限制在查询响应中返回的要素的数量,从而保护您的站点不受多个大型请求的影响。
转载自:https://blog.csdn.net/qq_35732147/article/details/79895145