Module: TimeAwarePolyline

Defined in:
lib/time_aware_polyline.rb

Constant Summary collapse

GPX_TIME_FORMAT =

2016-07-21T05:43:09+00:00

"%FT%T%:z".freeze

Class Method Summary collapse

Class Method Details

._add_value_to_polyline(value, polyline) ⇒ Object



82
83
84
85
86
87
88
89
90
# File 'lib/time_aware_polyline.rb', line 82

def self._add_value_to_polyline(value, polyline)
  value = value.negative? ? ~(value << 1) : value << 1
  while value >= 32
    polyline << ((32 | (value & 31)) + 63).chr
    value >>= 5
  end
  polyline << (value + 63).chr
  polyline
end

._decode_lat_lng_time_from_polyline(polyline, index) ⇒ Object



92
93
94
95
96
97
# File 'lib/time_aware_polyline.rb', line 92

def self._decode_lat_lng_time_from_polyline(polyline, index)
  index, latitude_part = _get_decoded_dimension_from_polyline(polyline, index)
  index, longitude_part = _get_decoded_dimension_from_polyline(polyline, index)
  index, time_part = _get_decoded_dimension_from_polyline(polyline, index)
  [index, latitude_part, longitude_part, time_part]
end

._extend_time_aware_polyline(polyline: "", gpx_logs: nil, last_gpx_log: nil) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/time_aware_polyline.rb', line 50

def self._extend_time_aware_polyline(polyline: "", gpx_logs: nil, last_gpx_log: nil)
  if last_gpx_log.nil?
    last_latitude = 0
    last_longitude = 0
    last_time = 0
  else
    last_latitude, last_longitude, last_time = _get_gpx_for_polyline(last_gpx_log)
  end
  if polyline.nil?
    polyline = ""
  end
  if gpx_logs.nil?
    return polyline
  end

  gpx_logs.each do |gpx_log|
    latitude, longitude, time_stamp = _get_gpx_for_polyline(gpx_log)
    delta_latitude = latitude - last_latitude
    delta_longitude = longitude - last_longitude
    delta_time = time_stamp - last_time

    _add_value_to_polyline(delta_latitude, polyline)
    _add_value_to_polyline(delta_longitude, polyline)
    _add_value_to_polyline(delta_time, polyline)

    last_latitude = latitude
    last_longitude = longitude
    last_time = time_stamp
  end
  polyline
end

._get_coordinate_for_polyline(coordinate) ⇒ Object



34
35
36
# File 'lib/time_aware_polyline.rb', line 34

def self._get_coordinate_for_polyline(coordinate)
  (coordinate * 100_000.0).round(0).to_i
end

._get_coordinate_from_polyline(int_representation) ⇒ Object



38
39
40
# File 'lib/time_aware_polyline.rb', line 38

def self._get_coordinate_from_polyline(int_representation)
  (int_representation * 1e-05).round(5)
end

._get_decoded_dimension_from_polyline(polyline, index) ⇒ Object



99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/time_aware_polyline.rb', line 99

def self._get_decoded_dimension_from_polyline(polyline, index)
  result = 1
  shift = 0
  b = nil
  while b.nil? || b >= 31
    b = (polyline[index].ord - 63) - 1
    index += 1
    result += b << shift
    shift += 5
  end
  result = (result & 1).zero? ? result : ~result
  [index, result >> 1]
end

._get_gpx_for_polyline(gpx) ⇒ Object



42
43
44
# File 'lib/time_aware_polyline.rb', line 42

def self._get_gpx_for_polyline(gpx)
  [_get_coordinate_for_polyline(gpx[0]), _get_coordinate_for_polyline(gpx[1]), _get_time_for_polyline(gpx[2])]
end

._get_gpx_from_decoded(lat_rep, lon_rep, time_stamp_rep) ⇒ Object



46
47
48
# File 'lib/time_aware_polyline.rb', line 46

def self._get_gpx_from_decoded(lat_rep, lon_rep, time_stamp_rep)
  [_get_coordinate_from_polyline(lat_rep), _get_coordinate_from_polyline(lon_rep), _get_time_from_polyline(time_stamp_rep)]
end

._get_time_for_polyline(iso_time) ⇒ Object



26
27
28
# File 'lib/time_aware_polyline.rb', line 26

def self._get_time_for_polyline(iso_time)
  Time.parse(iso_time).to_i
end

._get_time_from_polyline(int_representation) ⇒ Object



30
31
32
# File 'lib/time_aware_polyline.rb', line 30

def self._get_time_from_polyline(int_representation)
  Time.at(int_representation).utc.strftime(GPX_TIME_FORMAT)
end

.decode_time_aware_polyline(polyline) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/time_aware_polyline.rb', line 9

def self.decode_time_aware_polyline(polyline)
  gpx_logs = []
  index = 0
  latitude = 0
  longitude = 0
  time_stamp = 0
  while index < polyline.size
    index, latitude_part, longitude_part, time_part = _decode_lat_lng_time_from_polyline(polyline, index)
    latitude += latitude_part
    longitude += longitude_part
    time_stamp += time_part
    gpx_log = _get_gpx_from_decoded(latitude, longitude, time_stamp)
    gpx_logs.push(gpx_log)
  end
  gpx_logs
end

.encode_time_aware_polyline(gpx_logs) ⇒ Object



5
6
7
# File 'lib/time_aware_polyline.rb', line 5

def self.encode_time_aware_polyline(gpx_logs)
  _extend_time_aware_polyline(:gpx_logs => gpx_logs)
end