QGIS – フィルタ~地物の抽出

たとえば国土数値情報の全国行政界データから、特定県のみ取り出したいときなど。

手順は以下の通り。

  • 抽出元の全国レイヤを右クリックして「フィルター」を選択して「クエリビルダ」ダイアログ起動
  • 抽出条件を指定
    • ここでは都道府県名フィールド”N03_001″の内容が’神奈川県’の地物のみ取り出す
    • 文字定数の指定はシングルクォート(‘)で囲うこと
  • OKボタンを押して抽出実行

ただしQGISのクエリ式はクセがあるので注意

qgis-filter-query-builder-dialog

なおこの段階では、元の全国データは残ったまま、神奈川県分だけを表示させている状態なので、もう一度右クリック→フィルターでクエリビルダを表示させると抽出条件が残っている。

ここで「クリア」ボタンを押して条件をクリアすると、元の全国データが表示される。

抽出された地物だけを新しいレイヤとしたい場合は、新規レイヤに地物を貼り付けて保存する必要がある。

 

QGIS – 数値による地図の塗り分け

属性データの数値の大きさによってポリゴンの色を塗り分ける方法をまとめる。

例として、国勢調査の都道府県別人口の増減を平成22年と27年で比べる。以下のような属性データを使用。pop2011とpop2015は国勢調査データをCSV化して結合、pop15-11はこれら二つのフィールドに対してフィールド計算機を使って生成したデータ。

code name pop2011 pop2015 pop15-11
01000 北海道 5506419 5381733 -124686
02000 青森県 1373339 1308265 -65074
03000 岩手県 1330147 1279594 -50553
・・・ ・・・ ・・・ ・・・ ・・・
  • 塗り分けるレイヤを右クリックし、プロパティで「レイヤプロパティ」ダイアログを立ち上げ、「スタイル」タブを選択
  • 一番上のドロップダウンで、「段階に分けられた」を選択
  • 「カラム」で色分けの元となるカラムを選択
  • 「方法」はColor、「色諧調」はそのまま
  • 「分類」ボタンを押して、いったん自動で分類表示
  • 最小値と最大値を確認し、それを適切に分割する階級を検討・設定
    • 右方の「分類数」で階級の数を設定
    • 各階級の「値」エリアをダブルクリックして、階級の下限・上限を入力
    • 各階級の「シンボル」エリアをダブルクリックして、階級の色を指定
  • OKボタンで描画
  • 必要に応じてプロジェクト保存

qgis-population-change-2011-2015-daialog

QGIS – CSVファイルの結合

概要

レイヤの地物に対して属性データを関連付けて追加するのに、CSVファイルを使う方法をまとめる。

大まかな手順としては以下のようになる。

  • CSVファイルとCSVTファイルの準備
  • CSVファイルのレイヤへの追加
  • レイヤへのCSVデータの結合

ここでは、都道府県行政界データに対して国勢調査の人口データを結合し、人口規模に応じた色分けをする例で手順をまとめる。

結合先レイヤの確認

結合先のレイヤとして、国土数値情報の行政界データを都道府県レベルで融合し、簡素化したデータを使う。

フィールドを各種処理後に整理し、以下のような属性データとなっている。

code name
01000 北海道
02000 青森県
03000 岩手県
・・・ ・・・

CSVファイルの準備

総務省統計局の平成27年国勢調査の結果、統計表一覧から都道府県別人口データを入手し、以下のように都道府県名と人口データのみを抽出。

1行目には、結合時の目安となるようなフィールド名を入れておく。このときCSVファイルでフィールド名をダブルクォート(“)で囲まないと認識されないという状況が発生した(QGIS 2.16)。

CSVファイル側の結合キーには都道府県名を使う意図で、地図レイヤのフィールド名と区別するために大文字を使用した。

“NAME” “pop2015”
北海道 5381733
青森県 1308265
岩手県 1279594
・・・ ・・・

CSVTファイルの準備

QGISでCSVファイルを単に読み込むと、数値データも文字列として扱われてしまう。

文字列、数値を明示するため、拡張子csvtのテキストファイルを準備し、1行で各カラムの型を指定する。型指定の種類には”String”、”Integer”、”Real”などがあり、桁数指定も可能。英文の開発者による説明はこちら

これらの型指定子をカンマ(‘)で区切って並べるとき、間にスペースを入れると機能せず全てStringと認識されてしまうという状況が発生した(QGIS 2.16)。

今回は都道府県名と人口の2カラムなので、テキストエディタで以下の内容を作成して、拡張子csvtでCSVファイルと同じディレクトリ下に保存する。

CSVファイルのレイヤへの追加

CSVファイルをQGISのレイヤパネルにドラッグ・アンド・ドロップし、レイヤからCSVファイルへの参照を追加。

qgis-csv-import-adding-layer

CSVファイルの結合

  • 地図レイヤを右クリックし、プロパティでダイアログを立ち上げ、「結合」タブを選択
  • 左下の「+」ボタンを押して、「ベクタ結合の追加」ダイアログ立ち上げ
    • 「レイヤの結合」でCSVファイルを指定
    • 「結合フィールド」でCSV側のキーになるフィールド名を指定
    • 「ターゲットフィールド」で結合される地図レイヤのキーになるフィールド名を指定
    • そのまま進めると、CSVのフィールドにCSVファイル名が接頭辞として付加されてしまい、10文字制限が支障となるので、「フィールド名の接頭辞」にチェックを入れ、その下のファイル名を消す
  • OKボタンを押すと、レイヤプロパティダイアログに結合されたファイルが表示される
  • レイヤプロパティのOKボタンを押して処理完了

qgis-csv-import-binding-dialog

ここでレイヤを右クリックして属性テーブルを表示と、都道府県コード、都道府県名、人口データが並んでいるのが確認できる。

人口規模ごとの段階で都道府県を色分けすると、以下の通り。

qgis-csv-import-map-population

参考:結合データに対する計算

結合後のデータに対してフィールド計算機を使い、新たなフィールドを定義することも可能。手順についてはこちらにまとめている。

以下は、平成22年と27年の国勢調査データを結合し、その差分を計算した人口増減データにより都道府県を塗り分けたもの。

qgis-population-change-2011-2015-map

 

QGIS – 簡素化

 

概要

簡素化(Simplify)は、ポリゴン境界の点を間引く。簡素化によって、データ容量は削減、形状は荒くなり、ポリゴン間に隙間・重なりが生じてくる。

たとえば九十九里浜のデータをオリジナルと簡素化後で比較すると以下のようになるが、相当数のポイントが削除されていることがわかる。

qgis-simplification-original

qgis-simplification-simple

手順

メニューの「ベクタ」→「ジオメトリツール」→「ジオメトリの簡素化」でダイアログが開く。

qgis-simplify-dialog1

  • “入力レイヤ”で簡素化したいレイヤを選択
  • “許容範囲”の数値を指定(後段で説明)
  • “Simplified”は簡素化後の出力先/Shapeファイルの場合はshpファイル名で指定する
  • “アルゴリズム実行後に・・・”は実行終了後にレイヤを表示させたいときにチェック
  • Runボタンで実行

融合(Dissolve)処理に比べて処理は早く、2~3分程度。

許容範囲の値と容量・精度

許容範囲の数値は簡素化の程度に相当し、数値が大きいほど多くの点が間引かれる。許容範囲が大きすぎると、ポリゴン境界が接しなくなる。

許容範囲 shpファイルサイズ 境界切れ
(元ファイル) 220,131KB なし
0.000001 176,010KB なし
0.00001 104,925KB なし
0.00005 47,158KB 僅か
0.0001 33,165KB 僅か
0.001 13,830KB 発生

たとえば許容範囲0.001の場合、以下のように市区町村間に隙間ができる。

qgis-simplification-disorder

許容範囲をより小さくすると境界線のずれは見た目ではわからないが、よく探すと細かいところでずれている。たとえば以下は京都府木津川市内の笠置町の飛地で、許容値0.00005の場合。

qgis-simplification-disorder2

同じ場所で許容値0.0001にした場合。

qgis-simplification-disorder3

このレベルになるとズレの規模が数十メートル程度なので、全国のデータを扱うときにはこの程度の簡素化をすることで、かなりの容量と処理時間の低減に結び付く。

簡素化の効果

簡素化によってポイントの数が減ることから、shpファイルの容量の削減、処理速度の向上に繋がる。

たとえば国土数値情報の行政界データについて、オリジナルのデータと許容値0.0001で簡素化したデータを比較すると、ファイル容量で220,131KB→33,165KBと190MB、85%の減少。

また時間のかかる融合(Dissolve)処理についても、オリジナルデータで何時間もかかっていたのが、簡素化後では6分程度で終了するという大きな効果。

したがって、全国の市町村データなどを扱うような場合には簡素化データ、特定の県・市町村の場合にはオリジナルデータといったデータの使い分けが重要。

 

QGIS – 融合(Dissolve)

概要

融合処理は、同じ属性条件の複数のポリゴン間の境界を取り除き、一つのポリゴンにする。

シングルパートをマルチパートに変換しても、各々のポリゴンは残っており、その境界線は表示されるが、融合することでそれらが一つのポリゴンとなる。

qgis-disolved-japan

手順

メニューの「ベクタ」→「空間演算ツール」→「Dissolve」でダイアログが開く。

qgis-dissolve-dialog

  • “入力レイヤ”で融合したいレイヤを選択
  • “Dissolve all …”のチェックは、全てのポリゴンを一つにまとめたいときを除いて外す
  • “Unique ID fields”は融合の同一判定に使うフィールドを選択して右へ
  • “融合”は融合後の出力先/Shapeファイルの場合はshpファイル名で指定する
  • “アルゴリズム実行後に・・・”は実行終了後にレイヤを表示させたいときにチェック

処理時間

QGISによる融合処理には非常に長い時間がかかる

たとえば国土数値情報の市区町村別行政界データを都道府県でまとめるのに、Intel Core i5、メモリ4GB、Windows10の条件下で6時間ほどかかった。

5時間過ぎるまでほとんどフリーズしたかのような状態になり、最後の20~30分くらいでプログレスバーが表示され(進捗率27%)、そこからは(それまで待たされた時間と比べれば)進みが早い。

隣接する二つの市の融合が終わるまで数分、徳島県と高知県の市町村を両県にまとめるのに15分くらい。離島や港湾地域のややこしい形があると、より実行時間が長くなるものと推測される。

属性データ

融合の際にユニークフィールドとして都道府県名を指定すると、同じ都道府県名の市区町村の属性データが複数存在するが、融合後のポリゴンの属性としては一つしか残らない。

融合前のユニークキーが同じデータの先頭行のデータが融合後の属性データとなるが、ほとんどの場合はこれは意味を持たないため、別にデータをセットする必要がある。

簡素化の効果

簡素化(Simplify)の効果は大きく、全国レベルでポリゴン境界の齟齬が殆ど目立たない程度の簡素化で、大幅に(数時間→数分)処理時間が短縮される

QGIS – マルチポリゴン化

マルチポリゴンの意義

国土数値情報の行政界データでは、離島や飛び地がある自治体はそれぞれが独立したポリゴンとなっていて、それぞれに同じ自治体名が付けられている。ただし自治体番号の後ろに連番を付けた番号が付けられている。

これら同じ自治体に複数のポリゴンがある場合、自治体オブジェクトとしては一つとして、それが複数のポリゴンをもつようなマルチポリゴンにする方が有効な場合が多い。

たとえば自治体単位での面積を求める場合、一つの自治体を指定すれば全ポリゴンの面積を加えられる。またラベルを表示する場合、マルチポリゴンにしなければ一つひとつの島や飛び地にも自治体名が表示されてしまうが、集約すれば一つの自治体に一つだけラベルが付けられる。

マルチポリゴンのほかにはラインやポイントを集約する場合もあり、それらは総称してマルチパートと呼ばれている。これに対して一つのオブジェクトに一つのポリゴンが対応しているのをシングルポリゴン(シングルパート)と呼ぶ。

QGISでのマルチポリゴン化

QGISでシングルポリゴンをマルチポリゴンに変更するには以下のように操作する。

  1. メニューから「ベクタ」→「ジオメトリツール」→「シングルパートをマルチパートに集約」
  2. 集約のキーとなるユニークなフィールドを指定
  3. 集約後のshpファイルを保存する場所とファイル名を指定
  4. 実行

まずメニューから「シングルパートをマルチパートに集約」を選択。

 

注意点

処理時間

全国のデータをマルチパート化するとかなり時間がかかる。Core i5のマシンで2時間近くかかった。

マルチパートのデータ

シングルパーツのオブジェクトが面積などのデータを持っていた場合、マルチパートに集約すると、先頭のアイテムのデータが代表となってマルチパートのデータになる。

行政改データの境界未定地

行政界データをマルチポリゴン化する場合、集約キーとなるユニークフィールドに市町村名を用いると、各都道府県の所属未定地が全国で同じ名前となり、ひとまとめになってしまう。これを回避するため、新たにフィールドをつくり、値を都道府県名+市町村名とすれば、所属未定地も都道府県単位で分割される。

 

QGIS – 属性テーブルの操作

テーブル構成の操作

テーブル構成を操作するときはメニューから「レイヤ」→「プロパティ」で開いたダイアログで「フィールド」を選択し、テーブル構成のペインを開いて操作する。

フィールドの追加・削除

  1. 編集モード切替ボタンを押して編集モードに切り替え
  2. フィールド追加の場合は「新規フィールドボタン」
  3. フィールド削除の場合はフィールドを選択して「フィールド削除」ボタン

フィールド計算機

他のフィールドの値を使った計算結果を表示させる。

  1. 属性テーブルのダイアログでフィールド計算機のボタンを押してダイアログ表示
  2. 新規フィールドをつくるか既存フィールドを使うかを選択
  3. 計算式を入力
  4. Okボタンで実行

項目名変更

項目名変更はテーブル構成操作のダイアログで別名を定義する方法と、プロセッシングツールから行う方法がある。

データの操作

テーブルのデータを操作するときは、「属性テーブルを開く」ボタンを押すか、レイヤパネルのレイヤ名を右クリックして「属性テーブルを開く」でテーブルを表示させる。

 

QGIS – カテゴリによる地図の塗り分け

都道府県や市区町村のような地図を、値データではなくカテゴリデータで分類して塗り分ける方法。自治体名そのものをデータとすると、自治体ごとに色を変えて塗り分けることができる。

qgis-japan-random-paint

この操作は次のように行う。

  1. レイヤパネルで塗り分けたい地図のレイヤを右クリック→「プロパティ」
  2. ダイアログの左タブで「スタイル」を選択
  3. 一番上のドロップダウンで「分類された」を選択
  4. その下のドロップダウンで、分類に使うカテゴリデータの項目を選択
  5. シンボルや色階調を選択(上の都道府県塗り分けでは「ランダムカラー」を使った)
  6. 「分類」ボタンを押してスクロールウィンドウの表示を確認
  7. 「はい」ボタン/「適用」ボタンで塗り分け実行

 

QGIS – ラベル表示

表示されている地物に、属性データのカテゴリーを選んでラベルとして表示することができる。

  1. レイヤパネルで対象のレイヤを右クリック→「プロパティ」
  2. 左側のタブで「ラベル」を選択
  3. 一番上のドロップダウンで「このレイヤのラベル表示」を選択
  4. その下のドロップダウンでラベルに使う項目を選択
  5. 「はい」か「適用」を選択

ただし日本の全市区町村名をラベルとして表示させようとするとかなり重たくなる。一定サイズ以上の地物だけラベルを表示させるようにすると軽くなる。

 

QGIS – 属性データの項目名変更

項目名の制限と対策

QGISは属性名の長さが半角10文字以内と短いため使い難い。より長い文字列を項目名として使う対策として2通りある。

  1. 項目名を編集する方法
  2. 項目の別名を定義する方法

項目名自体を編集するには、プロセッシングツールを使う必要があり、新しいShapeファイルへ書き出すことになるので手間がかかる。

項目の別名は通常メニューから操作でき、新しいShapeファイルも作成されない。

項目名を編集する方法

各レイヤの属性データの項目名を変更方法として、Table Managerというプラグインの利用が紹介されているが、これを実行してみたところ「最新バージョンではQGIS内でテーブル操作が可能となっており、プラグインの仕様はデータの破壊の可能性が・・・」といった趣旨の警告ダイアログが立ち上がる。

プロセッシングツールの「フィールドのリファクタリング」を用いるとよいらしいので、メニューからたどってみると、属性テーブルの項目情報が表示され、それらが変更可能になっていた。

メモとして手順だけを示しておく。

  1. 「プロセッシング」→「ツールボックス」でプロセッシングツールボックスが開く
  2. 「QGISジオアルゴリズム」→「ベクターテーブルツール」と階層をたどると「フィールドのリファクタリング」が見つかる
  3. それをダブルクリックするとダイアログが立ち上がり、属性テーブルの項目情報が表示される。
  4. 入力レイヤを選択
    • “Do you want to reset the field mapping?”のダイアログに「はい」
  5. フィールドマッピングエリアで、項目名(Name)の書き換え
  6.  Refactordで新しいファイルの保存場所とファイル名を指定
    • System(UTF-8にしたらエラーになって文字化けした)
  7. Run
    • Pythonでエラーが出るが気にしない

注意点

新しいShapeファイルの書き出しは、フォルダが空の場合は早いが、既に同名のshpファイルがある場合は極端に処理が重くなる

項目名の別名を定義する方法

レイヤのプロパティから、各項目の別名を入力・設定することができる。この方法は新しいShapeファイルを生成しないので時間がかからない。

レイヤーのプロパティーを表示

項目名を変更するレイヤーを右クリックして「プロパティー」を選択。

レイヤプロパティダイアログで以下のように操作する。

  1. 左側のタブ中、「属性フォーム」を選択
  2. 項目名を変更したいフィールドを選択し、別名(Alias)に好みの項目名を入力
  3. OKボタンをクリック

これによって、属性テーブルを表示させたとき項目名に別名が表示されるようになる。