2016年04月02日

QGIS:森林簿データが林小班順にソートできるよう属性データを加工

県から貸与された森林簿データ付き森林計画図のシェープファイルをQGISに読み込ませた後、林小班でソートさせてデータを眺めたい状況って往々にしてあるわけで。でもそんな時、準林班が「イロハ」順であるため、思うようにソートできず困った経験をお持ちの方は少なくないと思います。

そこで、データの結合も視野に入れて、ソート用の属性データを属性テーブル上で作成することにしました。

(序)動作確認環境
○QGIS 2.14.1 Essen
○Windows 7 Professional SP1
○Intel(R) Core(TM) i5-3230M CPU @ 2.60GHz
○4.00GB RAM ※32bit版OSなので実際には3.0GBとして認識


(1)どういう文字列に?
岐阜県の場合だと林小班は、以下の括りで管理されています。
 市町村コード(平成の大合併以前の市町村単位でコードを付与、全部で99)
└林班
    └準林班
      └小班
        └枝番(ない場合は0)
なので、これらの要素をすべて含んだ文字列をデータに仕込めば、少なくとも岐阜県下の他の林小班とは重複することがないハズ。視認性も考慮し、当方で考えた文字列は、次のとおり。
  aa_bbbcddd-ee
aa 市町村コード(数字2桁)
bbb 林班(数字3桁)
c 準林班(アルファベット1文字)
ddd 小班(数字3桁)
ee 枝番(数字2桁)
ちなみに、森林簿データ付き森林計画図(林小班)のシェープファイルをQGISに読み込ませ、属性テーブルを表示させるとこんな感じ。
01.jpg


(2)「Table Manager」でフィールドを1つ追加
この文字列を格納する場所を「Table Manager」で作ってやります。フィールド名(見出し)は、シェープファイルの制約を考慮しつつもご自由に。当方は「ID」としました。挿入場所は、どこでも良いのですが、一番最初だと利便性が良いと思います。なお、以下の点に気を付けて。

○Field typeは「String」
○Lengthは13以上

02.jpg
フィールド追加のウィンドウにて入力している様子
Lengthは余裕を見て15バイトにした

Table Managerを終了し、属性テーブルを開くと、以下のように当方のケースでは、一番最初に「ID」フィールドが追加されました。
03.jpg


(3)属性テーブルの式ダイアログで式を組む
属性テーブルを開いたら、まず市町村コード・林班・準林班・小班・枝番の各フィールド名を確認します。ついで編集モードにし、式の対象を前項で定めたフィールドに設定。そして「ε」をクリックして、式ダイアログを開きます。

05.jpg
式ダイアログを開いたところ

このダイアログ内に、条件式を記述します。さし当たって、次の式を記述してみましょう。個人的には、文法が何となくExcelのマクロに似てるような気がしますhi。
Case
When "準林班名" is 'イ' Then
"市町村" || '_' || right('00' || "林班", 3) || 'A' || right('00' || "小班", 3) || '-' || right('0' || "枝番", 2)
End

上の式を例に、式を記述する際のお約束etc.を以下に列挙しましょう。

■条件構文:Case〜When〜End
Caseで始まりEndで終わる構文の中で、条件(When〜Thenの間)と合致した時の処理(Then以下)を指定
上の例ではWhenから始まる行を2行に分けていますが、1行でもOKです
Case
When (条件1) Then (結果1)
When (条件2) Then (結果2)
(以下、好きなだけ記述)
End


■フィールド名は「"」(ダブルクォーテーション)で括る
手入力は面倒なので、関数リストの「フィールドと値」から記述したいフィールド名をダブルクリックすると楽できます

■単なる文字列は「'」(シングルクォーテーション)で括る
【参考】ラベルの式で個人的によく使う改行は「'\n'」

■「AはBである」は「A is B」と記述
【参考】「Aは空白(空欄)である」は「A is null」

■文字列の連結は「||」(バーチカルバー)を2つ連続して記述
MS-DOSのパイプ処理を思い出しますねhi

■Rightの使い方は、ExcelのRight関数と一緒
【例1】1林班 ⇒ 「'00' || "林班"」で「001」 ⇒ Right('00' || "林班",3)で「001」
【例2】23林班 ⇒ 「'00' || "林班"」で「0023」 ⇒ Right('00' || "林班",3)で「023」
【例2】456林班 ⇒ 「'00' || "林班"」で「00456」 ⇒ Right('00' || "林班",3)で「456」

■詳しいことは以下で
http://docs.qgis.org/2.0/ja/docs/user_manual/working_with_vector/field_calculator.html

06.jpg
上は、条件式を入力したところ。入力が有効か無効かはQGISで自動的に判断し、色で示してくれる優しい設計。また正しく入力されると、下の「出力プレビュー:」の右側に出力例が表示されます。上の画像でプレビューが表示されないのは、先頭のデータの準林班がイではないから(苦笑)。

条件式の入力を終えたら、右下の「OK」をクリックします。


(4)条件式を実行
条件式を入力し終えたら、いよいよ実行。一部のデータだけを対象に更新したい場合は、更新したいデータを選択(選択すると当該行は反転表示される)してから右上の「選択の更新」を、全データを一気に更新するのなら「全部更新」を、それぞれクリックします。

07.jpg
実行前

08.jpg
実行後。準林班名に「イ」のあるデータだけが更新されました

このままではもちろん物足りないので、条件式をずらずらっと書きましょう。いちいち書くのは面倒なので、コピー&ペーストを上手に使って。なお、準林班が最高でいくつあるのか実は知らないので(汗)、取りあえず条件式を24行書いてみましたhi。
Case
When "準林班名" is 'イ' then
"市町村" || '_' || Right('00' || "林班", 3) || 'A' || right('00' || "小班", 3) || '-' || right('0' || "枝番", 2)
When "準林班名" is 'ロ' then
"市町村" || '_' || right('00' || "林班", 3) || 'B' || right('00' || "小班", 3) || '-' || right('0' || "枝番", 2)
When "準林班名" is 'ハ' then
"市町村" || '_' || right('00' || "林班", 3) || 'C' || right('00' || "小班", 3) || '-' || right('0' || "枝番", 2)
When "準林班名" is 'ニ' then
"市町村" || '_' || right('00' || "林班", 3) || 'D' || right('00' || "小班", 3) || '-' || right('0' || "枝番", 2)
When "準林班名" is 'ホ' then
"市町村" || '_' || right('00' || "林班", 3) || 'E' || right('00' || "小班", 3) || '-' || right('0' || "枝番", 2)
When "準林班名" is 'ヘ' then
"市町村" || '_' || right('00' || "林班", 3) || 'F' || right('00' || "小班", 3) || '-' || right('0' || "枝番", 2)
When "準林班名" is 'ト' then
"市町村" || '_' || right('00' || "林班", 3) || 'G' || right('00' || "小班", 3) || '-' || right('0' || "枝番", 2)
When "準林班名" is 'チ' then
"市町村" || '_' || right('00' || "林班", 3) || 'H' || right('00' || "小班", 3) || '-' || right('0' || "枝番", 2)
When "準林班名" is 'リ' then
"市町村" || '_' || right('00' || "林班", 3) || 'I' || right('00' || "小班", 3) || '-' || right('0' || "枝番", 2)
When "準林班名" is 'ヌ' then
"市町村" || '_' || right('00' || "林班", 3) || 'J' || right('00' || "小班", 3) || '-' || right('0' || "枝番", 2)
When "準林班名" is 'ル' then
"市町村" || '_' || right('00' || "林班", 3) || 'K' || right('00' || "小班", 3) || '-' || right('0' || "枝番", 2)
When "準林班名" is 'ヲ' then
"市町村" || '_' || right('00' || "林班", 3) || 'L' || right('00' || "小班", 3) || '-' || right('0' || "枝番", 2)
When "準林班名" is 'ワ' then
"市町村" || '_' || right('00' || "林班", 3) || 'M' || right('00' || "小班", 3) || '-' || right('0' || "枝番", 2)
When "準林班名" is 'カ' then
"市町村" || '_' || right('00' || "林班", 3) || 'N' || right('00' || "小班", 3) || '-' || right('0' || "枝番", 2)
When "準林班名" is 'ヨ' then
"市町村" || '_' || right('00' || "林班", 3) || 'O' || right('00' || "小班", 3) || '-' || right('0' || "枝番", 2)
When "準林班名" is 'タ' then
"市町村" || '_' || right('00' || "林班", 3) || 'P' || right('00' || "小班", 3) || '-' || right('0' || "枝番", 2)
When "準林班名" is 'レ' then
"市町村" || '_' || right('00' || "林班", 3) || 'Q' || right('00' || "小班", 3) || '-' || right('0' || "枝番", 2)
When "準林班名" is 'ソ' then
"市町村" || '_' || right('00' || "林班", 3) || 'R' || right('00' || "小班", 3) || '-' || right('0' || "枝番", 2)
When "準林班名" is 'ツ' then
"市町村" || '_' || right('00' || "林班", 3) || 'S' || right('00' || "小班", 3) || '-' || right('0' || "枝番", 2)
When "準林班名" is 'ネ' then
"市町村" || '_' || right('00' || "林班", 3) || 'T' || right('00' || "小班", 3) || '-' || right('0' || "枝番", 2)
When "準林班名" is 'ナ' then
"市町村" || '_' || right('00' || "林班", 3) || 'U' || right('00' || "小班", 3) || '-' || right('0' || "枝番", 2)
When "準林班名" is 'ラ' then
"市町村" || '_' || right('00' || "林班", 3) || 'V' || right('00' || "小班", 3) || '-' || right('0' || "枝番", 2)
When "準林班名" is 'ム' then
"市町村" || '_' || right('00' || "林班", 3) || 'W' || right('00' || "小班", 3) || '-' || right('0' || "枝番", 2)
When "準林班名" is 'ウ' then
"市町村" || '_' || right('00' || "林班", 3) || 'X' || right('00' || "小班", 3) || '-' || right('0' || "枝番", 2)
End

この条件式を実行した結果は、以下のとおり。約700のデータを更新するのに要した時間は、3〜4秒ぐらい?! データの更新を終えたら、保存して編集モードを終了します。
09.jpg

ここで、フィールド名「ID」のところをクリックしてソートしてみました。

10.jpg
はい、林小班順にデータが並びました。枝番のある林小班もバッチリ並んでいます。これなら属性テーブル上で目的の林小班を探すのも楽ですね。

今回生成して属性データへ入れた文字列ですが、他で作ったデータを統合(マッチアップ)する際のKeyにも使えます。他にも応用できる例があれば、ぜひご教授いただければ嬉しく思います。

−…−

【余談】当初は、シェープファイルを構成するDBFファイルをExcel2000に読み込み、簡単なマクロを走らせて目的を達成しようと試行。しかし、最後にデータを保存すると、保存後になぜかDBFファイルが壊れてしまうという不具合が発生。あれこれ試すもダメでしたし、そもそもDBFファイルを編集できるExcelをお持ちの方も今や少数だろうと(勝手ながら)思われるので、それなら誰でもできる方法をと試行した次第ですhi。
posted by きこり@JH最大の難所 at 23:52 | 岐阜 ☔ | Comment(0) | TrackBack(0) | 本業のお話し | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]


この記事へのトラックバック