Як синхронізувати FeatureTable із набором вибору FeatureLayer?


9

API JS API ArcGIS містить новий клас 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 відповідав результатам вибору в зворотному звороті вибору FeatLayer "виділення завершено", і я зіткнувся з круговими зворотними зворотами. Можливо, додайте чек, щоб побачити, чи вибрано рядок чи ні. Досліджуємося пізніше.
raykendo

Відповіді:


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(), переведіть результат на масив ідентифікаторів та передайте його на FeatureTablevia 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);
    });
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.