基盤地図情報GML(道路縁)をgeotools.rbでShapefileに変換

本日公開開始の基盤地図情報。道路縁のデータを geotools.rbShapefile に変換してみました。これで、Mac でも基盤地図情報を使えます。

基盤地図情報、今日からダウンロード可能に

基盤地図情報ダウンロードサービスが始まりました。Steve Jobs のプレゼンに盛り上がる Apple ファンのように、盛り上がってみましょう。早速、栃木県佐野市*1のデータをダウンロードしてみました*2。フォーマットは JPGIS と GML から選べますが、私は GML を選択しました。
ダウンロードサービスで配布しているビューアは Windows 専用です。私は MacBook を使っていますから、このビューアは無視して自分でコンバータを作ることにしました。

道路縁用コンバータ rdedg_gml2shp.rb

道路縁用コンバータは、ざくっと作れば次のようになります。

# Usage of the works is permitted provided that this insturment is retained
# with the works, so that any entity that uses the works is notified of this
# instrument.
# 
# DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY.

require 'rexml/document'
require 'rexml/streamlistener'
require 'geotools'

class Converter
  include REXML::StreamListener
  ATTR_NAMES = %w{fid orgGILvl orgMDId type name}

  def run(src_path)
    @w = Geo::FeatureList.open(src_path.sub(/xml$/, 'shp'),
                               {:charset => 'UTF-8'}) # When on Mac OS X
    @feat = {}
    REXML::Document.parse_stream(File.new(src_path), self)
    close
  end

  def close
    @w.close
    print "\nfinished.\n"
  end

  def create_line_string(posList)
    wkt = 'LINESTRING ('
    posList.split("\n").each do |s|
      coords = s.chomp.split(' ')
      next unless coords.size == 2
      wkt += "#{coords[1]} #{coords[0]}, "
    end
    wkt.chop!.chop!
    wkt += ')'
    @feat[:the_geom] = Geo::import_wkt_geometry(wkt)
  end

  def text(text)
    if ATTR_NAMES.include?(@name)
      @feat[@name.to_sym] = text.chomp
    end
    create_line_string(text) if @name == 'gml:posList'
    @name = nil
  end

  def tag_start(name, attrs)
    @name = name
  end

  def tag_end(name)
    if name == 'RdEdg'
      @w.write @feat
      print "."
    end
  end
end

if __FILE__ == $0
  Converter.new.
    run('FG-GML-09204-ALL-Z001/FG-GML-09204-RdEdg-20080331-0001.xml')
end

JRuby でも rexml/streamparser が使えるのですね。コンバータは、地物種類ごとに作る方が単純で良いかもしれませんし、基盤地図情報のどんな地物種類に対しても変換できるコンバータを作り上げることも簡単かもしれません。
いずれにしても、

Ruby で書けば、GML から Shapefile へのコンバータは、XMLスキーマよりも短い。

ということが言えそうです。

変換結果

変換結果は、例えば QGIS を使うなどして確認することができます。日本語属性もうまく入っていることが確認できました。ふーん、と言わせるようなデータ内容になっているなと思いました。しかし、ここに変換の結果を掲載することはできないようです。

それは、基盤地図情報が測量法第27条第2項に基づいた測量成果の提供を目的として提供されているためです。国土地理院のこのページによると、

ブログ(中略)は、不特定多数の者への公開に該当します。

GSI HOME PAGE - 国土地理院

であり、不特定多数の者への公開の場合には複製承認申請が必要のようです。複製承認申請をしていないので、残念ながらここに結果を載せることはできません。複製承認申請を、あとで書くかもしれません。

では

では、d:id:hfu:20080329電子国土 Google Gadget も問題あるのではないかと考えがちですが、電子国土 Google Gadget は電子国土 Web システムを使っているので、

電子国土Webシステムはどなたでも、無償で利用できます。また、HTMLとJavaScriptの知識があれば、どなたでも「電子国土」サイトを作れます。Webページはもちろん、イントラネットでも利用できます。

旧電子国土Webドメイン「cyberjapan.jp」の運用停止について

という記述の方が利いてきて、問題が発生しません。

いずれにしても

基盤地図情報については、データを加工した結果をブログに掲載するのには面倒があります。しかし、データを加工する自作ツールならばブログで公開できます。ある意味、モデルとコントロールの分離、と言えるのかもしれません。

なお、

もちろんこれは geotools.rb の宣伝です。

*1:ここ、dko?(d:id:hfu:20080216)を使うところです。

*2:現在の時点で、Internet Explorer 以外ではダウンロードに支障があるようですが、すぐに改善されることでしょう。