Comments
Transcript
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