先月書いたとおり、1127日のPostgreSQLカンファレンス2015で発表してきました。当日持参した資料が足りなくてすみませんm(_)m スライドのPDFと、PostGIS・MySQLで使ったテーブルのダンプファイルを下記に置きました。参加者、関係者の皆様ありがとうございました。



MySQLでのテーブルcentroidsと、PostGISでのfringesは、名前は違いますが実質だいたい同じで、kNN検索のサンプル用の点データを都道府県境界から約63万個とったものです。MySQLで最初テーブル名を間違えていて、直すのを忘れました。

ダンプ時のコマンドを、参考まで(というか後で自分が調べる時用に)メモしておきます。とくにpg_dumpでテーブルを複数指定する際、1テーブルごとに-tを付けるのをよく忘れる。。。
:: MySQL
cd D:\AppsPortable\MySQL\mysql-5.7.9-winx64
bin\mysqldump -u root -p test_gis borders_geom centroids > 20151127_dump_mysql.sql

:: PostgreSQL
cd D:\AppsPortable\pgsql_9.5.0_beta2_x64\bin
pg_dump -f 20151127_dump_postgis.sql -t borders_geom -t fringes -U postgres test_gis


テーブルのダンプがなくとも、当日発表したように
MAPZEN - Bordersから日本のGeoJSONをダウンロードしスライドと同様の手順を行えば、同じテーブルが出来ると思います。ファイルパスとかユーザ権限は環境に合わせて適宜設定して下さい。

最後に紹介したPL/Rのストアドが、複数のスライドに分かれてしまったので下にまとめました。
create or replace function myfunc.poi_dens
   (wkt text,
    num int,
    svg text,
    jname text)

    # 数値, 文字など一般的なデータ型は、そのまま引数で渡せる
    # 引数名も付けられる

    # wkt : PostGISデータを ST_AsText() で文字にして渡す
    # num : 今回ポリゴン内にランダムに点を打つ。その数
    # svg : 結果を SVG で出力する。そのパス
    # jname : SVG の中に書き込む、処理対象のラベル

returns void language plr immutable as $R$

library(rgeos)
library(sp)
library(spatstat) # インストールしたパッケージを読み込む

g1 = readWKT(wkt) # PostGISデータ → Rの地理データクラス
bb = g1@bbox

p1 = spsample(g1, n=num, type='random') # ランダムな点
xy = p1@coords

pp = ppp(xy[,1], xy[,2], bb[1,], bb[2,], c('unit', 'unit'))
dense = density(pp)

# ppp … spatstatパッケージで分析する際の一つの基本クラス
# point pattern dataset in the two-dimensional plane
# density() … カーネル密度推定の関数

colors = colorRampPalette(c('white', 'orange')); # 色は適当
svg(file=svg)
plot(dense, main='', xlim=bb[1,], ylim=bb[2,], col=colors)
contour(add=T, dense, lty=2)
plot(add=T, g1, lwd=2)
points(p1, pch=21, bg='red')
mtext(cex=2, side=3, family='Japan1', text=jname)
graphics.off()

$R$;

上記ストアドの出力SVGサンプル2つ(スライドと同じもの)を、そのまま下記に貼っておきます。こういう時、PDFと違ってSVGは便利。ただ、今回のようにRのデフォルトのSVG出力関数を使うと、文字情報が消えます(ベクタ化される)。重複する線が太く見えるのはPDFと同様で、今回はそのまま。