ALPSLAB route to GARMIN
GARMIN VISTA HCxを持っていくと、サイクリングでは非常に便利だが、やっぱiPhoneとかと比較するともっさりしているし、モニターが小さいので非常に見通しが悪い。事前にルートが決まっている場合、ウェイポイントを入力しておいたほうが絶対楽。
ということで、
- ALPSLAB routeでルートを作る
- GPXでダウンロード(中身はトラックポイント)
- 間引いてウェイポイントに変換し、GPXで出力
- GPSBabelでGARMINに転送
ということにした。以下、3.のスクリプト。1kmごとにウェイポイントを作ります。意外と距離の目安になっていいかも。
# -*- coding: UTF-8 -*- require 'rexml/document' class GPoint RADIUS = 6378137.0 # in meter attr_accessor :lat # 緯度 attr_accessor :lon # 経度 attr_accessor :ele # 高度 def initialize(lat, lon, ele) @lat = lat @lon = lon @ele = ele end def rlat # in Rad. @lat * Math::PI / 180.0 end def rlon # in Rad. @lon * Math::PI / 180.0 end def distance(p2) dlat = p2.rlat - self.rlat dlon = p2.rlon - self.rlon dx = RADIUS * dlat * Math.cos(self.rlon) dy = RADIUS * dlon Math.sqrt(dx**2 + dy**2) end def waypoint(name = 'WPT') r = <<XMLEND <wpt lat=\"#{@lat}\" lon=\"#{@lon}\"> <ele>#{@ele}</ele> <name>#{name}</name> </wpt> XMLEND r end end doc = REXML::Document.new(File.new(ARGV[0])) gp = [] doc.elements.each('gpx/trk/trkseg/trkpt') do |pt| lat = pt.attribute('lat').value.to_f lon = pt.attribute('lon').value.to_f ele = 0 pt.elements.each('ele') do |e| ele = e.text.to_f end gp << GPoint.new(lat, lon, ele) end header = <<XMLEND <?xml version="1.0" encoding="UTF-8"?> <gpx version="1.1" xmlns="http://www.topografix.com/GPX/1/1"> XMLEND puts header dist = 0 count = 0 for i in 1..gp.size - 1 dist += gp[i].distance(gp[i-1]) if dist > 1000 then # 1000mごとに出力 puts gp[i].waypoint("WPT#{count}") dist = 0 count += 1 end end puts '</gpx>'