Como sincronizar uma FeatureTable com o conjunto de seleção de FeatureLayer?

9

A API JS do ArcGIS Server contém uma nova classe FeatureTable , que mostra a tabela de atributos correspondente a um FeatureLayer. Existe uma opção syncSelection que:

Permite uma interação entre o mapa e a tabela de recursos. Definir essa propriedade como true permite a seleção de um recurso em um mapa clicando na linha da tabela e a seleção da linha de uma tabela clicando em um recurso no mapa

No entanto, isso não parece honrar um conjunto de seleção feito programaticamente contra a camada.

Tomando a amostra em https://developers.arcgis.com/javascript/3/sandbox/sandbox.html?sample=featuretable , se eu aplicar uma seleção ao FeatureLayer, isso não será refletido na 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)

Isso aplica corretamente a seleção à camada de feição (observe que o mapa contém apenas um ponto), mas não à tabela de feições (lista todos os 1146 pontos com 0 selecionado):

insira a descrição da imagem aqui

Existe uma maneira de atualizar a tabela de recursos para refletir o conjunto de seleção?

Stephen Lead
fonte
Como observação, tentei chamar myFeatureTable.grid.select () nas linhas em que o FID correspondeu à seleção resulta no retorno de chamada featureLayer "selection-complete" e encontrei retornos de chamada circulares. Talvez adicionar uma verificação para ver se a linha foi selecionada ou não teria funcionado. Irá pesquisar mais tarde.
Raykendo

Respostas:

2

A partir das 3.16 e posteriores, a implementação desse SyncSelectionbooleano é um pouco diferente do que você descreveu:

Permite uma interação entre o mapa e a tabela de recursos. Definir essa propriedade como true permite a seleção de um recurso em um mapa, clicando em uma linha da tabela. No entanto, ele não permitirá a seleção de registros na tabela quando o usuário clicar em um recurso no mapa. Para habilitar a seleção do mapa para a tabela, o desenvolvedor deve implementar explicitamente a lógica de clique da camada. Isso ocorre porque o aplicativo pode ter sua própria lógica de seleção em outro lugar ou sua própria lógica de clique. (Adicionado na v3.16)

Então, eu sei que é uma dor real, mas acredito que você precisa percorrer os recursos selecionados das camadas do mapa e selecioná-los novamente chamando o evento de clique de seleção neles (programaticamente).

JasonInVegas
fonte
2

Esta é a minha solução para visualizar apenas o que é visível no mapa (na visualização :)

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

Conecte-se ao selection-completeevento, use getSelectedFeatures(), mapeie o resultado para uma matriz de IDs e passe-o para a FeatureTablevia selectRows. Em seguida, conecte- selectFeaturesse ao clickevento e pronto.

Como uma ideia 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
fonte