世界の測量

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

数値地図(国土基本情報)の Shapefile データの接合&文字コード変換 第二版

http://www.gsi.go.jp/common/000075505.pdf に書かれたすべてのデータについて、また、日本語属性名は適当にアルファベットを使った属性名に直すように、プログラムを改めた。また、文字列属性のフィールドの長さはすべて255に直すようにした。(GeoToolsの流儀)

# -*- coding: utf-8 -*-
#Rakefile cc0
$KCODE = 'U'
require 'find'
require 'rubygems'
require 'geo_ruby'
require 'iconv'
include GeoRuby::Shp4r

def romanize_field_name(field_name)
  # キャメルケースは嫌いだけど合わせる
  case field_name
  when '地理識別子'
    'gi'
  when '登録日'
    'lfSpanFr'
  when '削除日'
    'lfSpanTo'
  when '確認日'
    'confDate'
  when '情報レベル'
    'orgGILvl'
  when '種別'
    'ftCode'
  when '行政コード'
    'admCode'
  when '県等名称'
    'pref'
  when '市等名称'
    'city'
  when '県等よみ'
    'prefYomi'
  when '市等よみ'
    'cityYomi'
  when '名称'
    'name'
  when '名称よみ'
    'nameYomi'
  when '名称ローマ'
    'nameR'
  when '別称'
    'altName'
  when '別称よみ'
    'altNYomi'
  when '別称ローマ'
    'altNR'
  when '飛地フラグ'
    'isExcl'
  when '外字フラグ'
    'isGaiji'
  when '地点名'
    'name'
  when '点コード'
    'ptCode'
  when 'DRMコード'
    'drmCode'
  else
    field_name
  end
end

task :default do
  c = Iconv.new('UTF-8', 'CP932')
  %w{NRPt NNFPt PFPt CSPt AdmArea AdmBdry AdmPt Anno BldA BldL BldSbl Cntr Cstline ElevPt GCP Isbt LUSbl Monument Park PwrPlnt PwrTrnsmL RailCL RailTrCL RdCL RdCompt RdEdg RdMgtBdry RTwr RvrCL SBArea SBBdry SBAPt SpcfArea StrctArea StrctLine StrctSbl TpgphArea TpgphLine TpgphSbl TrfSbl TrfStrct TrfTnnlEnt VegeClassL VegeClassP VLine WA WAltiWDpth WfArea WL WoodRes WRltLine WStrL}.each {|theme|
    print "converting #{theme}..."
    dst_path = "dst/#{theme}.shp"
    sh "rm dst/#{theme}.*" if File.exist?(dst_path)
    dst = nil
    Dir.glob('../??????') {|dir|
      Find.find(dir) {|src_path|
        next unless /#{theme}/.match src_path
        next unless /shp$/.match src_path
        ShpFile.open(src_path) {|src|
          unless dst
            dst_fields = []
            src.fields.each {|field|
              field_name = romanize_field_name(c.iconv(field.name))
              print "\t#{c.iconv(field.name)} -> #{field_name}\n"
              field = Dbf::Field.new(field_name, field.type, 
                                     (field.type == 'C') ? 255 : field.length,
                                     field.decimal)
              dst_fields << field
            }
            dst = ShpFile.create(dst_path, src.shp_type, dst_fields)
          end
          dst.transaction {|tr|
            src.each {|r|
              d = {}
              r.data.each {|k, v|
                d[romanize_field_name(c.iconv(k))] = 
                  (v.class == String) ? c.iconv(v) : v
              }
              tr.add(ShpRecord.new(r.geometry, d))
            }
          }
        }
      }
    }
    if !dst.nil?
      dst.close
      print "complete.\n"
    else
      print "not found.\n"
    end
  }                        
end