¿Cómo sincronizar una FeatureTable con un conjunto de selección de FeatureLayer?

9

La API JS de ArcGIS Server contiene una nueva clase FeatureTable , que muestra la tabla de atributos correspondiente a un FeatureLayer. Hay una opción syncSelection que:

Permite una interacción entre el mapa y la tabla de características. Establecer esta propiedad en verdadero permite la selección de una característica en un mapa haciendo clic en la fila de la tabla y la selección de una fila de la tabla haciendo clic en una característica del mapa

Sin embargo, esto no parece honrar un conjunto de selección realizado programáticamente contra la capa.

Tomando la muestra en https://developers.arcgis.com/javascript/3/sandbox/sandbox.html?sample=featuretable , si aplico una selección a FeatureLayer no se refleja en 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)

Esto aplica correctamente la selección a la capa de entidades (tenga en cuenta que el mapa solo contiene un punto), pero no a la tabla de entidades (enumera todos los 1146 puntos con 0 seleccionados):

ingrese la descripción de la imagen aquí

¿Hay alguna manera de actualizar la tabla de características para reflejar el conjunto de selección?

Stephen Lead
fuente
Como nota, traté de llamar a myFeatureTable.grid.select () en las filas donde el FID coincidía con los resultados de la selección en la devolución de llamada "complete-selection" de featureLayer, y encontré devoluciones de llamada circulares. Quizás agregar un cheque para ver si la fila fue seleccionada o no hubiera funcionado. Investigará más más tarde.
raykendo

Respuestas:

2

A partir de 3.16 y posteriores, la implementación de ese SyncSelectionbooleano es ligeramente diferente de lo que usted describió:

Permite una interacción entre el mapa y la tabla de características. Establecer esta propiedad en verdadero permite la selección de una característica en un mapa haciendo clic en una fila de la tabla. Sin embargo, no permitirá la selección de registros en la tabla cuando el usuario haga clic en una característica del mapa. Para habilitar la selección del mapa a la tabla, el desarrollador debe implementar explícitamente la lógica de clic de la capa. Esto se debe a que la aplicación puede tener su propia lógica de selección en otro lugar o su propia lógica de clic. (Agregado en v3.16)

Por lo tanto, sé que es un dolor real, pero creo que debe recorrer las características seleccionadas de las capas de mapa y seleccionarlas OTRA VEZ llamando al evento de clic de selección sobre ellas (mediante programación).

JasonInVegas
fuente
2

Esta es mi solución para ver solo lo que está visible en el mapa (a la 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();
            }
        }));
horiatu
fuente
1

Enganche al selection-completeevento, use getSelectedFeatures(), asigne el resultado a una matriz de ID y páselo a la FeatureTablevía selectRows. Luego conéctese selectFeaturesal clickevento y listo.

Como una idea aproximada:

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
fuente