Wie synchronisiere ich eine FeatureTable mit dem Auswahlsatz eines FeatureLayers?

9

Die ArcGIS Server JS-API enthält eine neue FeatureTable- Klasse, die die Attributtabelle anzeigt , die einem FeatureLayer entspricht. Es gibt eine Option syncSelection, die:

Aktiviert eine Interaktion zwischen der Karte und der Feature-Tabelle. Wenn Sie diese Eigenschaft auf true setzen, können Sie ein Feature auf einer Karte auswählen, indem Sie auf die Zeile in der Tabelle klicken, und die Zeile einer Tabelle auswählen, indem Sie auf ein Feature auf der Karte klicken

Dies scheint jedoch einen Auswahlsatz nicht zu berücksichtigen, der programmgesteuert für die Ebene erstellt wurde.

Wenn ich das Beispiel unter https://developers.arcgis.com/javascript/3/sandbox/sandbox.html?sample=featuretable nehme, wird es in der FeatureTable nicht wiedergegeben, wenn ich eine Auswahl auf den FeatureLayer anwende:

// 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)

Dadurch wird die Auswahl korrekt auf den Feature-Layer angewendet (beachten Sie, dass die Karte nur einen Punkt enthält), jedoch nicht auf die Feature-Tabelle (sie listet alle 1146 Punkte mit 0 ausgewählt auf):

Geben Sie hier die Bildbeschreibung ein

Gibt es eine Möglichkeit, die Feature-Tabelle zu aktualisieren, um den Auswahlsatz widerzuspiegeln?

Stephen Lead
quelle
Als Hinweis habe ich versucht, myFeatureTable.grid.select () in Zeilen aufzurufen, in denen die FID mit den Auswahlergebnissen im FeatureLayer-Rückruf "Auswahl abgeschlossen" übereinstimmte, und bin auf zirkuläre Rückrufe gestoßen. Vielleicht hätte das Hinzufügen einer Prüfung, ob die Zeile ausgewählt wurde oder nicht, funktioniert. Werde später mehr recherchieren.
Raykendo

Antworten:

2

Ab 3.16 und später unterscheidet sich die Implementierung dieses SyncSelectionBooleschen Werts geringfügig von der von Ihnen beschriebenen:

Aktiviert eine Interaktion zwischen der Karte und der Feature-Tabelle. Wenn Sie diese Eigenschaft auf true setzen, können Sie ein Feature auf einer Karte auswählen, indem Sie auf eine Zeile in der Tabelle klicken. Die Auswahl von Datensätzen in der Tabelle wird jedoch nicht aktiviert, wenn der Benutzer auf eine Funktion auf der Karte klickt. Um die Auswahl aus der Zuordnung zur Tabelle zu ermöglichen, muss der Entwickler die Klicklogik des Layers explizit implementieren. Dies liegt daran, dass die Anwendung möglicherweise an anderer Stelle über eine eigene Auswahllogik oder eine eigene Klicklogik verfügt. (Hinzugefügt bei v3.16)

Ich weiß also, dass es ein königlicher Schmerz ist, aber ich glaube, Sie müssen die ausgewählten Features der Kartenebenen durchlaufen und sie WIEDER auswählen, indem Sie das Auswahlklick-Ereignis aufrufen (programmgesteuert).

JasonInVegas
quelle
2

Dies ist meine Lösung, um nur das anzuzeigen, was auf der Karte sichtbar ist (in Ansicht :)

    _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
quelle
1

Verknüpfen Sie das selection-completeEreignis, verwenden Sie getSelectedFeatures(), ordnen Sie das Ergebnis einem Array von IDs zu und übergeben Sie es an die FeatureTableVia selectRows. Dann haken Sie sich selectFeaturesin die clickVeranstaltung ein und Sie sind fertig.

Als grobe Idee:

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
quelle