Skip to content

Instantly share code, notes, and snippets.

@komasaru
Last active February 6, 2017 03:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save komasaru/dd33249738a3556f01cf to your computer and use it in GitHub Desktop.
Save komasaru/dd33249738a3556f01cf to your computer and use it in GitHub Desktop.
Ruby script to get road closing informations from JARTIC.
#! /usr/local/bin/ruby
# coding: utf-8
#---------------------------------------------------------------------------------
#= 道路交通情報取得
# : 日本道路交通情報センターサイトから規制一覧を取得する。
#
# Copyright(C) 2015 mk-mode.com All Rights Reserved.
#---------------------------------------------------------------------------------
#++
require 'json'
require 'open-uri'
require 'timeout'
class Jartic
CD = "32" # 道路コード
URL = "http://www.jartic.or.jp/_json/" # 接続先のベース URL
TO = 10 # OpenURI 接続時のタイムアウト
UA = "mk-mode Bot (by Ruby/#{RUBY_VERSION}, Administrator: postmaster@mk-mode.com)"
# OpenURI 接続時の User-Agent, Mail Address
def initialize
@url = "#{URL}M_#{CD}_301.json"
end
# 主処理
def exec
begin
get_json # JSON 取得
merge_same # 同一区間統合
display # 結果出力
rescue => e
$stderr.puts "[#{e.class}] #{e.message}"
e.backtrace.each{|trace| $stderr.puts "\t#{trace}"}
exit 1
end
end
private
# JSON 取得
def get_json
json = nil
timeout(TO) do
json = open(@url, "r:utf-8", {"User-Agent" => UA}) do |f|
f.read
end
end
j = JSON.parse(json)
# 以下の `uniq` は稀に同一内容の "item" が重複することがあるため
@upd_time, @items, @name = j["updtime"], j["item"].uniq, j["name"]
rescue => e
raise
end
# 同一区間統合
def merge_same
@items_m = Array.new # 統合後 item 用配列
merged = false # 統合フラグ
begin
# 統合前 item ループ処理
@items.each do |item|
# 統合後 item をループ処理しているのは、統合前 item の並び順に特徴があるため。
# (統合前 item を事前にソートするのもデータの特性上容易ではない)
# また、無用な処理を省くため最終要素からループ
(@items_m.size - 1).downto(0) do |i|
# 路線名称(0)・号線(9)、規制区間(3,4)、原因(5)、規制内容(6)の同じ item があれば統合。
if @items_m[i][0] == item[0] && @items_m[i][9] == item[9]
@items_m[i][3,2].sort == item[3,2].sort &&
@items_m[i][5] == item[5] && @items_m[i][6] == item[6]
@items_m[i][2] << "・#{item[2]}"
merged = true
break
end
end
merged ? merged = false : @items_m << item
end
rescue => e
raise
end
end
# 結果出力
def display
# タイトル
puts "#### 道路規制一覧(#{@name}) [ #{@upd_time} 現在 ] ####"
begin
# ヘッダ
if @items_m == []
str = "[規制情報はありません]"
else
str = "[路線名称]" + "-" * 30 + " [方向]" + "-" * 4
str << " [規制区間]" + "-" * 54 + " [原因]" + "-" * 6
str << " [規制内容]" + "-" * 2
end
puts str
# 明細
@items_m.each do |item|
str = padding_sp("#{item[0]} #{item[9]}", 20)
str << " #{padding_sp(item[2], 5)}"
if item[3] == ""
str << " #{padding_sp(item[4], 15)}"
str << " " * 34
else
str << " #{padding_sp(item[3], 15)}"
str << (item[2] =~ /・/ ? "<->" : "-->")
str << " #{padding_sp(item[4], 15)}"
end
str << " #{padding_sp(item[5], 6)}"
str << " #{padding_sp(item[6], 6)}"
puts str
end
rescue => e
raise
end
end
# スペースパディング(全角)
def padding_sp(str, len_max)
len = str.split(//).size
return len_max < len ? str[0,len_max] : str[0,len] + " " * (len_max - len)
rescue => e
raise
end
end
Jartic.new.exec
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment