Arcgis Online - FeatureLayer - query以及filter篇
1.FeatureLayerView
- FeatureLayerView表示FeatureLayer添加到MapView或SenceView中的Map之后的LayerView对象。
- FeatureLayerView负责将FeatureLayer的要素渲染为View中的graphics,即将要素渲染为图形。
- FeatureLayerView对象中的方法能够帮助开发人员查询及高亮显示视图中的图形。
名称 | 类型 | 备注 |
---|---|---|
availableFields | String[] | 为每个要素获取的属性字段的列表,包括图层渲染,标注,高程信息所需的字段,以及FeatureLayer.outFields上定义的其他字段。 |
filter | FeatureFilter | 属性、几何、时间范围过滤器 |
maximumNumberOfFeatures | Number | 一次可以显示的最大要素数。(目前只适用于SceneView) |
maximumNumberOfFeaturesExceeded | Boolean | 表示是否超过了最大显示要素数量。(目前只适用于SceneView) |
上面几个属性是使用到filter时会涉及到的关联属性。
2.Query
此类定义用于从图层或图层视图执行对要素查询的参数。定义查询对象的属性后,可以将其传递到可执行函数中,该函数将返回FeatureSet中的功能。
查询分为三种:属性查询,空间查询和统计查询。您可以查询这些类别之一中的功能,也可以在单个查询中使用每个类别的元素。
属性查询
要基于属性值查询功能,请在where属性中指定SQL where子句。您可以选择将text属性用于LIKE语句。设置查询的outFields将限制查询返回的属性。如果您的应用程序不需要每个功能的所有属性,则可以提高查询速度。
空间查询
您可以按几何/位置查询要素。虽然在此工作流程中不需要的地方,但您可以将其where用作查询的一部分以获取更精确的结果。
要执行空间查询,必须将geometry参数设置为Geometry对象并指定有效的spacealRelationship。您可以选择提供查询距离和单位,以针对给定几何图形周围的缓冲区查询要素。
统计查询
您可以返回字段属性和表达式的统计信息,而不是从查询中返回单个功能。统计查询由outStatistics参数定义,该参数需要StatisticDefinition对象的数组。
方法
构建Query对象的方法:
方法名称 | 备注 |
---|---|
createQuery() | 创建查询参数对象,可用于获取满足图层配置的要素,例如definitionExpression,gdbVersion和HistoricMoment。 |
Query对象及其对应的属性建议参考官方文档查看细节:
FeatureLayer中Query执行方法:
方法名称 | 备注 |
---|---|
queryAttachments() | 查询有关与要素关联的附件的信息。 |
queryExtent() | 针对要素服务执行查询,并返回满足查询条件的要素范围。 |
queryFeatureCount() | 针对要素服务执行查询,并返回满足查询的要素数量。 |
queryFeatures() | 对要素服务执行查询并返回FeatureSet,.then()一旦承诺解决,就可以使用该方法进行访问。 |
queryObjectIds() | 针对要素服务执行查询,并为满足输入查询的要素返回对象ID的数组。 |
queryRelatedFeatures() | 针对要素服务执行RelationshipQuery并返回按源图层或表objectId分组的FeatureSet。 |
3.QueryTask
在图层上执行不同类型的查询操作。此类中最常用的方法是execute(),它执行在Query对象中定义的查询,该对象作为参数传递给函数。QueryTask.execute()返回解析为FeatureSet的Promise,FeatureSet包含图层中满足Query的要素。
方法列表
方法名 | 备注 |
---|---|
execute() | 针对url中指定的图层执行查询。 |
executeAttachmentQuery() | 从url中指定的要素层查询与要素关联的附件信息。 |
executeForCount() | 获取满足输入查询的要素数量的计数。 |
executeForExtent() | 获取满足输入查询的要素范围。 |
executeForIds() | 针对url中指定的图层执行查询。 |
executeRelationshipQuery() | 针对url中指定的层或表执行RelationshipQuery。 |
(1)execute(query, requestOptions?)
对url中指定的层执行查询。结果作为FeatureSet返回,可以使用.then()方法访问它。功能集包含可以添加到地图中的图形功能数组。如果找不到结果,则不会填充此数组。
(2)executeAttachmentQuery(attachmentQuery, requestOptions?)
从以下版本开始: ArcGIS API for JavaScript 4.9
从url中指定的要素层查询与要素关联的附件信息。如果图层的capabilities.data.supportsAttachment设置为false ,它将返回错误。
(3)executeForCount(query,requestOptions?)
获取满足输入查询的要素数量的计数。对使用10.0 SP1发布的图层有效。
(4)executeForExtent(params,requestOptions?)
获取满足输入查询的要素范围。满足输入查询的要素数量也会在解析后返回。在10.3版中,此选项仅适用于托管功能服务。在10.3.1,此选项可用于所有要素服务和地图服务层。
(5)executeForIds(query,requestOptions?)
针对url中指定的图层执行查询。结果是满足输入查询的要素的对象ID的数组。
(6)executeRelationshipQuery(relationshipQuery,requestOptions?)
针对url中指定的层或表执行RelationshipQuery。如果查询成功,则返回的结果是按源图层或表objectIds分组的FeatureSet。
4.案例
基础参数配置:
const view = new MapView({
container: "viewDiv",
center: [118.829248, 32.026729],
zoom: 14,
map: map,
constraints: { //设置约束条件
maxZoom: 22
}
});
var ysLineLayer = new FeatureLayer({
url: `此处填写Service URL/对应图层的索引`, //这块注意修改
renderer: ysLineRenderer,
popupTemplate: lineTemplate2,
labelingInfo: [ysLineDirectionClass, ysAttributeClass],
//outFields: ["*"],
title: "雨水管道"
//popupEnabled:true
});
var wsLineLayer = new FeatureLayer({
url: `你自己的Service URL`, //这块注意修改
renderer: wsLineRenderer,
popupTemplate: lineTemplate2,
labelingInfo: [wsLineDirectionClass, wsAttributeClass],
//outFields: ["*"],
title: "污水管道"
//popupEnabled:true
});
首先使用js创建需要用到的Html元素:
//查询过滤
var findDiv = document.createElement("div");
findDiv.setAttribute("class", "find-div");
var findText = document.createElement("input");
findText.setAttribute("class", "esri-widget esri-input");
findText.setAttribute("placeholder", "请输入查询的道路");
var findBtn = document.createElement("button");
findBtn.innerHTML = "查找";
findDiv.appendChild(findText);
findDiv.appendChild(findBtn);
view.ui.add(findDiv, "top-right");
地图初始化效果:
FeatureLayerView - filter过滤
findBtn.onclick = doFilter; //给查找按钮绑定事件
function doFilter() {
//创建where条件
var whereText = "Subordinat like '%" + findText.value + "%'";
if (findText.value == "") {
whereText = null;
}
//设置Polyline图层的Filter条件
view.whenLayerView(ysLineLayer).then(function (layerView) {
layerView.filter = {
where: whereText
}
});
view.whenLayerView(wsLineLayer).then(function (layerView) {
layerView.filter = {
where: whereText
}
});
}
使用filter进行过滤的效果展示:
使用QueryTask进行查询
使用QueryTask之前需要优先导入以下两个类:
require([
"esri/tasks/QueryTask",
"esri/tasks/support/Query"
], function (QueryTask, Query) { ... });
var ysQueryTask = new QueryTask({
url: `此处填写Service URL/对应图层的索引`, //这块注意修改
});
var wsQueryTask = new QueryTask({
url: `此处填写Service URL/对应图层的索引`, //这块注意修改
});
var queryParams = new Query({
returnGeometry: false, //是否返回几何对象
outFields: ["*"] //输出字段
});
var highLightObj; //高亮对象
var highLightList = []; //高亮对象数组
findBtn.onclick = doQuery;
function doQuery() {
//初始化高亮数组
if (highLightList) {
highLightList.forEach(item => {
item.remove();
});
highLightList = [];
}
//搜索文本框为空,不进行查询
if (findText.value == "") {
return;
}
//配置where条件
queryParams.where = "Subordinat like '%" + findText.value + "%'";
//使用QueryTask对象进行查询
ysQueryTask.execute(queryParams).then(function (response) {
// console.log(response);
view.whenLayerView(ysLineLayer).then(function (layerView) {
response.features.forEach(result => {
highLightObj = layerView.highlight(result.attributes.FID);
highLightList.push(highLightObj);
});
});
});
wsQueryTask.execute(queryParams).then(function (response) {
// console.log(response);
view.whenLayerView(wsLineLayer).then(function (layerView) {
response.features.forEach(result => {
highLightObj = layerView.highlight(result.attributes.FID);
highLightList.push(highLightObj);
});
});
});
}
使用query进行查询的效果展示:
上述两个案例可以看出,使用filter会将FeatureLayerView所展示的内容进行过滤,只显示过滤的结果要素,而使用query进行查询,会将查询出的结果要素数组进行返回,可以根据需要的方式进行选择使用。