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 – 列の一括計算~フィールド計算機

概要

たとえば都道府県レイヤの属性データが次のようだとする。

都道府県名 市区町村コード
1 北海道 01101
2 青森県 02201
3 岩手県 03201
・・・ ・・・ ・・・

このデータは、実際に国土数値情報の行政界データを都道府県名で融合させた例で、元の市区町村名などのフィールドは削除している。

ここで都道府県コードを各都道府県に与えたいが、データとしては市区町村コードの形で残っているので、この先頭2文字に”000″を付けた5桁のコードを新たな都道府県コードのフィールドとして生成したい。

そこでこの操作を、フィールド操作のフィールド計算機で行う。

手順

  • 属性テーブルの操作の手順で、フィールド操作のペインを表示させる
  • 編集ボタンを押して編集モードに入る
  • フィールド計算機ボタンを押して計算機のダイアログを表示させる
  • 新しいフィールドを作るか、既存フィールドを更新するかを選択
    • 新しいフィールドを作る場合は、フィールド名やタイプ、フィールド長を入力
    • 今回は新しいフィールド”N03_000″に5桁固定の半角数字のテキストで定義
  • エディタを使ってフィールド計算の内容を記述
    • 今回は市区町村コードのフィールド”N03_007″の左から2文字を取り出し、それに”000″を付け足す
    • 文字列の左から取り出す関数はleft()
    • 文字列の結合は||ボタンで入力
    • 文字列はダブルクォート(“)で囲むとエラーになり、シングルクォートで通る(‘)
  • OKボタンを押す(この時点でまだフィールド計算はされない)
  • 編集ボタンを押して編集モードを解除
    • このときに「変更を保存するか」尋ねられるので、保存すれば計算が実行される

以下はフィールド計算機の入力の様子。

qgis-field-calculator-dialog

実行結果は以下のようになる。

都道府県名 市区町村コード N03_000
1 北海道 01101 01000
2 青森県 02201 02000
3 岩手県 03201 03000
・・・ ・・・ ・・・ ・・・

 

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分程度で終了するという大きな効果。

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

 

MySQL – テーブル名のエイリアス

エイリアスの縛り

以下のようなテーブルを考える。

ここでnation=’US’のレコードのみ抽出するのに、WHERE句のフィールド名に敢えてテーブル名を付ける。

ここでFROM句でテーブルのエイリアスを指定し、WHERE句とSELECT句ではフルネームのテーブル名を使うとエラーが発生。

そこでWHERE句のテーブル名をエイリアスに変えると、正常に動作。

さらにSELECT句のフィールド名もフルネームのテーブル名を付けるとエラーになって・・・

ここもエイリアスにすると正常に動作する。

これらから、以下のことが分かる。

  • FROM句でテーブル名に別名を付けると、元のテーブル名はオーバーライドされて使えなくなる
  • FROM句で付けたエイリアスは、WHERE句、SELECT句に波及する。

この意味で、エイリアス、別名という呼び方よりは、「テーブル名のオーバーライド」くらいがいいのではないかと思った。

INNER JOINでのエイリアスの使い方

次のような小売側・問屋側の2つのテーブルを準備。

この2つのテーブルを結合して、果物の取引のみを抽出する。

まずwholesaleテーブルのエイリアスを定義するのに、WHERE句のテーブル名もエイリアスに変更して

またshopテーブルのエイリアスを定義するなら、SELECT句で使われているテーブル名まで全て変更しなければならない。

 

 

MySQL – 主なコマンド

データベース操作

データベース一覧の表示
SHOW DATABASES;
データベースへの接続
USE [database]

テーブル操作

テーブル全体の操作

テーブル一覧の表示
SHOW TABLES;
テーブルの作成
CREATE TABLE [table]([column] [type], [column] [type], ...);
テーブルの複製
CREATE TABLE [dest_DB].[new_table] SELECT * FROM [source_DB].[source_table]
テーブル名の変更
ALTER TABLE [table] RENAME TO [new_table_name];
テーブルの削除
DROP TABLE [table];
テーブル構造の表示
DESCRIBE [table] または DESC [table];

カラム操作

カラムの追加
ALTER TABLE [table] ADD [field] [type];
カラムの名称と型の変更
ALTER TABLE [table] CHANGE [field] [new_field_name] [type];
カラムの型のみ変更
ALTER TABLE [table] MODIFY [field] [type];
カラムの削除
ALTER TABLE [table] DROP COLUMN [field];

レコード操作

全レコード・全フィールドの表示
SELECT * FROM [table];
指定したフィールドの表示
SELECT [field], [field], ... FROM [table];
昇順/降順表示
SELECT [fields] FROM [table] ORDER BY [field] ASC/DESC;
レコードの追加
INSERT INTO [table] VALUES([field], [field], ...);
レコードの削除(全削除に注意)
DELETE FROM [table] WHERE [condition]
全レコードの削除
DELETE FROM [テーブル]
レコードの変更(全変更に注意)
UPDATE [table] SET [field]=[value] WHERE [condition]

テーブルの結合

内部結合/等結合~Inner Join

INNER JOIN句
SELECT [fields]
FROM [table_1] INNER JOIN [table_2]
ON ([table_1].)[key_1] = ([table_2].)[key_2]
WHERE句
SELECT [field], [field], ...
FROM [table_1], [table_2]
WHERE ([table_1].)[キー1] = ([table_2].)[key_2]

抽出カラムの選択

結合後のカラムの限定
SELECT ..., [table].* [table].[field], ... from [table], [table], ...

条件式

値がNULL
[field] IS NULL

MySQL – レコードの検索

フィールド選択

全レコードの全フィールド

指定したフィールド

レコードの条件検索

文字列検索

たとえば国名で検索する場合。

LIKEによるあいまい検索

LIKE指定で任意の文字・文字列を含む検索ができる。

任意の一文字

アンダースコア('_')は任意の一文字に相当。

任意長の文字列

任意長(0文字以上)の文字列に対応するのは'%'

数値検索

年齢の範囲で検索する場合。

上限と下限で検索する場合、ANDで複数条件を結ぶ。

同じ検索条件をBETWEENで指定できる。

対象列挙

IN(...)でカンマで区切った値の何れかと一致するレコードが抽出される。

 

 

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

さくらサーバー – MySQL – CSVファイルのインポート

概要

ローカルでつくったCSVファイルをさくらレンタルサーバにアップロードしてテーブルに読み込む手順。

  1. CSVファイルを準備する
  2. CSVファイルをアップロードする
  3. MySQLにログオン(ファイルを読めるようにするオプションが必要)
  4. ファイルをテーブルに読み込む。

CSVファイルの準備

  1. 表計算ソフトでCSVファイルを作成して保存
  2. Excelの場合は文字コードにUTF-8を指定できないので、エディタで読み込んで文字コードと改行コードを指定して保存
    • 文字コードはUTF-8
    • 改行コードはLF

CSVファイルのアップロード

さくらレンタルサーバの場合、ファイルのアップロード先は~/www/のディレクトリ下。フルパスだと、/home/USERNAME/www

必要に応じてファイルの場所を移動。

MySQLへのログイン

MySQLがローカルファイルから読み込めるよう、--enable-local-infileオプションをつけてログイン。

ファイルの読み込み

  • コマンドはLOAD DATA INFILEコマンド
  • サーバにアップロードしたファイルをローカルで読み込むので”LOAD DATA LOCAL INFILE ...“とする
  • コマンドが長いので、エディタなどで複数行に打ち込んで、コンソールへコピー・ペースト

改行がCR+LFの場合、LINES TERMINATED BY "\r\n"を付加する。

実行例

以下のようなテストファイルを用意してアップロードしておく。

 

 

 

コンソールでのMySQLの文字化け

症状

コンソールからテーブルに、日本語を含んだレコードを追加すると文字化けしてしまう。

たとえば以下のようなデータを持つテーブルがあるとする。

これをそのままSELECTコマンドで表示させると、以下のように文字化け。

WHERE句で無理矢理元の文字列’山田’で探そうとすると、以下のようなエラーが出る。

これはその文字列は存在しているがコードが違うと言われているようだ。

そこでMySQLのcharacter_set群がどのように設定されているかを確認。確認コマンドは以下の形式。

以下、実行結果。

さくらレンタルサーバでDBを追加する際の文字コード指定はUTF-8としていて、ターミナル側の設定はUTF-8だが、ほとんどがujis = EUC_jpになっている。

対策

MySQLにログインした後、一度だけ以下を実行する。

以下、実行例。

適切に表示され、chracter_set変数群も_serverを除いて全てUTF-8になっている。

なお、SET CHARSET utf8での文字コード設定を説明しているサイトが殆どだが、この方法だと文字化けはなくなるが、カラム幅が崩れてしまう。この時のcharacter_setの設定値は上と同じに変更されるが表示のされ方が違う。

対策・改

その後、MySQLに入る時に以下を実行する方法も知った。--default-character-set=utf8mb4を指定する。

この結果文字コードは以下のようになって、文字化けも解消。

20210604