Jak zsynchronizować FeatureTable z zestawem wyboru FeatureLayer?

9

ArcGIS Server JS API zawiera nową klasę FeatureTable , która pokazuje tabelę atrybutów odpowiadającą FeatureLayer. Istnieje opcja syncSelection, która:

Umożliwia interakcję między mapą a tabelą obiektów. Ustawienie tej właściwości na true umożliwia wybór elementu na mapie poprzez kliknięcie wiersza w tabeli i wybranie rzędu tabeli poprzez kliknięcie elementu na mapie

Nie wydaje się to jednak honorować zestawu selekcji dokonanego programowo względem warstwy.

Biorąc próbkę na https://developers.arcgis.com/javascript/3/sandbox/sandbox.html?sample=featuretable , jeśli zastosuję zaznaczenie do FeatureLayer, nie zostanie to odzwierciedlone w 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)

To poprawnie stosuje zaznaczenie do warstwy obiektów (zwróć uwagę, że mapa zawiera tylko jeden punkt), ale nie do tabeli obiektów (zawiera wszystkie 1146 punktów z zaznaczonym 0):

wprowadź opis zdjęcia tutaj

Czy istnieje sposób na odświeżenie tabeli funkcji, aby odzwierciedlić zestaw wyboru?

Stephen Lead
źródło
Dla przypomnienia próbowałem wywołać funkcję myFeatureTable.grid.select () w wierszach, w których FID pasował do wyników selekcji w wywołaniu zwrotnym funkcji ukończenia selekcji FeatureLayer, i natrafiłem na cykliczne wywołania zwrotne. Być może dodanie zaznaczenia, aby sprawdzić, czy wiersz został wybrany, czy nie zadziałałoby. Więcej badań później.
raykendo

Odpowiedzi:

2

Począwszy od wersji 3.16 i późniejszych, implementacja tego SyncSelectionlogicznego parametru różni się nieco od tego, co opisałeś:

Umożliwia interakcję między mapą a tabelą obiektów. Ustawienie tej właściwości na true umożliwia wybór obiektu na mapie poprzez kliknięcie wiersza w tabeli. Jednak nie pozwoli na wybór rekordów w tabeli, gdy użytkownik kliknie element na mapie. Aby umożliwić wybór z mapy do tabeli, programista musi jawnie zaimplementować logikę kliknięcia warstwy. Wynika to z faktu, że aplikacja może mieć własną logikę wyboru w innym miejscu lub własną logikę klikania. (Dodano w wersji 3.3)

Wiem, że to królewski ból, ale uważam, że musisz przejrzeć wybrane funkcje warstw mapy i wybrać je PONOWNIE, wywołując na nich zdarzenie kliknięcia zaznaczenia (programowo).

JasonInVegas
źródło
2

To jest moje rozwiązanie do przeglądania tylko tego, co jest widoczne na mapie (w widoku :)

    _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
źródło
1

Połącz się ze selection-completezdarzeniem, użyj getSelectedFeatures(), zamapuj wynik na tablicę identyfikatorów i przekaż go za FeatureTablepośrednictwem selectRows. Następnie dołącz selectFeaturesdo clickwydarzenia i gotowe.

Z grubsza pomysł:

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);
    });
}
Kyte
źródło