Come sincronizzare una FeatureTable con un set di selezione di FeatureLayer?


9

L'API JS di ArcGIS Server contiene una nuova classe FeatureTable , che mostra la tabella degli attributi corrispondente a un FeatureLayer. C'è un'opzione syncSelection che:

Abilita un'interazione tra la mappa e la tabella delle caratteristiche. L'impostazione di questa proprietà su true consente la selezione di una funzione su una mappa facendo clic sulla riga nella tabella e la selezione della riga di una tabella facendo clic su una funzione sulla mappa

Tuttavia, questo non sembra onorare un set di selezione fatto programmaticamente contro il livello.

Prendendo l'esempio su https://developers.arcgis.com/javascript/3/sandbox/sandbox.html?sample=featuretable , se applico una selezione al FeatureLayer non si riflette nella 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)

Questo applica correttamente la selezione al feature layer (nota che la mappa contiene solo un punto), ma non alla tabella delle feature (elenca tutti i 1146 punti con 0 selezionato):

inserisci qui la descrizione dell'immagine

C'è un modo per aggiornare la tabella delle caratteristiche per riflettere il set di selezione?


Come nota, ho provato a chiamare myFeatureTable.grid.select () su righe in cui il FID corrispondeva ai risultati della selezione nel callback featureLayer "selection-complete" e mi sono imbattuto in callback circolari. Forse aggiungendo un segno di spunta per vedere se la riga è stata selezionata o meno avrebbe funzionato. Ricerca più avanti.
Raykendo,

Risposte:


2

A partire dalla 3.16 e successive, l'implementazione di quel SyncSelectionbooleano è leggermente diversa da come hai descritto:

Abilita un'interazione tra la mappa e la tabella delle caratteristiche. L'impostazione di questa proprietà su true consente la selezione di una funzione su una mappa facendo clic su una riga nella tabella. Tuttavia, non consentirà la selezione dei record nella tabella quando l'utente fa clic su una funzione sulla mappa. Per abilitare la selezione dalla mappa alla tabella, lo sviluppatore deve implementare esplicitamente la logica di clic del livello. Questo perché l'applicazione potrebbe avere la propria logica di selezione altrove o la propria logica di clic. (Aggiunto alla v3.16)

Quindi, so che è un dolore reale, ma credo che devi scorrere le funzionalità selezionate dei layer della mappa e selezionarle ANCORA chiamando l'evento click di selezione su di esse (a livello di codice).


2

Questa è la mia soluzione per visualizzare solo ciò che è visibile sulla mappa (in vista :)

    _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

Aggancia l' selection-completeevento, usa getSelectedFeatures(), associa il risultato a un array di ID e passalo alla FeatureTablevia selectRows. Quindi aggancia selectFeaturesl' clickevento e il gioco è fatto.

Come idea approssimativa:

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);
    });
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.