ALPSLAB route to GARMIN

GARMIN VISTA HCxを持っていくと、サイクリングでは非常に便利だが、やっぱiPhoneとかと比較するともっさりしているし、モニターが小さいので非常に見通しが悪い。事前にルートが決まっている場合、ウェイポイントを入力しておいたほうが絶対楽。
ということで、

  1. ALPSLAB routeでルートを作る
  2. GPXでダウンロード(中身はトラックポイント)
  3. 間引いてウェイポイントに変換し、GPXで出力
  4. 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>'