JTS (JTS Topology Suite) を使って Ruby から幾何属性のきめ細かなコントロールを実現する。

JTS Topology Suite を使って、Ruby から幾何属性のきめ細かなコントロールを実現します。今回は、Ruby から JTS を触れるようにするところまで。入門者向け解説です。

JTS Topology Suite とは何か

JTS Topology Suite (JTS) とは、幾何属性を取り扱うための Java ライブラリです。実は、オープンソースソフトウェアのジオメトリエンジン*1のほとんどは、JTS か、その C/C++ 実装である GEOS ですので、JTS を抑えることで、オープンソースジオメトリエンジンでできることの最先端に触れることができます。

JTS の本拠地は、Google でトップで出てくるページではなくて、http://tsusiatsoftware.net/jts/main.html となっています。Google でトップで出てくるページには、最新版が置いてありません。

JTS のライブラリのマニュアルは、http://tsusiatsoftware.net/jts/javadoc/index.html です。

JTS をダウンロードして、Ruby で使えるように準備する

http://sourceforge.net/projects/jts-topo-suite/ から、プログラムが入った Zip ファイルをダウンロードします。執筆時点では、jts-1.11.zip をダウンロードしました。

この ZIP ファイルを展開して、lib/jts-1.11.jar を、作業用フォルダにコピーしてください*2。これで、準備は完了です。これから、この作業フォルダで ruby プログラムを作ってみます。

JTS 動作確認プログラム

作業フォルダに、次のプログラムを作成します。

#enter_the_jts.rb
require 'rubygems' # rubygems を使う
require 'rjb'      # arton さんの Ruby Java Bridge を使う

# jts-1.11.jar を使用する設定で Java を起動する
Rjb::load('jts-1.11.jar')

# JTS のクラス WKTReader のインスタンス作って wktr に代入する
# 参考: 
# http://tsusiatsoftware.net/jts/javadoc/com/vividsolutions/jts/io/WKTReader.html
wktr = Rjb::import('com.vividsolutions.jts.io.WKTReader').new

# WKT で記述した幾何属性を WKTReader で読むことで、
# JTS の Point クラスのインスタンスを生成する
point = wktr.read('POINT (135 35)')

# Point の buffer メソッドを使って、1度のバッファを生成したものを
# toString メソッドで WKT 文字列に変換して、Ruby の print メソッドで出力
# 参考: 
# http://tsusiatsoftware.net/jts/javadoc/com/vividsolutions/jts/geom/Point.html
# 参考: 
# http://tsusiatsoftware.net/jts/javadoc/com/vividsolutions/jts/geom/Geometry.html
# Geometry は Point のスーパークラスなので、Geometry で定義されている
# メソッドは、すべて Point でも使えます。
print point.buffer(1).toString

これを実行して、次のように表示されれば、導入成功です。

$ ruby enter_the_jts.rb 
POLYGON ((136 35, 135.98078528040324 34.80490967798387, 135.92387953251128 34.61731656763491, 135.83146961230256 34.4444297669804, 135.70710678118655 34.292893218813454, 135.5555702330196 34.16853038769745, 135.3826834323651 34.076120467488714, 135.19509032201614 34.01921471959677, 135 34, 134.80490967798386 34.01921471959677, 134.6173165676349 34.076120467488714, 134.4444297669804 34.16853038769745, 134.29289321881345 34.292893218813454, 134.16853038769744 34.4444297669804, 134.07612046748872 34.61731656763491, 134.01921471959676 34.80490967798387, 134 35, 134.01921471959676 35.19509032201613, 134.07612046748872 35.38268343236509, 134.16853038769744 35.5555702330196, 134.29289321881345 35.707106781186546, 134.4444297669804 35.83146961230255, 134.6173165676349 35.923879532511286, 134.8049096779839 35.98078528040323, 135 36, 135.19509032201614 35.98078528040323, 135.3826834323651 35.923879532511286, 135.5555702330196 35.83146961230254, 135.70710678118655 35.707106781186546, 135.83146961230256 35.5555702330196, 135.92387953251128 35.382683432365084, 135.98078528040324 35.19509032201612, 136 35))

トラブルシュート

上記の流れを試したときにエラーが発生する場合、次のような原因が考えられるかもしれません。

次回以降

次回以降、JTS ならではの処理について説明していきたいと思っています。

*1:ここでの「ジオメトリエンジン」は、ジオ的な意味で。コンピュータグラフィックスの用語のジオメトリエンジンは、別な意味となるようです。

*2:libに入っている他の jar ファイルは、XML ファイルを JTS から使ったりするために必要なものらしいのですが、私の手法では XML 処理は Ruby にやらせるので、これらのファイルは不要です。