さくらサーバー – MySQL – CSVファイルへのエクスポート

概要

MySQLへのCSVファイルのインポートについては、ターミナル上でのLOAD DATAコマンドによる方法を整理した。

テーブルやSELECTの結果のエクスポートについては、以下の方法がネット上でも一般的。

ただし、さくらレンタルサーバで上記を実行しようとすると、以下のようにエラーになる。

これはレンタルサーバのユーザディレクトリの権限がrwx---r-xとなっていて、MySQLからの書き込みが制限されているためらしく、レンタルサーバでこの権限を変更することは難しい。

phpMyAdminを使ったエクスポートなら、ブラウザ上での操作でテーブルのダウンロードが可能。

phpMyAdminを起動する

さくらレンタルサーバのコントロールパネルを立ち上げ、「データベースの設定」をクリック。

phpmyadmin-start-1

データベースの設定画面で、「管理ツールログイン」をクリック。

phpmyadmin-start-2

新しいタブでphpMyAdminのログイン画面が立ち上がるので、MySQLのユーザ名とパスワードを入力して「実行する」ボタンを押す。

phpmyadmin-login

phpMyAdminでのエクスポート操作

ログイン後の画面の左にデータベースの一覧があるので、エクスポートするテーブルがあるデータベースを選択。

phpmyadmin-select-database

データベース内のテーブル一覧が表示されるので、エクスポートするテーブルにチェックを入れて、「チェックしたものを」のドロップダウンリストから「エクスポート」を選択。

phpmyadmin-table-selection

エクスポート画面の左でCSVを選択すると、右側がCSVのオプション設定になる。

  • フィールド区切りのデフォルト';'','に変更
  • フィールド囲み記号のデフォルト'"'を残すか、必要に応じて削除
  • その他は適当に
  • 「ファイルに保存する」のチェックを外す
  • エンコーディング変換はしない
  • 「実行する」ボタンで、[テーブル名].csvのファイルがダウンロードされる

phpmyadmin-csv-settings

 

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

概要

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

都道府県名 市区町村コード
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句で使われているテーブル名まで全て変更しなければならない。