• 検索結果がありません。

GIS を中心に 多彩なデータ処理を PostgreSQL で 国府田諭 Satoshi Koda このスライドは (kenpg myna で検索 )

N/A
N/A
Protected

Academic year: 2021

シェア "GIS を中心に 多彩なデータ処理を PostgreSQL で 国府田諭 Satoshi Koda このスライドは (kenpg myna で検索 )"

Copied!
35
0
0

読み込み中.... (全文を見る)

全文

(1)

GISを中心に

多彩なデータ処理をPostgreSQLで

国府田 諭 Satoshi Koda

http://kenpg.bitbucket.org/

このスライドは

↓(kenpg myna で検索)

http://kenpg.bitbucket.org/blog/201602/20.html

(2)

今⽇話したいこと

ポスグレ単体でなく PostgreSuite としての魅⼒

エンドユーザの⾃分はこんな⾵に⼯夫して使ってます

Spatial is not special !

GIS(地理情報システム)は特殊なデータ処理じゃない

…… ですが、リクエストがあったので昨年のカンファレンス (11/27)、

(3)

今⽇の本題に戻って、具体的には(1)

PostgreSQL 9.5 の新機能 IMPORT FOREIGN SCHEMA に、 GIS関連の外部データラッパ「 OGR_FDW 」が早速対応

・ローカルフォルダを、仮想的なスキーマとして扱える

・フォルダ内のGISデータを⼀括インポート可能(テーブルや列を⾒なくていい)

(4)

具体的には(2)

エンドユーザの⾃分はこんな⾵に⼯夫して使ってます 最近とくに熱いのは PostGIS + PL/v8 + ウィンドウ関数⾃作 + 直接、SVGに出⼒ ・PostGISの地理データ型を、PL/v8のストアド関数に渡す ・ウィンドウ関数がある「だけじゃない」、簡単に⾃作できる ・GISデータのビュワーがない -> SVGに出してブラウザで⾒る

(5)
(6)

今⽇のスコープ / 本来の関⼼事

データを料理に例えれば 材料の調達  ↓ データ⼊⼿ ↓ 仕込み  ↓ 整理 ↓ 調理  ↓ 分析  ↓ 盛り付け  ↓ 可視化・⽂章化  ↓ いただきます 社会へアウトプット (⾒て楽しむ料理もアリだけど…)

(7)

今⽇のスコープ / 本来の関⼼事

データを料理に例えれば 材料の調達  ↓ データ⼊⼿ ↓ 仕込み  ↓ 整理 ↓ 調理  ↓ 分析  ↓ 盛り付け  ↓ 可視化・⽂章化  ↓ いただきます 社会へアウトプット (⾒て楽しむ料理もアリだけど…)

(8)
(9)

よくある GIS と、PostGIS の違い

GISとは ? 地理情報システム Geographic Information System ・エンドユーザにとって、たいてい「地図を作らないと始まらない」 ・Excelが「表を作らないと始まらない」のと同様 GISデータベース(空間データベース)は違う ・地図でなくデータそのものを格納・管理・演算(編集)する ・GUIでなくSQLが操作の中⼼ ・地図は、アウトプットの⼀形態にすぎない

(10)

PostGIS & 周辺について

PostGIS : PostgreSQLの機能拡張の⼀つ ・基本は、ユーザが⾃分でインストールする ・Amazon RDS や Postgres.app など「最初から⼊ってる」ケースもあり ・追加されるのは、データ型・関数・コマンドラインツールなど PostGISに対する拡張、外部ツールも存在 ・pgRouting : 経路探索(カーナビ的なあれ) ・pointcloud_postgis : 点群データ操作(3次元スキャナ的なあれ) ・OGR_FDW : 様々なGISデータを外部テーブル化 ← 今⽇の本題(1)

(11)

OGR_FDWでCSV⼀括インポート(1)

インストール

・⾃分は Windows 7 x64 + PostgreSQL 9.5.0 で  (PostGIS のWindows⽤バイナリ配布サイトにある) ・CSV読み込みだけなら、PostGISがなくてもOK

・CentOSでは yum install ogr_fdw95

(12)

PostGIS 公式サイト -> Download -> Windows にリンクがある http://winnie.postgis.net/download/windows/pg95/buildbot/

(13)

OGR_FDWでCSV(2)サンプルデータ準備

何でもいいけど、WHOの結核に関するページから8個のCSVファイル ・http://www.who.int/tb/country/data/download/en/ ・PostgreSQLのサーバから読める位置に、適当なフォルダを作って置く あとはクエリで ・外部テーブルを置くスキーマを作る or 決める ・CREATE SERVER

(14)
(15)
(16)

クエリの要点、補⾜

フォルダ 常にこの仮想的スキーマ名を使う ・⾃動的に⾏番号の列fidが追加される ・ヘッダ⾏(列名)がない場合、列名はfield_1, field_2, , , ・UTF-8なら⽇本語もOK。SJISは⽂字化けするがASCII部分は読める

(17)

⽇本語(SJIS)を含むCSVをインポートしてみると

⽇本語は⽂字化けするが、数値フィールドは使える

(18)

OGRって何なのか

OpenGIS Simple Features Reference Implementation の略

単体で存在するのでなく、Geospatial Data Abstraction Library (GDAL) やたら種類が多いGISデータの相互変換のため、CSVもその⼀つ

(19)

CSVと同様、GISデータ(Shape File)も

⼀括インポートできる

Shape File : GISデータのうち「ベクタ」形式の代表的なもの。 多くのデータがこれで配布されている

例 : 地球地図プロジェクト(⽇本のページ)

(20)
(21)

⼀つのZIPに15種類のShape File、約60ファイル

(22)

本題(2)PostGIS

     + PL/v8

     + ウィンドウ関数⾃作

     + SVGでの可視化

説明の前にデモ : ・⽇本地図の上で、都道府県間の⼈⼝移動を動的に表⽰するSVG ・地図 : 先ほどOGR_FDWでインポートしたうち、⾏政界 ・利⽤した統計 : 総務省統計局 e-stat の WebAPI         (住⺠基本台帳⼈⼝移動報告)

(23)

デモでやっていたこと

⼤枠 : ・データ抽出〜SVG出⼒まで、⼀連の処理をストアド(PL/pgSQL)  にまとめて実⾏。 ・返った結果をCOPY⽂でそのままテキストファイルに保存。 → 単独で使えるSVGになる ストアド内の処理 1. 都道府県間の⼈⼝移動データを準備(必要な部分を抽出) 2. これを、PostGISで事前に作った都道府県間のパスと結合 3. SVGの属性(⼈⼝移動の円の⼤きさ、動作タイミング等)を設定 4. 座標系を設定してSVGとして地図化

(24)

ポスグレならではの部分

(1)WebAPI で得た JSON データの処理

統計表の⽇本語(⾮アスキー)がユニコードエスケープ形式だったけど、 JSONBにキャストしたら⾃動的にデコードしてくれた 統計表がオブジェクトと配列の複雑な構造になっている。キーを中⼼に ざっと⾒るストアドを PL/v8 で作り、⾒通しが良くなった JSONの構造が分かり、どのデータを使うか決めれば、PostgreSQLの JSON関数で普通のテーブルにするのは簡単

(25)
(26)

PL/v8ストアドの実⾏結果例

正常に終了しました。

(27)

総務省統計局のWebAPIデータの例

(28)

ポスグレならではの部分 (2)ウィンドウ関数でSVGの

アニメーション設定

SVGでは、各アニメーションにIDを付け、タグに begin = "前のアニメー ションID.end" を⼊れれば、「順番に動く動作」を実現できる 都道府県間の直線 円の半径 今回、アニメーション⼀つ⼀つ = 都道府県間の直線上の動き。 各直線に適当なIDを振り、ウィンドウ関数のlag()で⼀⾏前のIDを取った

(29)

PostGIS + PL/v8の連携について(1)

基本的には、PL/v8が扱える型はJavaScriptと同じ。当然ながら PostGIS のネイティブデータは扱えない。

しかしPL/v8のストアド関数を作る際、引数の型にはgeometryを使える。 実際にgeometryを渡すと、PL/v8の側では⽂字列として扱われる。

(30)

PostGIS + PL/v8の連携について(2)

この⽂字列は、PostGISデータ(バイナリ)の16進数表現。クエリ中で、 この⽂字列をPostGISのデータ型にキャストすると、ちゃんと復元される。

ということは、PL/v8のストアド内部で上のようにキャストを付け加え、 それをPostgreSQLへのクエリに使えばよい。例えば…

(31)

PostGIS + PL/v8の連携について(3)

(32)

PostGISデータを「そのまま使える」SVGにするため、

PL/v8のウィンドウ関数を作成(1)

PostGISのST_AsSVG関数は、⼀つのジオメトリから「SVGのPATH要素に ⼊れる座標群」を作成するだけ。そのままではSVGにならない ⼀つのジオメトリ対象でなく、集約関数のように「列をまるごと渡して」 そのまま使えるSVGにしたい。例えば ↓ のテーブルに対し

(33)

ウィンドウ関数作成(2)集約関数にしなかった理由

最初はSQL や PL/pgSQLで、集約関数として作ってみたが遅い。 ⽇本の全市区町村図(約3000ジオメトリ)で11.5秒。 引数の追加が柔軟にできない。 状態遷移関数(sfunc)-最終計算関数(finalfunc)-集約関数の三つと、 複数の値を遷移させるための複合型を修正しなければいけない。 ⼀⽅、ウィンドウ関数で作る際の注意点 通常は「全ての⾏を返す」のがウィンドウ関数。でも今回は ・先頭⾏の処理で全⾏のデータをスキャンしてSVGを作り、 ・⼆⾏⽬以降は何も返さない。 という動作にし、 ・実際使う時はクエリの最後に LIMIT 1 を付けることにした。

(34)

実際の使⽤例

さらに「塗り分け」機能を追加して便利に

この値で自動的に色の濃度を付ける 色はここで自由に設定

(35)

最後に & 今後やりたいこと

空間データベースは地図ありきでなく「データと⼈を、より近づけ る」。 オープンソースの空間DB全体が、もっと普及してほしい。 というわけでMySQLの今後に期待してます :) 今後、⾃分としては… PL/v8⾃体でPostGISデータの処理、とくにラスタ(ビットマップ) SVGで、地図だけでなくグラフ(チャート)もPostgreSQLから出⼒ 試⾏錯誤がつきもののデータ分析に合う、統合的な環境の模索 とか出来たらいいなぁ ! 今後ともよろしくお願いします m(_)m

参照

関連したドキュメント

人は何者なので︑これをみ心にとめられるのですか︒

本表に例示のない適用用途に建設汚泥処理土を使用する場合は、本表に例示された適用用途の中で類似するものを準用する。

看板,商品などのはみだしも歩行速度に影響をあたえて

このエアコンは冷房運転時のドレン(除湿)水を内部で蒸発さ

 このようなパヤタスゴミ処分場の歴史について説明を受けた後,パヤタスに 住む人の家庭を訪問した。そこでは 3 畳あるかないかほどの部屋に

あれば、その逸脱に対しては N400 が惹起され、 ELAN や P600 は惹起しないと 考えられる。もし、シカの認可処理に統語的処理と意味的処理の両方が関わっ

町の中心にある「田中 さん家」は、自分の家 のように、料理をした り、畑を作ったり、時 にはのんびり寝てみた

自分ではおかしいと思って も、「自分の体は汚れてい るのではないか」「ひどい ことを周りの人にしたので