d3.js
geojson
データビジュアリゼーション
topojson

国土交通省のシェイプ形式データから全都道府県市町村郡区のGeoJsonとTopoJsonを作成。

More than 3 years have passed since last update.

日本全国シェイプ形式データ入手

国土交通省のサイトから全国のデータをダウンロード。
http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N03.html
シェイプ形式のデータを使います。

% brew install gdal
% which ogr2ogr
/usr/local/bin/ogr2ogr
% ogr2ogr -f GeoJSON places.json N03-14_140401.shp

日本全国GeoJson解体

places.jsonはサイズがかなり大きいので県、市、町、村、郡、区単位に分割。

ruby split_geojson.rb
split_geojson.rb
require 'json'
require 'fileutils'

class GeoJsonToCity

  def initialize()
   @datas = {}
   Dir.glob('places.json').each do |path|
      io = File.open(path)
      str = io.read(nil, '')
      json = JSON.parse(str)
      features = json['features']
      features.each do |feature|
        # 名称抽出
        city = self.checkCity(feature['properties'])
        # 都道府県
        self.setData(city[0], feature)
        # 市町村1
        self.setData(city[1], feature)
        # 市町村2
        if !city[2].nil?
          word = city[1] + city[2]
          self.setData(word, feature)
        end
      end
    end
  end

  def setData(key, feature)
    if !key.nil?
      if !@datas.has_key?(key) then
        @datas[key] = []
      end
      @datas[key].push(feature)
    end
  end

  def checkCity(prop)
    cityList = []
    pref  = prop['N03_001']
    city1 = prop['N03_002']
    city2 = prop['N03_003']
    city3 = prop['N03_004']
    cityList.push(pref)
    if !city1.nil? && pref != '北海道'
      cityList.push(city1)
    end
    if !city2.nil?
      cityList.push(city2)
    end
    if !city3.nil?
      cityList.push(city3)
    end
    return cityList
  end

  def make
    @datas.each do |city, collection|
      data = {"type": "FeatureCollection", "features": []}
      data["features"] = collection
      addr = self.checkCity(collection[0]['properties'])
      pref = addr[0]
      FileUtils.mkdir_p('geojson/' + pref)
      File.open('geojson/' + pref + '/' + city + '.json', 'w').write(JSON.generate(data))
    end
  end
end

city = GeoJsonToCity.new
city.make()

日本全国TopoJson作成

GeoJsonよりサイズの小さいTopoJsonを作成します。
TopoJsonはd3.jsとかで使えます。

% npm install -g topojson 
% topojson --version
1.6.19

富山県のGeoJsonをTopoJsonへ変換。

id属性に氷見市、朝日町、富山市…を付与。

% topojson --id-property N03_004 -p NAME=name -p name -o toyama.topojson geojson/富山県/富山県.json

全国分をシェルで一括作成しました。

geojson_to_topojson.sh
#!/bin/bash

find ./geojson -type f | while read file
do
    arr=( `echo $file | tr -s '/' ' '`)
    pref=${arr[2]}
    # ディレクトリ
    dir="topojson/"$pref
    if [ ! -d $dir ]; then
      mkdir -p $dir
    fi
    basename=$(basename $file)
    name=( `echo $basename | sed -e "s/\.json/.topojson/"`)
    #echo $name
    topojson --id-property N03_004 -p NAME=name -p name -o $dir"/"$name geojson/$pref/$basename
done

Githubに全国の都道府県、市町村、郡、区単位のGeoJson,TopoJsonを設置しました。
https://github.com/niiyz/JapanCityGeoJson