FeatureTable을 FeatureLayer의 선택 세트와 동기화하는 방법은 무엇입니까?


9

ArcGIS Server JS API에는 FeatureLayer에 해당하는 속성 테이블을 표시 하는 새로운 FeatureTable 클래스 가 포함되어 있습니다. syncSelection 옵션 이 있습니다.

맵과 피처 테이블 간의 상호 작용을 활성화합니다. 이 속성을 true로 설정하면 표에서 행을 클릭하여지도에서 지형지 물을 선택하고지도에서 지형지 물을 클릭하여 테이블의 행을 선택할 수 있습니다.

그러나 이것은 레이어에 대해 프로그래밍 방식 으로 작성된 선택 세트를 존중하지 않는 것 같습니다 .

https://developers.arcgis.com/javascript/3/sandbox/sandbox.html?sample=featuretable 에서 샘플을 가져 와서 FeatureLayer에 선택을 적용하면 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)

이렇게하면 선택 사항이 피쳐 레이어에 올바르게 적용되지만 (맵에는 하나의 포인트 만 포함됨) 피쳐 테이블에는 없습니다 (0이 선택된 1146 포인트가 모두 나열 됨).

여기에 이미지 설명을 입력하십시오

선택 세트를 반영하기 위해 피처 테이블을 새로 고치는 방법이 있습니까?


참고로 FID가 featureLayer "selection-complete"콜백의 선택 결과와 일치하는 행에서 myFeatureTable.grid.select ()를 호출하려고 시도했으며 순환 콜백이 발생했습니다. 행을 선택했는지 확인하기 위해 검사를 추가했을 수 있습니다. 나중에 더 연구하겠습니다.
raykendo 2016 년

답변:


2

3.16 이상부터는 SyncSelection부울 구현 이 설명 된 것과 약간 다릅니다.

맵과 피처 테이블 간의 상호 작용을 활성화합니다. 이 속성을 true로 설정하면 표에서 행을 클릭하여지도에서 지형지 물을 선택할 수 있습니다. 그러나 사용자가 맵에서 기능을 클릭하면 테이블에서 레코드를 선택할 수 없습니다. 맵에서 테이블로의 선택을 가능하게하려면 개발자는 레이어의 클릭 로직을 명시 적으로 구현해야합니다. 응용 프로그램에 다른 선택 논리가 있거나 자체 클릭 논리가있을 수 있기 때문입니다. (v3.16에서 추가됨)

그래서 나는 그것이 왕의 고통이라는 것을 알고 있지만, 당신이 선택한 맵 레이어를 선택하고 선택 클릭 이벤트를 프로그래밍 방식으로 호출하여 다시 선택해야한다고 생각합니다.


2

이것은지도에 보이는 것만 볼 수있는 솔루션입니다 (보기 :)

    _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

selection-complete이벤트에 연결하고을 사용 getSelectedFeatures()하여 결과를 ID 배열에 매핑 한 다음 FeatureTablevia에 전달하십시오 selectRows. 그런 다음 후크 selectFeatures받는 click이벤트 만하면됩니다.

대략적인 아이디어 :

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);
    });
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.