Geo::FeatureList に手を加えました。

hfu2007-11-06

Geo::FeatureList まわりを中心に、geotools.rb に細々とした変更を加えました。

Geo::FeatureList.foreach

geotools.rb の Geo::FeatureList に、File と同じような、クラスメソッド foreach を追加しました。
http://svgmapdata.sakura.ne.jp/geotools/
これで、以下のような Shapefile チェック用のワンライナーも現実的になったかもしれません。

Geo::FeatureList.foreach('input.shp') {|feat| p feat}

Geo::FeatureList は、インデクス付きの Shapefile を作成するようにしました

Geo::FeatureList が作成するデータは、すべてインデクスファイル .qix 及び .fix を持つようにしました。
これは、Geo::FeatureList の内部で使う GeoTools のクラスを、ShapefileDataStore から IndexedShapefileDataStore に変更することで実現しています。

Geo::FeatureList の options に cql を追加しました。

foreach, each, new の第二引数 options に、{:cql => 'temperature < 20'} というような CQL 文を書けるようにしました。CQL は GeoTools の 2.4 以降で使用可能です。
CQL は OGC が決めているクエリ言語らしく、http://docs.codehaus.org/display/GEOTDOC/01+CQL+Examples に簡単な入門用文章があります。

Geo::FeatureList 既知の課題

現在の API だと、メソッド each のブロックの中でファイルを読んだり修正したりしたあと、write で新しい地物を書き出そうとすると、これまでの Shapefile の内容を消去して新しい内容を書き出してしまう問題が発生します。
自分の作業では既存のファイルを上書きする作業が多く、この際の手間を少なくしたいので、現在のインタフェースを保持したいと思っています。この問題はゆっくり時間を掛けて考えたいと思っています。

geotools.rb が、存在しない Java クラスによって落ちないようにしました

現在、GeoTools にはバージョン 2.3, 2.4, 2.5 があり、それぞれ異なった安定性と機能数を持ちます。そこで私は、GeoTools の各バージョンの jar ファイルの入ったディレクトリを用意し、それを切り替えることで、GeoTools のいろいろなバージョンを使うようにしていました*1
しかし、Geo::Tools::QUALIFIED_NAMES に新バージョンでしか存在しないクラスを記述することになり、旧バージョンで動作しないようになっていました。そこで、Geo::Tools のスタティックイニシャライザ(?)の中にある include_class の周りで NameError 例外をキャッチしてそれを警告だけするようにし、存在しないクラスを読み込む時点では実行が終了しないようにしました。Ruby なので、その存在しないクラスを利用しようとした時点で落ちることになります。問題のクラスを使わない処理であれば、旧バージョンを使うことができるようになりました。

*1:通常は 2.4 を使っています。