georuby で shpの読み書き方法(2.5.2)
rbenv で3.1をインストールしたら、またgeorubyが必要になった。geo_rubyとgeorubyのよくわからない話。
とりあえず、動かせるようになった。
分かったこと。
①gem georuby は、読み書き共にできるらしい。
②georuby2.5.1⇒2.5.2でshpの出力方法が変化している。
my.diffend.io
③それは、gem dbf の変更によるもののよう。
georuby2.5.2 では、dbf4.2.2
④Dbf::Field は廃止され、DBF::Columnが使われる。
なので、ソースの改修が必要。
以下に、サンプルコードを紹介する。
サンプルコードは、下記に紹介されているが、これは、2.5.1用である。
https://github.com/nofxx/georuby/blob/master/README.md
**生成 shpfile = GeoRuby::Shp4r::ShpFile.create('hello.shp', ShpType::POINT, [DBF::Field.new("Hoyoyo", "C", 10), DBF::Field.new("Boyoul","N",10,0)]) **出力 shpfile = GeoRuby::Shp4r::ShpFile.open('places.shp') shpfile.transaction do |tr| tr.add(ShpRecord.new(Point.from_x_y(123.4, 123.4), 'Hoyoyo' => "AEZ",'Bouyoul' => 45)) tr.update(4, ShpRecord.new(Point.from_x_y(-16.67, 16.41), 'Hoyoyo' => "EatMe",'Bouyoul' => 42)) tr.delete(1) end shpfile.close **ソースコード中のサンプルコート(テスト用コード) shpfile = GeoRuby::Shp4r::ShpFile.create( File.dirname(__FILE__) + '/../../data/point3.shp', GeoRuby::Shp4r::ShpType::POINT, [DBF::Column::Base.new('test', 'Hoyoyo', 'C', 10, 0)]) shpfile.transaction do |tr| tr.add(GeoRuby::Shp4r::ShpRecord.new( GeoRuby::SimpleFeatures::Point.from_x_y(123, 123.4), 'Hoyoyo' => 'HJHJJ')) end
ここで大きく変わるのが、下のとおりである。
# [DBF::Field.new("Hoyoyo", "C", 10)] #for 2.5.1
# [DBF::Column::Base.new('test', 'Hoyoyo', 'C', 10, 0)] #for 2.5.2 Baseは無い
# [DBF::Column.new('test', 'Hoyoyo', 'C', 10, 0)]) #これで動くか?
と思ったら、DBF::Columnの中でエラーが出る。
上の'test'は、テーブル名であるが、そのバージョンでエラーだ。
.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems//dbf-4.2.2/lib/dbf/column.rb
def initialize(table, name, type, length, decimal) @table = table @name = clean(name) @type = type @length = length @decimal = decimal @version = table.version #ここでエラー @encoding = table.encoding validate_length validate_name end
なので、よくわからないが、
@version=1.0 と書き換えたら動くようになった。
**動かせるサンプルコード require 'georuby' require 'geo_ruby/shp' include GeoRuby::Shp4r include GeoRuby::SimpleFeatures shpfile = GeoRuby::Shp4r::ShpFile.create('hello.shp', # ShpType::POINT, #for 2.5.1 # [DBF::Field.new("Hoyoyo", "C", 10), #for 2.5.1 DBF::Field.new("Boyoul","N",10,0)]) GeoRuby::Shp4r::ShpType::POINT, # [DBF::Column::Base.new('test', 'Hoyoyo', 'C', 10, 0)]) #Baseは無い [DBF::Column.new('test', 'Hoyoyo', 'C', 10, 0)]) shpfile.close shpfile = GeoRuby::Shp4r::ShpFile.open('hello.shp') shpfile.transaction do |tr| tr.add(GeoRuby::Shp4r::ShpRecord.new(GeoRuby::SimpleFeatures::Point.from_x_y (123.4, 123.4), 'Hoyoyo' => "AEZ")) # tr.update(4, ShpRecord.new(Point.from_x_y(-16.67, 16.41), 'Hoyoyo' => "EatMe",'Bouyoul' => 42)) # tr.delete(1) end shpfile.close