世界の測量

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

ベクトルタイル・いちさと(小学校区)Pt. 1 Shapefile を用意するまで

より範囲を限定して、ベクトルタイルの実験をポリゴン方向に進めることにした。対象とするデータは国土数値情報(小学校区データ)である。今回は、作業順序の順番で情報共有する。

範囲の設定

茨城・千葉・埼玉・東京(いちさと)の合成地域から矩形区域を切り出すことにした。南西端を(35.66811,139.233398)、北東端を(36.153059,140.914307)に定めた。

国土数値情報(小学校区データ)のダウンロード

茨城・千葉・埼玉・東京の国土数値情報(小学校区データ)をダウンロードする。以下、 ~/Downloads の下に展開されている*1ものとする。

データ変換

データの下調べ

属性の文字コード変換を主目的とするデータ変換を行う。4都県のファイルを一つにすることも目的とする。
まずQGISを使って各フィールドの長さを調べたところ、 下のとおり、最大で49*2であったので、UTF-8化によるバイト数の増大に対応して、フィールド長さを2倍に増やすこととした。
f:id:hfu:20140104045929p:plain

変換プログラム

次の変換プログラムにより、データを変換した。

# -*- coding: utf-8 -*-
# convert.rb CC0
require 'rubygems'
require 'geo_ruby'
require 'geo_ruby/shp'

include GeoRuby::Shp4r
dst = ShpFile.create('school_district.shp', ShpType::POLYGON,
  [Dbf::Field.new('id', 'N', 10, 0),
   Dbf::Field.new('A27_005', 'C', 10), 
   Dbf::Field.new('A27_006', 'C', 56),
   Dbf::Field.new('A27_007', 'C', 48),
   Dbf::Field.new('A27_008', 'C', 98)])
tr = dst.transaction
count = 0
%w{08 11 12 13}.each do |pref|
  src_path = "/Users/hfu/Downloads/" + 
    "A27-10_#{pref}_GML/A27-10_#{pref}-g_SchoolDistrict.shp"
  ShpFile.open(src_path) do |src|
    src.each do |r|
      r.data.attributes['id'] = count
      tr.add(r)
      if count % 100 == 0
        tr.commit
        tr = dst.transaction
      end
      count += 1
    end
  end
end
tr.commit
dst.close

これにより作成したデータの属性テーブルを確認すると、次の通り。UTF-8文字コードで開いて、特段文字化けが見られないことを確認。
f:id:hfu:20140104053250p:plain

prj及びqixファイルの作成

  • QGIS メニューで「ベクタ」→「データマネジメントツール」→「現在の投影法を定義する」からWGS84を定義。school_district.prj ファイルを手に入れる。

f:id:hfu:20140104053641p:plain

  • QGIS メニューで「ベクタ」→「データマネジメントツール」→「空間インデックスを作成する」から空間インデックスを作成。school_district.qix ファイルを手に入れる。

f:id:hfu:20140104053818p:plain
これで Shapefile の準備は完了。

*1:OS X Safariの挙動。

*2:千葉県データについて。東京都データも同様に49であったので、おそらく他の都道府県データについてもそうである。