Làm cách nào để đồng bộ hóa FeatureTable với bộ lựa chọn FeatureLayer's?


9

API JSG Server của ArcGIS chứa một lớp FeatureTable mới , hiển thị bảng thuộc tính tương ứng với FeatureLayer. Có một tùy chọn syncSelection trong đó:

Cho phép tương tác giữa bản đồ và bảng tính năng. Đặt thuộc tính này thành true cho phép lựa chọn một tính năng trên bản đồ thông qua nhấp vào hàng trong bảng và chọn hàng của bảng thông qua nhấp vào một tính năng trên bản đồ

Tuy nhiên, điều này dường như không tôn vinh một bộ lựa chọn được lập trình dựa trên lớp.

Lấy mẫu tại https://developers.arcgis.com/javascript/3/sandbox/sandbox.html?sample=featuretable , nếu tôi áp dụng lựa chọn cho FeatureLayer, nó không được phản ánh trong 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)

Điều này áp dụng chính xác lựa chọn cho lớp tính năng (lưu ý rằng bản đồ chỉ chứa một điểm), nhưng không áp dụng cho bảng tính năng (nó liệt kê tất cả 1146 điểm với 0 được chọn):

nhập mô tả hình ảnh ở đây

Có cách nào để làm mới bảng tính năng để phản ánh bộ lựa chọn không?


Như một lưu ý, tôi đã cố gắng gọi myFeatureTable.grid.select () trên các hàng trong đó FID khớp với kết quả lựa chọn trong cuộc gọi lại "tính năng hoàn tất lựa chọn" của tính năng và tôi chạy vào các cuộc gọi lại vòng tròn. Có lẽ thêm một kiểm tra để xem hàng đã được chọn hay chưa sẽ hoạt động. Sẽ nghiên cứu thêm sau.
raykendo

Câu trả lời:


2

Bắt đầu từ 3.16 trở đi, việc triển khai SyncSelectionboolean đó hơi khác so với bạn mô tả:

Cho phép tương tác giữa bản đồ và bảng tính năng. Đặt thuộc tính này thành true cho phép lựa chọn một tính năng trên bản đồ thông qua việc nhấp vào một hàng trong bảng. Tuy nhiên, nó sẽ không cho phép lựa chọn các bản ghi trong bảng khi người dùng nhấp vào một tính năng trên bản đồ. Để cho phép lựa chọn từ bản đồ đến bảng, nhà phát triển phải triển khai rõ ràng logic nhấp chuột của lớp. Điều này là do ứng dụng có thể có logic lựa chọn riêng ở nơi khác hoặc logic nhấp chuột của riêng chúng. (Đã thêm vào v3.16)

Vì vậy, tôi biết đó là nỗi đau của hoàng gia, nhưng tôi tin rằng bạn phải lặp qua các tính năng được chọn của các lớp bản đồ và chọn chúng LẠI bằng cách gọi sự kiện nhấp chuột chọn vào chúng (theo chương trình.)


2

Đây là giải pháp của tôi để chỉ xem những gì nó hiển thị trên bản đồ (trong chế độ xem :)

    _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

Kết nối selection-completesự kiện, sử dụng getSelectedFeatures(), ánh xạ kết quả tới một mảng ID và chuyển thông tin đó FeatureTablequa selectRows. Sau đó móc selectFeaturesvào clicksự kiện và bạn đã hoàn tất.

Như một ý tưởng sơ bộ:

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);
    });
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.