QGISで変数を使用した複数レイヤの描画条件の一括変更
環境
- Windows10/11
- QGIS 3.34
概要
- 複数レイヤに対して、同じ文字列を条件として、フィルタや色分けなどの描画条件を指定している
- これを、別の文字列に切り替えたいとき、1レイヤずつ条件を変更するのは面倒
- 変数を利用して手間を減らす方法
想定状況
以下のデータがあるとする。
- ①市区町村ポリゴンデータのShapefile
- ②店舗位置情報Shapefile
- ③各市区町村の住人が、各店舗に何人訪れたか、のCSVデータ
②のイメージ(CSVっぽく表現するとして) 店舗名 緯度 経度 ○○店 36.xxx 135.xxx △△店 36.xxx 135.xxx □□店 36.xxx 135.xxx ③のイメージ 市区町村コード ○○店 △△店 □□店 1234567 1000 500 2000 1239876 2500 1155 300 1232431 100 1500 800
各市区町村の住民が、例えば○○店にはどの程度訪れているか、③をポリゴンに紐付けて色分けして可視化したい。
その際、店舗の位置も表示された方がわかりやすいため、②で○○店の位置を示したい。
また別途、△△店、□□店でも同様に可視化したい。
方法
1店舗の描画だけなら
②店舗位置の描画
サイドビューから、レイヤ②を右クリック→「フィルタ」でクエリビルダを起動し、
"店舗名" = '○○店'
とすれば○○店のみが表示されるようになる。
③来訪人数によるポリゴンの色分け
まず①と市区町村コードを元にテーブル結合する。
①のフィールドに③の情報が結合される。(「③_○○店」など、prefixが付いた状態となる)
①のレイヤプロパティの「シンボロジ」から「連続値による定義(graduated)」を選択、 「値」に「③_○○店」を指定し、適当な色分けを設定すればよい。
しかし、これを△△店、□□店でも同じことをやるのは、面倒くさい。
今回は描画条件を設定するレイヤーは2つだけだが、レイヤーが増えると、また描画する店舗数が増えると、
手動ではかなりの手間となる。
フィルタ条件として「○○店」を含む文字列を指定するという点は共通しているのだが、
なるべく簡単に、店舗を切り替えられるようにできないだろうか?
変数を使う
メニュー「プロジェクト」→「プロパティ」から、「変数」タブを開くと、プロジェクトに紐付いた変数が定義できる。
(同様に、メニュー「設定」→「オプション」にも「変数」タブがあり、 プロジェクトに依らないグローバルな変数も設定できる)
ここで、たとえば「target_store = '○○店'」としておく。
②店舗位置の描画
クエリビルダではこの変数を使うことができないので、フィルタは解除して、「シンボロジ」の方でフィルタリングする。
レイヤプロパティ→「シンボロジ」から、「ルールによる定義(rule-based)」を選択。
「+」アイコンでルールを追加して、以下のように入力すると、変数が使用できる。
"店舗名" = @target_store
③来訪人数によるポリゴンの色分け
1店舗の描画の時の「シンボロジ」の「値」欄の右に、「ε」アイコンがある。これで任意の式を入力できる。
以下のように入力する。
eval(concat('"③_', @target_store, '"'))
QGISではダブルクオーテーションで囲まれたものは “フィールド名”、シングルクオーテーションは '文字列' として解釈されるのだが、変数は文字列となっている。だが、ここでの指定はフィールド名としなければならない。
prefixを文字列結合した上で、フィールドとして解釈させるには、多少ダーティになるが、evalで解釈させる方法がある。
これで、変数に入った値を '△△店' などに変更すると、対象の店舗が切り替えられる。
留意点
変数を切り替えただけでは、ポリゴンの「シンボロジ」の色分けの境界値は変わらない。
もし、店舗によって境界値を変えたい場合、その分類は、再度行う必要がある。
他の解決策
さらなる自動化(全店舗に対して図を描画し、特定のビューで切り取った図を保存する、など)をする場合は、 PythonコードからQGISを操作することもできると思う。
また、外部にデータベースを構築しておき、QGISからはSQLでそれを取得してくる(店舗の変更は、SQLの一部を変更するだけ)、 という使い方もあると思う。
今回の方法は、そこまでガッチリ自動化するほどでも無く、既にあるデータを読み込ませる中で、手間を減らす方法の1つとなる。
(ただ、もっと今回の目的に添うような機能が既にあるのを、知らないだけかもしれない)