Arcgis Online - FeatureLayerView - query以及filter篇

1.FeatureLayerView

  • FeatureLayerView表示FeatureLayer添加到MapView或SenceView中的Map之后的LayerView对象。
  • FeatureLayerView负责将FeatureLayer的要素渲染为View中的graphics,即将要素渲染为图形。
  • FeatureLayerView对象中的方法能够帮助开发人员查询及高亮显示视图中的图形。
名称类型备注
availableFieldsString[]为每个要素获取的属性字段的列表,包括图层渲染,标注,高程信息所需的字段,以及FeatureLayer.outFields上定义的其他字段。
filterFeatureFilter属性、几何、时间范围过滤器
maximumNumberOfFeaturesNumber一次可以显示的最大要素数。(目前只适用于SceneView)
maximumNumberOfFeaturesExceededBoolean表示是否超过了最大显示要素数量。(目前只适用于SceneView)

上面几个属性是使用到filter时会涉及到的关联属性。

2.Query

此类定义用于从图层或图层视图执行对要素查询的参数。定义查询对象的属性后,可以将其传递到可执行函数中,该函数将返回FeatureSet中的功能。

查询分为三种:属性查询空间查询统计查询。您可以查询这些类别之一中的功能,也可以在单个查询中使用每个类别的元素。

属性查询

要基于属性值查询功能,请在where属性中指定SQL where子句。您可以选择将text属性用于LIKE语句。设置查询的outFields将限制查询返回的属性。如果您的应用程序不需要每个功能的所有属性,则可以提高查询速度。

空间查询

您可以按几何/位置查询要素。虽然在此工作流程中不需要的地方,但您可以将其where用作查询的一部分以获取更精确的结果。

要执行空间查询,必须将geometry参数设置为Geometry对象并指定有效的spacealRelationship。您可以选择提供查询距离和单位,以针对给定几何图形周围的缓冲区查询要素。

统计查询

您可以返回字段属性和表达式的统计信息,而不是从查询中返回单个功能。统计查询由outStatistics参数定义,该参数需要StatisticDefinition对象的数组。

方法

构建Query对象的方法:

方法名称备注
createQuery()创建查询参数对象,可用于获取满足图层配置的要素,例如definitionExpression,gdbVersion和HistoricMoment。

Query对象及其对应的属性建议参考官方文档查看细节:

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进行过滤的效果展示:
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进行查询的效果展示:
使用query进行查询


上述两个案例可以看出,使用filter会将FeatureLayerView所展示的内容进行过滤,只显示过滤的结果要素,而使用query进行查询,会将查询出的结果要素数组进行返回,可以根据需要的方式进行选择使用。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值