ruby-robotの夢

cygwin-ruby,qgisの達人を目指す奮闘記

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