9 votos

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

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

Permite una interacción entre el mapa y la tabla de características. Si se establece esta propiedad a true permite seleccionar una característica en un mapa mediante una fila de la tabla, y la selección de una fila de la tabla mediante un clic en una característica en el mapa

Sin embargo, esto no parece honrar una selección hecha 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 la FeatureLayer, no se refleja en la 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 características (tenga en cuenta que el mapa sólo contiene un punto), pero no a la tabla de características (enumera los 1146 puntos con 0 seleccionados):

enter image description here

¿Hay alguna forma de actualizar la tabla de características para reflejar el conjunto de selecciones?

2voto

JasonInVegas Puntos 565

A partir de la versión 3.16 y posteriores, la aplicación de esa SyncSelection boolean es ligeramente diferente de lo que has descrito:

Permite una interacción entre el mapa y la tabla de características. En esta propiedad a true permite la selección de una característica en un mapa mediante 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. A permitir la selección desde el mapa a la tabla, el promotor debe implementar explícitamente la lógica de clic de la capa. Esto se debe a que el aplicación podría tener su propia lógica de selección en otro lugar o su propia lógica de clic. (Añadido en v3.16)

Por lo tanto, sé que es un dolor real, pero creo que tienes que bucle a través de las características seleccionadas mapa-capas y seleccionarlos de nuevo por llamar a la selección haga clic en evento en ellos (mediante programación).

2voto

Jayesh Mulwani Puntos 101

Esta es mi solución para ver sólo lo que es visible en el mapa (en 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();
            }
        }));

1voto

Peter Hanley Puntos 101

Enganche al selection-complete evento, utilice getSelectedFeatures() asigna el resultado a un array de IDs y lo pasa a la función FeatureTable vía selectRows . Entonces engancha selectFeatures a la click y ya está.

Como 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);
    });
}

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X