Bir FeatureTable'ı bir FeatureLayer seçim kümesiyle nasıl eşitlerim?


9

ArcGIS Server JS API'si, bir FeatureLayer'a karşılık gelen öznitelik tablosunu gösteren yeni bir FeatureTable sınıfı içerir . SyncSelection seçeneği vardır:

Harita ve özellik tablosu arasında bir etkileşimi etkinleştirir. Bu özelliği true olarak ayarlamak, tablodaki satırı tıklayarak haritadaki bir özelliğin seçimini ve haritadaki bir özelliği tıklayarak tablodaki bir satırın seçimini sağlar.

Ancak, bu , katmana karşı programlı olarak yapılan bir seçim kümesine uymuyor gibi görünüyor .

Örnek https://developers.arcgis.com/javascript/3/sandbox/sandbox.html?sample=featuretable adresinden alındığında, FeatureLayer'a bir seçim uygularsam FeatureTable'a yansıtılmaz:

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

Bu, seçimi özellik katmanına doğru şekilde uygular (haritanın yalnızca bir nokta içerdiğini unutmayın), ancak özellik tablosuna uygulanmaz (0 seçiliyken 1146 noktanın tümünü listeler):

resim açıklamasını buraya girin

Seçim kümesini yansıtacak şekilde özellik tablosunu yenilemenin bir yolu var mı?


Bir not olarak, FID seçimin featureLayer "seçim tamamlandı" geri arama sonuçlarla eşleşen satırlarda myFeatureTable.grid.select () çağırmaya çalıştım ve dairesel geri aramalar koştu. Belki de satırın seçilip seçilmediğini görmek için bir kontrol ekleme. Daha sonra araştırma yapacak.
raykendo

Yanıtlar:


2

3.16 ve sonrasında başlayan, bu booleanın uygulanması, SyncSelectiontanımladığınızdan biraz farklıdır:

Harita ve özellik tablosu arasında bir etkileşimi etkinleştirir. Bu özelliğin true değerine ayarlanması, tablodaki bir satırı tıklatarak haritadaki bir özelliğin seçilmesini sağlar. Ancak, kullanıcı haritadaki bir özelliği tıkladığında tablodaki kayıtların seçimini etkinleştirmez. Haritadan tabloya seçimi etkinleştirmek için geliştirici, katmanın tıklama mantığını açıkça uygulamalıdır. Bunun nedeni uygulamanın başka bir yerde kendi seçim mantığına veya kendi tıklama mantığına sahip olabilmesidir. (V3.16'da eklendi)

Yani, bunun bir kraliyet ağrısı olduğunu biliyorum, ama harita katmanları seçilen özellikleri arasında döngü ve onlara seçim tıklayın olayı (programlı olarak) arayarak onları tekrar seçmek zorunda inanıyorum.


2

Bu, yalnızca haritada göründüklerini görüntülemek için benim çözümüm (görünümde :)

    _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();
            }
        }));

1

İçin Hook selection-completeolay, kullanım getSelectedFeatures(), kimlikleri dizisi sonucu harita ve bu geçiş FeatureTableyoluyla selectRows. Sonra çengel selectFeaturesiçin clickolay ve bitirdiniz.

Kaba bir fikir olarak:

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);
    });
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.