Comment synchroniser un FeatureTable avec le jeu de sélection d'un FeatureLayer?

9

L'API ArcGIS Server JS contient une nouvelle classe FeatureTable , qui montre la table d'attributs correspondant à une FeatureLayer. Il existe une option syncSelection qui:

Permet une interaction entre la carte et la table d'entités. La définition de cette propriété sur true permet de sélectionner une entité sur une carte en cliquant sur la ligne dans le tableau et de sélectionner la ligne d'une table en cliquant sur une entité sur la carte

Cependant, cela ne semble pas honorer un jeu de sélection effectué par programmation contre le calque.

En prenant l'exemple sur https://developers.arcgis.com/javascript/3/sandbox/sandbox.html?sample=featuretable , si j'applique une sélection au FeatureLayer, elle ne sera pas reflétée dans le 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)

Cela applique correctement la sélection à la couche d'entités (notez que la carte ne contient qu'un seul point), mais pas à la table d'entités (elle répertorie tous les 1146 points avec 0 sélectionné):

entrez la description de l'image ici

Existe-t-il un moyen d'actualiser la table d'entités pour refléter l'ensemble de sélection?

Stephen Lead
la source
En tant que note, j'ai essayé d'appeler myFeatureTable.grid.select () sur les lignes où le FID correspondait aux résultats de la sélection dans le rappel FeatureLayer "selection-complete", et je suis tombé sur des rappels circulaires. Peut-être que l'ajout d'une vérification pour voir si la ligne avait été sélectionnée ou non aurait fonctionné. Fera des recherches plus tard.
raykendo

Réponses:

2

À partir de la version 3.16 et ultérieure, l'implémentation de ce SyncSelectionbooléen est légèrement différente de celle que vous avez décrite:

Permet une interaction entre la carte et la table d'entités. La définition de cette propriété sur true permet de sélectionner une entité sur une carte en cliquant sur une ligne du tableau. Cependant, il n'activera pas la sélection des enregistrements dans le tableau lorsque l'utilisateur clique sur une entité sur la carte. Pour activer la sélection de la carte à la table, le développeur doit implémenter explicitement la logique de clic de la couche. En effet, l'application peut avoir sa propre logique de sélection ailleurs ou sa propre logique de clic. (Ajouté à v3.16)

Donc, je sais que c'est une douleur royale, mais je crois que vous devez parcourir les entités sélectionnées des couches de carte et les sélectionner ENCORE en appelant l'événement de clic de sélection sur elles (par programme).

JasonInVegas
la source
2

Ceci est ma solution pour visualiser uniquement ce qu'il est visible sur la carte (en vue :)

    _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
la source
1

Accrochez-vous à l' selection-completeévénement, utilisez getSelectedFeatures(), mappez le résultat à un tableau d'ID et transmettez-le au FeatureTablevia selectRows. Accrochez-vous ensuite selectFeaturesà l' clickévénement et vous avez terminé.

Comme une idée approximative:

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
la source