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)

これにより、選択はフィーチャレイヤーに正しく適用され(マップには1つのポイントのみが含まれることに注意してください)、フィーチャテーブルには適用されません(0が選択された1146ポイントすべてがリストされます)。

ここに画像の説明を入力してください

フィーチャセットを更新して、選択セットを反映する方法はありますか?


注として、FIDがfeatureLayerの「selection-complete」コールバックの選択結果と一致する行でmyFeatureTable.grid.select()を呼び出そうとすると、循環コールバックが発生しました。おそらく、行が選択されているかどうかを確認するチェックを追加することで、うまくいったでしょう。後でもっと研究します。
raykendo

回答:


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ます。次にselectFeaturesclickイベントにフックして完了です。

大まかなアイデアとして:

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.