Как синхронизировать FeatureTable с набором выбора FeatureLayer?

9

JS API ArcGIS Server содержит новый класс 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)

Это правильно применяет выделение к слою объектов (обратите внимание, что карта содержит только одну точку), но не к таблице объектов (в ней перечислены все 1146 точек с выбранным 0):

введите описание изображения здесь

Есть ли способ обновить таблицу функций, чтобы отразить выбранный набор?

Стивен Лид
источник
Как примечание, я попытался вызвать myFeatureTable.grid.select () для строк, где FID соответствовал результатам выбора в обратном вызове featureLayer «selection-complete», и я столкнулся с циклическими обратными вызовами. Возможно, добавив проверку, чтобы увидеть, была ли выбрана строка или нет. Будем исследовать позже.
Райкендо

Ответы:

2

Начиная с версии 3.16 и выше, реализация этого SyncSelectionлогического значения немного отличается от описанного вами:

Включает взаимодействие между картой и таблицей объектов. Если для этого свойства установлено значение true, можно выбрать элемент на карте, щелкнув строку в таблице. Тем не менее, он не позволит выбрать записи в таблице, когда пользователь нажимает на элемент на карте. Чтобы включить выбор с карты на таблицу, разработчик должен явно реализовать логику щелчков слоя. Это связано с тем, что приложение может иметь собственную логику выбора в другом месте или собственную логику щелчков. (Добавлено в версии 3.16)

Итак, я знаю, что это королевская боль, но я полагаю, что вам нужно пройтись по выбранным объектам слоев карты и выбрать их СНОВА, вызвав событие щелчка выбора для них (программно).

JasonInVegas
источник
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();
            }
        }));
horiatu
источник
1

Подцепите selection-completeсобытие, используйте getSelectedFeatures(), сопоставьте результат с массивом идентификаторов и передайте его FeatureTableчерез via selectRows. Затем подключитесь selectFeaturesк clickсобытию, и все готово.

Как грубая идея:

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);
    });
}
Кайта
источник