部門 > Ruby > GPXファイルをRubyで扱う > 時間平均をとる

「部門/Ruby/GPXファイルをRubyで扱う/時間平均をとる」の編集履歴(バックアップ)一覧はこちら

部門/Ruby/GPXファイルをRubyで扱う/時間平均をとる」(2011/10/30 (日) 18:32:40) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

[[ver.2をつくりました>http://www47.atwiki.jp/cscd/pages/109.html]] 時間平均をとるスクリプトその1。まだRubyでGPXをつくるのはちゃんとできていないので,とりあえずGnuplot用のファイルを出力するようにした。Gnuplot用なので出力ファイルはCSVとしてるけど実態はCSV(Comma Separated Value)ではない。入力ファイルは普通のGPXではなく、[[Unix時間を追加したファイル>http://www47.atwiki.jp/cscd/pages/103.html]]です。 #highlight(ruby){{ #!/usr/bin/ruby # -*- coding: utf-8 -*- #座標の時間平均を取る require "rexml/document" experiment_name="e101" in_file_name = "e101_unix.gpx" out_file_name = "e101_unix_by10min.gpx" start_time = 0 stop_time = 1314540864 doc = nil File.open(in_file_name) {|xmlfile| doc = REXML::Document.new(xmlfile) } # http://www6.airnet.ne.jp/manyo/xml/ruby/step10.html csv1=File.open("raw.csv","w") csv2=File.open("3600.csv","w") trkseg = doc.elements["/gpx/trk/trkseg"] trkseg.elements.each("trkpt"){|trkpt| longtitude = trkpt.attributes.get_attribute("lon") latitude = trkpt.attributes.get_attribute("lat") unixtime = trkpt.attributes.get_attribute("unixtime") # csv1.puts "#{unixtime},#{longtitude},#{latitude}" csv1.puts "#{longtitude} #{latitude}" } start_time=1314457343 time=start_time i = 1 sumlong = 0 sumlati = 0 unitime=[] trkseg = doc.elements["/gpx/trk/trkseg"] trkseg.elements.each("trkpt"){|trkpt| longtitude = trkpt.attributes.get_attribute("lon").to_s.to_f latitude = trkpt.attributes.get_attribute("lat").to_s.to_f unixtime = trkpt.attributes.get_attribute("unixtime").to_s.to_f #REXML::attribute => string => float とクラスを変更している # p unixtime.class # p unixtime if unixtime <= time unitime[i]=unixtime sumlong = sumlong + longtitude sumlati = sumlati + latitude i+=1 else if i != 1 # csv2.puts "#{(unitime[1].to_f+unitime[i-1].to_f)/2},#{sumlong/(i-1)},#{sumlati/(i-1)}" csv2.puts "#{sumlong/(i-1)} #{sumlati/(i-1)}" else #つまりi=1なら # csv2.puts "#{unitime[1].to_f},#{longtitude},#{latitude}" csv2.puts "#{longtitude} #{latitude}" end i=1 time=time+3600 sumlong = 0 sumlati = 0 end } File.open(out_file_name,"w") do |outfile| doc.write(outfile, 0) end }} Gnuplot用のマクロは次のような感じ。 #highlight(gnuplot){{set term pdf set output "time_average.pdf #set size ratio -1 plot [135.44:135.54]"raw.csv" w l, "3600.csv" w l}}
[[ver.2をつくりました>http://www47.atwiki.jp/cscd/pages/109.html]] 時間平均をとるスクリプトその1。まだRubyでGPXをつくるのはちゃんとできていないので,とりあえずGnuplot用のファイルを出力するようにした。Gnuplot用なので出力ファイルはCSVとしてるけど実態はCSV(Comma Separated Value)ではない。入力ファイルは普通のGPXではなく、[[Unix時間を追加したファイル>http://www47.atwiki.jp/cscd/pages/103.html]]です。 #highlight(ruby){{ #!/usr/bin/ruby # -*- coding: utf-8 -*- #座標の時間平均を取る require "rexml/document" experiment_name="e101" in_file_name = "e101_unix.gpx" out_file_name = "e101_unix_by10min.gpx" start_time = 0 stop_time = 1314540864 doc = nil File.open(in_file_name) {|xmlfile| doc = REXML::Document.new(xmlfile) } # http://www6.airnet.ne.jp/manyo/xml/ruby/step10.html csv1=File.open("raw.csv","w") csv2=File.open("3600.csv","w") trkseg = doc.elements["/gpx/trk/trkseg"] trkseg.elements.each("trkpt"){|trkpt| longtitude = trkpt.attributes.get_attribute("lon") latitude = trkpt.attributes.get_attribute("lat") unixtime = trkpt.attributes.get_attribute("unixtime") # csv1.puts "#{unixtime},#{longtitude},#{latitude}" csv1.puts "#{longtitude} #{latitude}" } start_time=1314457343 time=start_time i = 1 sumlong = 0 sumlati = 0 unitime=[] trkseg = doc.elements["/gpx/trk/trkseg"] trkseg.elements.each("trkpt"){|trkpt| longtitude = trkpt.attributes.get_attribute("lon").to_s.to_f latitude = trkpt.attributes.get_attribute("lat").to_s.to_f unixtime = trkpt.attributes.get_attribute("unixtime").to_s.to_f #REXML::attribute => string => float とクラスを変更している # p unixtime.class # p unixtime if unixtime <= time unitime[i]=unixtime sumlong = sumlong + longtitude sumlati = sumlati + latitude i+=1 else if i != 1 # csv2.puts "#{(unitime[1].to_f+unitime[i-1].to_f)/2},#{sumlong/(i-1)},#{sumlati/(i-1)}" csv2.puts "#{sumlong/(i-1)} #{sumlati/(i-1)}" else #つまりi=1なら # csv2.puts "#{unitime[1].to_f},#{longtitude},#{latitude}" csv2.puts "#{longtitude} #{latitude}" end i=1 time=time+3600 sumlong = 0 sumlati = 0 end } File.open(out_file_name,"w") do |outfile| doc.write(outfile, 0) end }} Gnuplot用のマクロは次のような感じ。 #highlight(gnuplot){{set term pdf set output "time_average.pdf" #set size ratio -1 plot [135.44:135.54]"raw.csv" w l, "3600.csv" w l}}

表示オプション

横に並べて表示:
変化行の前後のみ表示: