Newer
Older
geoconv / gsi-geoconv.rb
@HIROSE Yuuji HIROSE Yuuji on 9 Feb 1 KB Dual trial of Yahoo!Japan and GSI
#!/usr/bin/env ruby
require 'csv'
require 'json'
require 'open-uri'
require 'cgi'
require 'pstore'

# [yuzaaed.csv]
# 施設名,設置場所,屋内外,住所,24h,,地図

baseurl = 'https://msearch.gsi.go.jp/address-search/AddressSearch?q='
cache = PStore.new("geoconv.pstore")

aed = CSV.read(ARGV[0], headers:true)

puts (aed.headers+["lon", "lat"]).to_csv.sub("施設名", "name")
       .sub("設置場所", "description")

cache.transaction do
  cache["geodata"] ||= Hash.new
  geo = cache["geodata"]
  aed.each do |row|
    addr = row["住所"]
    if geo[addr]
      coord = geo[addr]
    else
      !geo[addr]
      request = baseurl+CGI.escape(addr)
      json = URI.open(request){|u| u.read}
      begin
        # こんなふう
        # [{"geometry":{"coordinates":[139.917679,38.992184],"type":"Point"},"type":"Feature","properties":{"addressCode":"","title":"山形県遊佐町豊岡"}}]
        answer = JSON.parse(json)[0]	# 配列で来るようだ
      rescue
        STDERR.puts "#{addr}は変換不能"
        next
      end
      coord = answer["geometry"]["coordinates"]
      geo[addr] = coord
      sleep 0.5			# 控えめに
    end
    # lon, lat = *coord
    print (row.to_h.values+coord).to_csv
    # break
  end
end