再開したNOVAを地図上に表示するスクリプト
12/16時点で再開しているNOVA。
追記:随時追加しているので、こちらの新しいものを参照。
http://d.hatena.ne.jp/ikeyasuki/searchdiary?word=%2a%5bNOVA%5d
以下は、場所の特定が正常にできなかったので地図上に掲載していません。
ERR: 京都府木津川市相楽城西15 ERR: 千葉県木更津市東中央1-2-5 ERR: 茨城県水戸市宮町1-3-38 ERR: 沖縄県中頭郡西原町字嘉手苅130 ERR: 沖縄県那覇市おもろまち4-4-9 ERR: 神奈川県横浜市港北区日吉本町1-21-10 ERR: 東京都調布市小島町2-51-3 ERR: 東京都江東区門前仲町2-5-11 ERR: 山形県山形市城南町1-1-1 ERR: 千葉県千葉市中央区富士見2-1-1 ERR: 埼玉県草加市高砂2-7-1 ERR: 旭川市3条通7丁目 ERR: 札幌市中央区北1条西3丁目
スクリプト
ボタンポンで、gCommunicationのサイトからとってきてKMLを出力するようにしました。
汚くてすいません。特に、HTML抽出の正規表現が恥ずかしくて死ねます。
require 'hpricot' require 'open-uri' require 'kconv' require 'rexml/document' $KCODE = "UTF8" class Geocoding KEY = '' # ここは、自分のKEYを入れてください http://code.google.com/apis/maps/signup.html # "My web site URL"には、http://localhost/ を入れてください。 GEOCODING = 'maps.google.com' METHOD = "/maps/geo?output=xml&key=#{KEY}&q=" def self.get(adr) request_url = URI.encode(METHOD+ adr) Net::HTTP.start(GEOCODING) {|http| res = http.get(request_url, {"referer" => "http://localhost/"}) return res.body.toutf8 } end end def dputs(str) # terminal code is sjis STDERR.puts str.to_s.tosjis end NOVA_LIST = 'http://www.g-com.jp/1106nova/open/index.html' doc = Hpricot(open(NOVA_LIST).read) xmldoc = nil cnt = 1 (doc/:table/:tr).each {|elem| t = elem.containers.last next unless t adr = "" ary = t.to_plain_text.split("\n") ary.each {|r| r = r.toutf8 adr += r.chomp.gsub(/(.*$/, "").gsub(/^[ \t ]+/, " ") if r.include?('(') adr.sub!(' ', ' ') adr.gsub!(/^ /, "") adr.gsub!(/[ ]*$/, "") adr.gsub!(/[ ][^ ]+$/, "") adr.sub!(' ', '') break end } next if /img/ === adr next if /COPYRIGHT/ === adr next if /G.communication/ === adr next if /開校済み/ === adr next if /電話番号/ === adr res = Geocoding.get(adr) if xmldoc == nil xmldoc = REXML::Document.new res xmldoc.root.elements.delete(xmldoc.root.elements[1]) end x = REXML::Document.new res res_xml = REXML::XPath.first(x, "//Response") name = res_xml.elements["name"] begin res_xml.elements["Placemark"].elements << name ary = REXML::XPath.match(res_xml, "//Placemark") raise "cannot geocode" if ary.size == 0 ary[0].elements << name if ary.size > 1 then ary[1..ary.size-1].each{|a| res_xml.elements.delete a } end xmldoc.root.elements << res_xml cnt += 1 rescue dputs "ERR: " + URI.decode(name.text) next end #break if cnt > 5 } puts xmldoc.to_s
われながら汚すぎるソースです。気が向いたら直します・・・