如何将FeatureTable与FeatureLayer的选择集同步?


9

ArcGIS Server JS API包含一个新的FeatureTable类,该类显示与FeatureLayer对应的属性表。有一个选项syncSelection

启用地图和要素表之间的交互。将此属性设置为true允许通过单击表中的行来选择地图上的特征,以及通过单击地图上的特征来选择表格的行

但是,这似乎不适合以编程方式针对该图层创建的选择集。

https://developers.arcgis.com/javascript/3/sandbox/sandbox.html?sample=featuretable上获取示例,如果我对FeatureLayer应用选择,则它不会反映在FeatureTable中:

// Create the feature layer
myFeatureLayer = new FeatureLayer("https://services.arcgis.com/V6ZHFr6zdgNZuVG0/arcgis/rest/services/Warren_College_Trees/FeatureServer/0", {
  mode: FeatureLayer.MODE_SELECTION,
  visible: true,
  outFields: ["*"],
  id: "fLayer"
});
var myQuery = new Query();
myQuery.where = "Spp_Code ='SABA'";
myFeatureLayer.selectFeatures(myQuery,FeatureLayer.SELECTION_NEW)

这样可以将选择正确地应用于要素图层(请注意,地图仅包含一个点),而不将其应用于要素表(它列出了所有0146选定的1146点):

在此处输入图片说明

有没有一种刷新功能表以反映选择集的方法?


请注意,我尝试在featureLayer“选择完成”回调中FID与选择结果匹配的行上调用myFeatureTable.grid.select(),然后遇到了循环回调。也许添加检查以查看是否选择了该行会起作用。稍后将进行更多研究。
raykendo

Answers:


2

从3.16及更高版本开始,该SyncSelection布尔的实现与您描述的稍有不同:

启用地图和要素表之间的交互。将此属性设置为true可以通过单击表中的一行来选择地图上的要素。但是,当用户单击地图上的某个要素时,它将无法启用表中的记录选择。要启用从地图到表格的选择,开发人员必须显式实现图层的单击逻辑。这是因为应用程序可能在其他地方具有自己的选择逻辑或自己的单击逻辑。(在v3.16中添加)

因此,我知道这是一种皇家痛苦,但是我相信您必须遍历地图层选择的要素,并再次(通过编程方式)调用选择单击事件来选择它们。


2

这是我的解决方案,仅查看地图上可见的内容(在视图中:)

    _selectViewIds: function() {
        var objectIdFieldName = this.layer.layerObject.objectIdField;
        q = new Query();
        q.outFields = [objectIdFieldName];
        q.geometry = this.map.extent;
        var exp=this.layer.layerObject.getDefinitionExpression();
        q.where = exp;
        q.returnGeometry = true;
        new QueryTask(this.layer.layerObject.url).execute(q).then(lang.hitch(this, function(ev) {
            var selectedIds = ev.features.map(function(f) {return f.attributes[objectIdFieldName];});

            this.myFeatureTable.filterRecordsByIds(selectedIds);
        }));
    }

...

        on(selectFeaturesBtn, 'change', lang.hitch(this, function(ev) {
            if(selectFeaturesBtn.isChecked()) {
                this._selectViewIds();
                on(this.map, "extent-change", lang.hitch(this, this._selectViewIds, this));
            } else {
                this.myFeatureTable.clearFilter();
            }
        }));

1

钩住selection-complete事件,使用getSelectedFeatures(),将结果映射到ID数组,并将其传递给FeatureTablevia selectRows。然后挂接selectFeaturesclick事件,您就完成了。

作为一个大概的想法:

layer.on("click", function(evt) {
    var query = new Query();
    query.geometry = evt.mapPoint;
    layer.selectFeatures(query, FeatureLayer.SELECTION_NEW, function() {
        var ids = layer.getSelectedFeatures().map(function(feature) {
            return feature.attributes[objectIDFieldName];
        });
        featureTable.selectRows(ids);
    });
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.