QGIS – クリッピング

概要

たとえばあるエリアの地図と、そのエリア内だけ鉄道や道路のベクタを切り出して扱いたい時がある。このようなときは、広域データの鉄道や道路のベクタデータのうちエリア内のみ切り出す「クリッピング」を行う。

ここでは、東京23区内の鉄道路線と駅をクリップする例を示す。大まかな手順は以下の通り。

  1. 23区の地図データを切り出し、外形データを作る
  2. 上記の外形データで鉄道路線と駅の全国データをクリップ

地図データの切り出しと外形データの作成

地物の切り出し

地物を切り出す手順で、23区のみ抽出して保存する。このデータはレイヤとして後に利用する。

外形データの作成

切り出した23区のデータの外形を融合(dissolve)処理によって作成・保存。このデータはクリッピングのために一時的に利用するだけ。

以下の図は、23区の外形ポリゴンと全国の鉄道路線データ、駅データを重ねたもの。

qgis-tokyo-ward-outline-and-railway

クリップ処理

メニューから、ベクタ→空間演算ツール→クリップでダイアログを表示させる。

qgis-clipping-dialog

  • 「入力レイヤ」には、クリップされるデータを指定(この場合は鉄道路線データ)
  • 「レイヤをクリップする」データには、クリップ範囲のデータを指定(この場合は23区の外形データ)
  • 「クリップされた」データには、クリップ後のデータを保存するファイルのパスを指定

実行結果は以下の通り。

qgis-tokyo-ward-clip-railway

 

QGIS – 政令市区の融合

概要

国土数値情報の行政界データは、政令市の区が他の市町村と同じレベルで「行政区域」として扱われている。たとえば神奈川県を例にとると、横浜・川崎・相模原の3政令市については各区のポリゴンが他の市町村と同じように表示される。

qgis-kanagawa-before-disolve

属性テーブルのフィールドでも、最も細かい名称フィールド”N03_004″で政令市は区単位で、政令市名は郡名と同じフィールド”N03_003″に記録されている。

qgis-designated-city-dissolve-attribute-table-before

 

政令市区の融合

政令市も一般市と並びで扱うケースのために、政令市と他の市町村が同じフィールドになるように再構成する。

神奈川県を例にとると、行政界データは以下のように政令市~一般市~郡部町村という構成になっている(注目しているカラムのみ示している)。

N03_001 N03_003 N03_004 N03_007
神奈川県 横浜市 鶴見区 14101
神奈川県 横浜市 都筑区 14118
神奈川県 川崎市 川崎区 14131
神奈川県 川崎市 麻生区 14137
神奈川県 相模原市 緑区 14151
神奈川県 相模原市 南区 14153
神奈川県 横須賀市 14201
神奈川県 綾瀬市 14218
神奈川県 三浦郡 葉山町 14301
神奈川県 愛甲郡 清川村 14402

このうち同じ政令市の区を地物までまとめて一つの政令市として扱うようにする。

N03_001 N03_007 N03_901
神奈川県 14100 横浜市
神奈川県 14130 川崎市
神奈川県 14150 相模原市
神奈川県 14201 横須賀市
神奈川県 14218 綾瀬市
神奈川県 14301 葉山町
神奈川県 14402 清川村

大まかな手順は以下の通り

  • 政令市を含んだ市町村名を、新たにフィールドを作ってそこに設定
  • 政令市のコードは、従来のコード欄の値を手打ちで修正

市町村欄の生成

  • 神奈川県のレイヤの属性テーブルを表示
  • フィールド計算機を立ち上げる
  • 「新しいフィールドを作る」にチェックし、出力フィールド名、フィールドタイプ、フィールド長を設定
  • 条件式を入力
  • OKボタンを押してダイアログを閉じる
  • レイヤの編集モードを解除

qgis-designated-city-dissolve-field-calculator

条件式は以下の通り。

フィールドN03_003は以下のいずれか

  • N03_004が政令市区の場合は政令市名
  • N03_004が一般市の場合は市名
  • N03_004が町村の場合は郡名

そこで、N03_003が’市’で終わる場合(政令市の場合)はN03_003を、その他(一般市町村)の場合はN03_004を新たなフィールドN03_901にセットする。

実行結果は以下の通り。

qgis-designated-city-dissolve-attribute-table-after

次に、「ベクタ」→「空間演算」→「Dissolve」でN03_901フィールドの値で融合処理。融合後の地物は以下の通りで、政令市が一体化されている。

qgis-kanagawa-after-disolve

属性テーブルを開いてみると3政令市がそれぞれ一つにまとめられているが、各フィールドは各政令市のいずれか一つの区のデータのみが残っている。これらについては、手打ちで修正した。

qgis-designated-city-dissolve-attribute-table-code

 

QGIS – クエリ・式

式の入力について

フィルタやフィールド計算機などで必要になるクエリの式についてまとめる。

クエリビルダでフィールドや演算子などを入力するとき、直接キーボードから入力してもいいし、ダイアログのボタンやドロップダウンから選択してもよい。

関数をドロップダウンから選択しても、括弧閉じの対応はされない。

値の参照

レコード内のフィールド値を参照するにはダブルクォート(")でフィールド名を囲む。

数値リテラルはそのまま数値を書き、文字列リテラルはシングルクォート(')で囲む

LIKEであいまい検索をする場合の任意長の文字列は’%(‘*‘は使えない)。以下は’横浜市’、’横浜’、’浜松’にマッチする。

条件検索

条件の真偽によって結果を変える場合はifを使う。

以下、例示。

 

 

QGIS – 地物の切り出し

たとえば全国の行政界データを持っていて、そこから特定の県だけ抜き出したレイヤを作りたいとき。大まかな手順は以下の通り。

  • 抽出対象の地物をフィルタで抽出
  • 抽出後の状態で「領域またはシングルクリックによる地物選択」ボタンを押す
  • 領域を選択してフィルタ後の地物を全選択
  • メニューの「編集」→「地物のコピー」
  • メニューの「編集」→「新規レイヤへの地物の貼り付け」→「新規ベクタレイヤ」
  • 「空間参照システム」ダイアログで座標系を選択(JGD2000)
  • 新規Shapeファイルの保存先ディレクトリとファイル名を指定してOK

例として国土数値情報の全国の行政界データから神奈川県の市区町村のみ取り出す手順をまとめる。

神奈川県の市区町村のみフィルタリングした状態から「領域またはシングルクリックによる地物選択」ボタンを押す。

qgis-select-porigon1

フィルタリングされた神奈川県全体を覆うようにドラッグして地物を選択し、「編集」→「地物のコピー」。

qgis-select-porigon2

続けて「編集」→「新規レイヤへの地物貼り付け」→「新規ベクタレイヤ」。

qgis-select-porigon3

「空間参照システム選択」ダイアログで座標システムを指定。この場合はデフォルトのJGD2000のまま。

qgis-select-porigon4

OKを押すと「ベクタレイヤに名前を付けて保存」ダイアログが立ち上がるので、「ブラウズ」で新しいフォルダとファイル名を指定してOK。

qgis-select-porigon5

「保存されたファイルを地図に追加する」にチェックが入っていれば、新しく作成されたShapeファイルのレイヤがレイヤパネルに追加されて表示される。

qgis-select-porigon6

 

 

 

 

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. Run

注意点

処理時間

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

マルチパートのデータ

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

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

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