目次

QGISで変数を使用した複数レイヤの描画条件の一括変更

環境

概要

想定状況

以下のデータがあるとする。

②のイメージ(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つとなる。

(ただ、もっと今回の目的に添うような機能が既にあるのを、知らないだけかもしれない)

参考