ArcGIS API For JavaScript官方文档(十一)使用QueryTask

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

    QueryTaskQueryFeatureSet一起用于查询地图中的一个图层并显示结果。

    用户向Query提供输入参数,此输入参数可能包括选择地图上的要素的信息。输入参数用于创建查询筛选器。在流程的下一步,QueryTask根据查询筛选器执行查询任务。在流程的最后一步,结果被当做FeatureSet返回,这些结果包括为高亮地图上的要素而选择的每个要素的geometry,它还包括用于显示在infoWindow或HTML表中的数据。

    下面的讨论假设您已经熟悉了JavaScript API和Dojo,并且了解了JavaScript API如何在HTML页面中工作的基本模式。有关更多信息,请参见Adding a mapAdding a task

1、创建init()函数

    您可以使用init函数初始化将在后面的函数中使用的类

    ①初始化一个Map和添加一个Layer

    ②初始化一个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

You may also like...