nullの置換処理

1,814 views
Skip to first unread message

おとは

unread,
Jun 30, 2022, 7:37:53 AM6/30/22
to QGIS初心者質問グループ
属性テーブルにある全フィールドについてnullを0に置換する作業をバッチ処理したいです。

現在はフィールド計算機を使って以下のように処理しています(全てバッチ処理での処理です)。
フィールドAについて
1.if("フィールドA" is null, '0', "フィールドA")で計算した値を、新規フィールドに追加する。
その後どこかのフォルダに適当な名前で出力する。
2.1.で出力したファイルを読み込み同様の処理を別のフィールドについて行い、また別のフォルダに出力する
以下繰り返しです。

一応やりたいことはできているのですがもう少し楽にしたいです。
具体的には属性テーブルから直接0に置換という方法です。
そうすればバッチ処理もファイル数分になるかと考えています。

なにかご存じの方いらっしゃいましたらよろしくお願いいたします。

tomoyuki arai

unread,
Jul 1, 2022, 10:30:11 AM7/1/22
to QGIS初心者質問グループ
おとは様

こんにちは。
フィールドの数が多いようであれば、SQL(仮想レイヤ)を利用するのが有効と思います。
メニューバーの「データベース」→「DBマネージャ」を利用します。
メニューが無いようならば、先に「プラグイン」→「プラグインの管理とインストール」で管理画面を開き、
「インストール済」タブ内にある「DB Manager」にチェックを入れてください。

サンプルとしてtestdata というレイヤ名で、整数型のval1、val2、小数点型のval3、val4があり、
データテーブルの値の一部はNULLを含んでいるとします。
table1.png

1.DBマネージャを開いたら、左にあるプロバイダの凡例から
「仮想レイヤ」→「プロジェクトのレイヤ」→「testdata」と辿ります。

2.F2キーを押すか、SQLウィンドウのボタンを押して、SQLクエリ入力のタブを開きます。
  QGISではここで説明されているように、 SQLite やSpatiaLite のエンジンが利用できます。
  SQLiteには ifnull という、名前のとおり値がNULLならば別の値を返す関数があるので、これを利用します。

3.クエリの入力箇所に、
SELECT
     ifnull(val1, 0) as val1,
     ifnull(val2, 0) as val2,
     ifnull(val3, 0.0) as val3,
     ifnull(val4,0.0) as val4,
     geometry
FROM testdata

と入力します。カラム名やレイヤ名の部分は適宜変更してください。
もしかしたら、変数名やカラム名はダブルクォーテーションでくくる("testdata")方が安全かもしれません。
geometry は地物がジオメトリを持っている(ポリゴンなど)の場合に使います。
データ形式によってはgeom という名前かもしれません。「テーブル」のタブで確認してください。
ジオメトリなしのテーブルの場合は、geometry と一つ上の行末尾のカンマを削除してください。

4.実行ボタンを押します。クエリ結果として、NULLの部分が0に置き換わったテーブルが表示されると思います。
dbmanager.png

ここで、「新規レイヤとして読み込む」にチェックを入れると、読み込み用のオプションが表示されます。
特に設定の必要がなければそのまま、「読み込み」ボタンを押すと、NULLデータが0に置き換わったレイヤがマップに追加されます。

5.冒頭述べたように、これは仮想レイヤ(クエリレイヤ)ですので、必要に応じてファイルやデータベース等にレイヤを保存します。


これで、レイヤの保存は1回きりでテーブルのNULLすべてを置き換えることができます。

ここまで書いておいてなんですが、データの値0 とNULL は可能なら区別して扱うのが良いように思います。
アンケートの結果で賛成数が0であるのと、アンケートが回収できていないのは異なりますし、
メッシュ雨量が0mmであるのと、雨量データが欠測となっているのは異なります。
0埋め操作はこれらを区別できなくしてしまうおそれがあります。余計な心配かもしれませんが。

新井 智之

2022年6月30日木曜日 20:37:53 UTC+9 おとは:
Reply all
Reply to author
Forward
0 new messages