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