R と Qt による PostgreSQL / PostGIS データの 可視化

2014/12/5 PostgreSQL カンファレンス 2014
R と Qt による
PostgreSQL / PostGIS データの
可視化ツール
リンク元 … http://kenpg2.seesaa.net/article/409350942.html
ツール開発の目的
1 … PostgreSQL / PostGIS データをシームレスに可視化したい
2 … R との連携作業のプラットフォームを作りたい
2
開発したツール pgQR(仮称)の土台
・ GUI アプリケーションフレームワーク「Qt」(言語は C++)
・ Qt アプリに R を埋め込むライブラリ「RInside」
・ グラフィック出力・表示に
SVG と WebKit を利用
Qt 公式ウェブサイト
http://qt-project.org/
RInside 開発者のサイト
http://dirk.eddelbuettel.com/
3
PostGIS について
公式ウェブサイト http://postgis.net/
・PostgreSQL の拡張の一つ(スタックビルダからもインストール可能)
・地理情報システム(GIS)用のデータ型と関数を追加
・ジオメトリ(線・面・点)とラスタ(画像)両方に対応
・長所 … 数値や文字と同じように地理データを SQL で扱える
・短所 … 数値や文字と同じようにクエリ結果を見ても「?」
4
PostGIS だけのビュワーなら
・QGIS というオープンソースの GIS ソフトウェアがよく使われる
公式ウェブサイト http://www.qgis.org/
・豊富な機能を持つ汎用的な GIS ソフト
・最新バージョン 2.6 の Windows インストーラは 317MB
・R の前は、自分もよく使っていた
・pgAdminIII プラグインのビュワーを開発している人もいるが…
ブログ(フランス語)http://ageoguy.blogspot.jp/
・Windows で、QGIS のライブラリ+ Python を使用
・自分が試した範囲では、動いたことがない
5
6
R について
公式ウェブサイト http://www.r-project.org/
・オープンソースの統計処理言語
・独自の GUI が付属 … コンソール + グラフィック出力ウィンドウ
・グラフ作成が手軽 … plot(...) だけで「何か描ける」
⇋
・地理データの可視化も手軽 … plot(...) だけで 〃
plot(dataframe)
⇋
plot(polygons)
R と PostgreSQL / PostGIS の連携(1)
・R から PostgreSQL の数値・文字データを読み込む : 簡単
・パッケージ RPostgreSQL を使う
library(RPostgreSQL)
con = dbConnect(host='...', port=5432, dbname='...' ……)
sql = '.......'
dat = dbGetQuery(con, sql)
・PostGIS の地理データを読み込む : いろいろ面倒
・あらかじめクエリで、地理データをテキスト化(WKT 形式)
・パッケージ rgeos を使い、R の地理データに戻す。など…
両方のデータ処理を共通化したい
今回のツールで実現
⇋
PostgreSQL への接続を自動化したい
7
R と PostgreSQL / PostGIS の連携(2)
8
・PostgreSQL のクエリ操作と R 実行をシームレスに行う、過去の試み
・R のコードを PostgreSQL 内に文字データとして保存し、
pgAdminIII の自作プラグインで R を起動してコードを渡す
(2012 年 PgDay で紹介)
・PostgreSQL への組み込み言語 PL/R を使う
(2013 年 PostgreSQL カンファレンス、2014 年アンカンファレンスで紹介)
・PL/R は制約があるので(クエリに日本語を使えない、DO 文にできない等)
さらに PL/Python を使って補う
… いずれも柔軟性が少なく、「無理矢理」感も強かった …
手探りの世界を突き抜けて、今回のツールで新しい段階へ
ツール pgQR(仮称)開発・実行環境
・CentOS 6.6 x64(VMware Player 上の仮想マシン)
・Qt 5.3
・PostgreSQL 9.3.5 / PostGIS 2.1.3
・R 3.1.2
・R への追加パッケージ
RInside 0.2.11
… Qt アプリに R を埋め込む
RPostgreSQL 0.4
… PostgreSQL とのやり取り
rgeos 0.3-8
… WKT 形式を地理データに戻す
maptools 0.8-30
… 地理データをプロット
RSVGTipsDevice 1.0-4… グラフ等を SVG に出力
9
ツール pgQR(仮称)構成要素
11
6 つのパーツ(QDockWidgets)
1 データベース接続
2 SQL 入力
3 SQL 結果テーブル
4 R スクリプト入力
5 グラフィック表示
1
4
2
6 メッセージ表示
5
3
いずれも Dockable = 移動・切り離し・表示 / 非表示が自由
6
12
6 つのパーツの基本関係(1)
・ PostgreSQL と R を別々に使う
ツール起動
1 データベース接続
手動でコピペ
2 SQL 入力
実行
4 R スクリプト入力
実行
3 SQL 結果テーブル
エラーまたは
非参照系クエリ
6 メッセージ表示
print 文があれば
5 グラフィック表示
13
6 つのパーツの基本関係(2)
・ PostgreSQL / PostGIS の結果テーブルを可視化する
ツール起動
1 データベース接続
1) PostgreSQL に接続して SQL を実行
2) 結果を取得してグラフ / 地図化
2 SQL 入力
実行
アプリ内部での R の動作
実行内容が 4 R スクリプト入力欄に
セットされる。確認や再実行が簡単
3 SQL 結果テーブル
メニュー実行
(グラフ or 地理データ表示)
5 グラフィック表示
14
6 つのパーツの基本関係(3)
・ PostgreSQL / PostGIS へのクエリを直に可視化する
ツール起動
1 データベース接続
アプリ内部での R の動作
1) PostgreSQL に接続して SQL を実行
2) 結果を取得してグラフ / 地図化
2 SQL 入力
実行内容が 4 R スクリプト入力欄に
セットされる。確認や再実行が簡単
テーブルへの表示をスキップ。
アプリ本体からはクエリを実行しない
メニュー実行
(グラフ or 地理データ表示)
5 グラフィック表示
15
6 つのパーツの基本関係(4)
・ PostgreSQL / PostGIS へのクエリ結果を、テンプレートで処理
ツール起動
1 データベース接続
アプリ内部での R の動作
1) PostgreSQL に接続して SQL を実行
2) 取得したデータをテンプレートに渡す
2 SQL 入力
3) テンプレートからの文字出力、グラフ
や地図がそれぞれ表示される
実行内容が 4 R スクリプト入力欄に
セットされる。確認や再実行が簡単
分析用のテンプレート
メニュー実行
6 メッセージ表示
5 グラフィック表示
16
6 つのパーツの基本関係(5)
・ PostgreSQL / PostGIS データを、SQL で直接 HTML / SVG 化
ツール起動
1 データベース接続
アプリ内部の動作
2 SQL 入力
2) 取得した HTML / SVG データをそのまま
QWebView に表示
・SVG はテキスト形式なので、SQL を
工夫すれば直接 SVG を作成できる
・SVG に適宜 HTML タグ、CSS、
JavaScript を加えれば、そのまま
Web ページになる
1) PostgreSQL に接続して SQL を実行
R を経由せず、PostGIS データを
SVG で可視化できる
SQL To SVG の
メニュー実行
5 グラフィック表示
1 データベース接続(QLineEdit)
・ psql と同じ接続文字列を 1 行で入力
-h ホスト名またはアドレス
-p ポート番号
-d データベース名
-U ユーザ名
・メニューでデータベース接続を実行 → パスワードダイアログ
17
2 SQL 入力(QTextEdit)
・ 普通に SQL を入力し、メニューから実行
・ 選択部分があれば、そこだけ実行
・ 右クリックとショートカット … Undo, Redo, Cut, Paste など
(QTextEdit に元から備わっている)
・追加予定 : キーワードハイライト、検索・置換
18
3 SQL 結果表示テーブル(QTableView)
・ 基本、SELECT 結果をそのまま表示
・ ただし bytea 型と PostGIS データは
データがある印の「...」だけを表示
・ 各列の表示文字数、全体の表示行数の
上限を設定可能
・ 元のデータ型、アプリ内部の Qt の型の
両方を表示可能
19
4 R スクリプト入力(QTextEdit)
20
・ 3 SQL 入力と基本的に同じ。実行先を R に替えたもの
・ ただし PostgreSQL へ接続するコードを書く場合、パスワードは空に
R 実行時:アプリ側で自動的にパスワードダイアログを開き、
内部で接続文字列にパスワードを加えて PostgreSQL へ渡す
5 グラフィック表示(QWebView)
・ 基本 : R が出力したグラフ / 地図などの SVG を読み込んで表示
・ 複数のグラフ / 地図があれば
縦に並べて表示
(普通の Web ページと同様)
・ 複数のグラフ / 地図への移動
リンクを、JavaScript で付加
(アプリ内部で自動挿入)
21
5 グラフィック表示欄に Web ドキュメント
・ QWebView に URL を渡せば、WebKit ベースのブラウザ代わりに
・ 現在はアドレスバー等がないので、基本、リンクをたどるだけ
・右クリックで「戻る」「進む」「再読み込み」のみ可能
・リンク先によっては、開けない場合あり
22
6 メッセージ表示(QTextEdit)
・ 基本 : データベース接続の実行結果、SQL エラーなどを表示
・ R の print 文
の結果表示も
兼ねる
23
ツール pgQR(仮称)使用と動作の実際
起動時と View メニュー
25
・ なぜか起動時は、グラフィック表示部
(QWebView)が最も大きくなる
・各ウィジェットの位置、大きさ、表示 /
非表示は自由に変えられる
・フルスクリーン化、フォント変更も可能
今後検討 : 任意時点の表示設定を「お気に入り」として
保存し、再利用できるようにしたい
データベースに接続できたら
26
・ メッセージ欄に DB Connected : qt_sql_
default_connection と表示される
・Qt にデフォルトで備わっている、汎用的な
データベース接続モジュール QtSql を使用
※ QtSql では PostgreSQL の NOTICE, INFO を受け
取れないようなので、libpq の利用を今後検討
テーブルの先頭を表示し、グラフのテスト
27
グラフにする列を選択し、右クリックでグラフ種別を選ぶだけ
グラフ描画は、外部の R スクリプトが行う
・ テーブルでの右クリックと、
メニューバーの Pg Data は同じ
28
・ グラフの各メニューは、特定の
フォルダ下にある R スクリプト
一つ一つと対応
・選択されたメニューに対応する
R スクリプトを自動実行
実行されたスクリプトは
アプリ内に読み込まれる。
⇋
確認や修正実行が簡単
29
グラフ化する列を増やした場合(1)
・ 基本的に、R スクリプトを任意の列数に対応させている
・グラフの種類によって、複数列の処理の仕方が変わる
Ex. 棒グラフ … 3 通り(別々のグラフ、縦に積む、横に並べる)
円グラフ … 1 通り(別々のグラフ)
棒グラフのパターン 1
各列が別々のグラフ
グラフ化する列を増やした場合(2)
・ 棒グラフのように複数パターンのグラフがある場合
・グラフィック表示欄に、縦に並べて表示
・各グラフに飛ぶフローティングリンクの JavaScript を、アプリが自動追加
30
デモ(1)ウィンドウ関数の移動平均をグラフ化
31
デモ(2)MADLib のロジスティック回帰
32
デモ(3)PostGIS ジオメトリとメッシュデータ
33
デモ(4)SQL で動的な SVG を作成し、動かす
34
ツール pgQR(仮称)位置づけと今後
1. 主眼はデータの概括、チェック、分析の試行、可視化手法の検討
✦ 分析の中でも「軽い」部分を、手軽に PostgreSQL と R を連携させて行う
2. pgAdminIII の置き換えではなく、グラフ / PostGIS 用の補完物
✦ クエリ以外の機能は、自分の場合 pgAdmin で足りる
3. R 本体の置き換えでなく、PostgreSQL 連携用の補完物
✦ アプリに埋め込んだ R は、どうしても不安定さが残る
✦ 重い処理や、グラフを微調整しながら出力を繰り返す時には不向き
これから取り込みたいこと
1. グラフ / 分析用テンプレートの充実
2. SQL / R スクリプトエディタ部分の機能向上
3. できれば他の OS への展開も…
35
以上です。
ご清聴ありがとうございました。
リンク元 … http://kenpg2.seesaa.net/article/409350942.html