世界の測量

Sibling of "Relevant, Timely, and Accurate, " but much lighter and shorter ※自らの所属する組織の見解を示すものでない

【開始】georuby-ext を通じた RGeo ベースのジオメトリ処理

最近久しぶりにジオメトリ処理の引き合いを頂きまして、定例なのですが今 Ruby でジオメトリ処理をするための方法の確認を開始しました。

使用するライブラリ

Shapefile等データの取り扱いには、これまでよくGeoRubyを使っていましたので、GeoRubyと連結の良い、georuby-extを使うことにしました。GeoRubyはこれまで通り、非互換な拡張が続いているようであり、また日本語ファイル名を処理している場合に特異かもしれませんが、古めのRubyでは上手く動かない場合があるようです。ここでは新しめのRuby(2.1以降)で、次のようにして GeoRuby 及び georuby-ext を導入することを前提としています。

$ gem install georuby-ext

GeoRubyにはいくつか分派があるようなのですが、あえていきなり georuby-ext を指示して導入することにより、それが依存する GeoRuby を導入することになります。そのようにするのが確実だと思います。
georuby-ext は、手元のOS Xだと問題なく導入できています。内部でGEOSを呼んだりするので、依存ライブラリの問題でWindows等ではそれなりに苦労するかもしれません。

RGeo

GEOSが行うようなジオメトリ処理は、RGeoが実施します。
https://github.com/rgeo/rgeo/blob/master/Spatial_Programming_With_RGeo.md

RGeoでジオメトリ処理を開始

基本的に、上にリンクを掲げたドキュメントのとおりですが、基本的な流れは次のとおりです。

$ irb
irb(main):001:0> require 'georuby-ext'
=> true
irb(main):002:0> factory = RGeo::Geographic::simple_mercator_factory
=> #<RGeo::Geographic::Factory:0x007fc9729a2138 (中略)
irb(main):003:0> g = factory.point(135, 35)
=> #<RGeo::Geographic::ProjectedPointImpl:0x3fe4b94b4d48 "POINT (135.0 35.0)">
irb(main):004:0> g.buffer(1)
=> #<RGeo::Geographic::ProjectedPolygonImpl:0x3fe4b94ac170 "POLYGON ((135.00000898315284 35.000000000000014, 135.0 34.99999264143168, 134.99999101684716 35.000000000000014, 135.0 35.00000735856771, 135.00000898315284 35.000000000000014))">
irb(main):005:0> g.lon
=> 135.0