gpx2exif 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Gemfile CHANGED
@@ -1,12 +1,13 @@
1
1
  source "http://rubygems.org"
2
2
 
3
- gem 'nokogiri'
4
3
  gem 'mini_exiftool'
5
- gem 'builder'
4
+ gem 'rmagick'
5
+ gem 'chunky_png'
6
+ gem 'gpx_utils'
6
7
 
7
8
  group :development do
8
- gem "rspec", "~> 2.3.0"
9
- gem "bundler", "~> 1.0.0"
10
- gem "jeweler", "~> 1.6.4"
11
- gem "simplecov", ">= 0"
9
+ gem "rspec"
10
+ gem "bundler"
11
+ gem "jeweler"
12
+ gem "simplecov"
12
13
  end
data/Gemfile.lock CHANGED
@@ -1,38 +1,79 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- builder (3.1.3)
5
- diff-lcs (1.1.3)
6
- git (1.2.5)
7
- jeweler (1.6.4)
4
+ addressable (2.3.5)
5
+ builder (3.2.2)
6
+ chunky_png (1.2.9)
7
+ diff-lcs (1.2.5)
8
+ docile (1.1.1)
9
+ faraday (0.8.8)
10
+ multipart-post (~> 1.2.0)
11
+ git (1.2.6)
12
+ github_api (0.10.1)
13
+ addressable
14
+ faraday (~> 0.8.1)
15
+ hashie (>= 1.2)
16
+ multi_json (~> 1.4)
17
+ nokogiri (~> 1.5.2)
18
+ oauth2
19
+ gpx_utils (0.0.1)
20
+ builder
21
+ nokogiri
22
+ hashie (2.0.5)
23
+ highline (1.6.20)
24
+ httpauth (0.2.0)
25
+ jeweler (1.8.8)
26
+ builder
8
27
  bundler (~> 1.0)
9
28
  git (>= 1.2.5)
29
+ github_api (= 0.10.1)
30
+ highline (>= 1.6.15)
31
+ nokogiri (= 1.5.10)
10
32
  rake
11
- mini_exiftool (1.6.0)
12
- multi_json (1.3.6)
13
- nokogiri (1.5.5)
14
- rake (0.9.2.2)
15
- rspec (2.3.0)
16
- rspec-core (~> 2.3.0)
17
- rspec-expectations (~> 2.3.0)
18
- rspec-mocks (~> 2.3.0)
19
- rspec-core (2.3.1)
20
- rspec-expectations (2.3.0)
21
- diff-lcs (~> 1.1.2)
22
- rspec-mocks (2.3.0)
23
- simplecov (0.6.4)
33
+ rdoc
34
+ json (1.8.1)
35
+ jwt (0.1.8)
36
+ multi_json (>= 1.5)
37
+ mini_exiftool (2.3.0)
38
+ multi_json (1.8.2)
39
+ multi_xml (0.5.5)
40
+ multipart-post (1.2.0)
41
+ nokogiri (1.5.10)
42
+ oauth2 (0.9.2)
43
+ faraday (~> 0.8)
44
+ httpauth (~> 0.2)
45
+ jwt (~> 0.1.4)
24
46
  multi_json (~> 1.0)
25
- simplecov-html (~> 0.5.3)
26
- simplecov-html (0.5.3)
47
+ multi_xml (~> 0.5)
48
+ rack (~> 1.2)
49
+ rack (1.5.2)
50
+ rake (10.1.0)
51
+ rdoc (4.0.1)
52
+ json (~> 1.4)
53
+ rmagick (2.13.2)
54
+ rspec (2.14.1)
55
+ rspec-core (~> 2.14.0)
56
+ rspec-expectations (~> 2.14.0)
57
+ rspec-mocks (~> 2.14.0)
58
+ rspec-core (2.14.7)
59
+ rspec-expectations (2.14.4)
60
+ diff-lcs (>= 1.1.3, < 2.0)
61
+ rspec-mocks (2.14.4)
62
+ simplecov (0.8.2)
63
+ docile (~> 1.1.0)
64
+ multi_json
65
+ simplecov-html (~> 0.8.0)
66
+ simplecov-html (0.8.0)
27
67
 
28
68
  PLATFORMS
29
69
  ruby
30
70
 
31
71
  DEPENDENCIES
32
- builder
33
- bundler (~> 1.0.0)
34
- jeweler (~> 1.6.4)
72
+ bundler
73
+ chunky_png
74
+ gpx_utils
75
+ jeweler
35
76
  mini_exiftool
36
- nokogiri
37
- rspec (~> 2.3.0)
77
+ rmagick
78
+ rspec
38
79
  simplecov
data/Rakefile CHANGED
@@ -22,7 +22,7 @@ Jeweler::Tasks.new do |gem|
22
22
  gem.email = "bobikx@poczta.fm"
23
23
  gem.authors = ["Aleksander Kwiatkowski"]
24
24
  # dependencies defined in Gemfile
25
- gem.executables = ['geotag_all_images', 'geotag_simulate', 'generate_garmin_waypoints', 'gpx2png']
25
+ gem.executables = ['geotag_all_images', 'geotag_simulate', 'gpx2png']
26
26
 
27
27
  gem.files = FileList[
28
28
  "[A-Z]*", "{bin,generators,lib,test}/**/*"
@@ -43,15 +43,7 @@ end
43
43
 
44
44
  task :default => :spec
45
45
 
46
- require 'rake/rdoctask'
47
- Rake::RDocTask.new do |rdoc|
48
- version = File.exist?('VERSION') ? File.read('VERSION') : ""
49
-
50
- rdoc.rdoc_dir = 'rdoc'
51
- rdoc.title = "gpx2exif #{version}"
52
- rdoc.rdoc_files.include('README*')
53
- rdoc.rdoc_files.include('lib/**/*.rb')
54
- end
46
+ require 'rdoc/task'
55
47
 
56
48
  desc "Run RSpec with code coverage"
57
49
  task :coverage do
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.3
1
+ 0.2.0
@@ -0,0 +1,192 @@
1
+ require 'gpx_utils/waypoints_importer'
2
+
3
+ module SkiAnalyzer
4
+ class Analyzer
5
+ def initialize(gpx_file, start = nil, finish = nil)
6
+ @file = gpx_file
7
+
8
+ @i = GpxUtils::TrackImporter.new
9
+ @i.add_file(@file)
10
+
11
+ @coords = @i.coords.clone
12
+
13
+ # where you start sleeping
14
+ @start = start
15
+ @start = find_start if @start.nil?
16
+ puts "Start - #{@start.inspect}"
17
+
18
+ # where you start skiing
19
+ @finish = finish
20
+ @finish = find_finish if @finish.nil?
21
+ puts "Finish - #{@finish.inspect}"
22
+
23
+ calculate_speed
24
+ process
25
+ descend_results
26
+
27
+ #g = Geokit::LatLng.new(@coords.first[:lat], @coords.first[:lon])
28
+ #puts g.inspect
29
+
30
+ #@coords.each do |c|
31
+ # puts "#{c[:lat]},#{c[:lon]} #{c[:alt]}"
32
+ #end
33
+ end
34
+
35
+ def find_start
36
+ @coords.sort { |a, b| a[:alt] <=> b[:alt] }.first
37
+ end
38
+
39
+ def find_finish
40
+ @coords.sort { |a, b| a[:alt] <=> b[:alt] }.last
41
+ end
42
+
43
+ def calculate_speed
44
+ (1...@coords.size).each do |i|
45
+ ga = Geokit::LatLng.new(@coords[i-1][:lat], @coords[i-1][:lon])
46
+ gb = Geokit::LatLng.new(@coords[i][:lat], @coords[i][:lon])
47
+ d = ga.distance_from(gb, units: :kms)
48
+ td = @coords[i][:time] - @coords[i-1][:time]
49
+
50
+ @coords[i][:distance] = d
51
+ @coords[i][:speed] = (@coords[i][:distance] * 1000.0) / td
52
+
53
+ puts "D - #{@coords[i][:distance]} m | S - #{@coords[i][:speed]} m/s"
54
+ end
55
+ end
56
+
57
+ def process
58
+ # do not add coords not near start point
59
+ j = nil
60
+ @coords.each_with_index do |c, i|
61
+ ga = Geokit::LatLng.new(@start[:lat], @start[:lon])
62
+ gb = Geokit::LatLng.new(c[:lat], c[:lon])
63
+ d = ga.distance_from(gb, units: :kms)
64
+ if j.nil? and d < 0.1
65
+ puts "Choosen #{i} waypoint as start, distance #{d}"
66
+ j = i
67
+ end
68
+ end
69
+ @coords = @coords[j..-1]
70
+
71
+ # calculate distance to start and finish
72
+ @coords.each do |c|
73
+ gf = Geokit::LatLng.new(@finish[:lat], @finish[:lon])
74
+ gs = Geokit::LatLng.new(@start[:lat], @start[:lon])
75
+ g = Geokit::LatLng.new(c[:lat], c[:lon])
76
+
77
+ df = g.distance_from(gf, units: :kms)
78
+ ds = g.distance_from(gs, units: :kms)
79
+
80
+ c[:d_start] = ds
81
+ c[:d_finish] = df
82
+ end
83
+
84
+ # check if ascend/descend
85
+ j = 0
86
+ t = :up
87
+ (1...@coords.size).each do |i|
88
+ if t == :up
89
+ if @coords[i][:d_finish] < 0.1 and @coords[i-1][:d_finish] < @coords[i][:d_finish]
90
+ t = :down
91
+ j += 1
92
+ puts "Type change #{i} - #{t} - #{j}"
93
+ end
94
+ elsif t == :down
95
+ if @coords[i][:d_start] < 0.1 and @coords[i-1][:d_start] < @coords[i][:d_start]
96
+ t = :up
97
+ j += 1
98
+ puts "Type change #{i} - #{t} - #{j}"
99
+ end
100
+ end
101
+
102
+ @coords[i][:type] = t
103
+ @coords[i][:round] = j
104
+ end
105
+
106
+ # some computing
107
+ # distance quant calculation, from "finish"
108
+ #q = 0.05 # quant
109
+ q = 0.2 # quant
110
+ gf = Geokit::LatLng.new(@finish[:lat], @finish[:lon])
111
+ gs = Geokit::LatLng.new(@start[:lat], @start[:lon])
112
+ round_distance = gf.distance_from(gs, units: :kms)
113
+ quant_count = round_distance / q
114
+ quant_count = quant_count.ceil
115
+ q = round_distance / quant_count
116
+
117
+ puts "Distance quant #{q}, count #{quant_count}"
118
+
119
+ results = Array.new
120
+ (0..j).each do |round|
121
+ # round loop
122
+ (0..quant_count).each do |qc|
123
+ # quant loop
124
+
125
+ d_from = q * qc
126
+ d_to = (q + 1) * qc
127
+ coords = @coords.select { |c| c[:round] == round and c[:d_finish] >= d_from and c[:d_finish] < d_to }
128
+ puts "Found coords #{coords.size} for round #{round} and quant #{qc}"
129
+
130
+ h = Hash.new
131
+ h[:round] = round
132
+ h[:quant] = qc
133
+ begin
134
+ h[:type] = coords.first[:type]
135
+ rescue
136
+ end
137
+
138
+ sq = 0
139
+ ss = 0.0
140
+ coords.each do |coord|
141
+ _s = coord[:speed]
142
+ if _s
143
+ ss += _s
144
+ sq += 1
145
+ end
146
+ end
147
+ if sq > 0
148
+ h[:speed] = ss / sq.to_f
149
+ end
150
+
151
+ results << h
152
+ end
153
+ end
154
+
155
+ @results = results
156
+ end
157
+
158
+ def descend_results
159
+ rs = @results.select { |r| r[:type] == :down }
160
+ #rs = @results.select { |r| r[:type] == :up }
161
+
162
+ rounds = rs.collect { |r| r[:round] }.sort.uniq
163
+ quants = rs.collect { |r| r[:quant] }.sort.uniq
164
+
165
+ s = ""
166
+
167
+ s += "\t\t"
168
+ rounds.each do |r|
169
+ s += "#{r}\t"
170
+ end
171
+ s += "\n\n"
172
+
173
+ quants.each do |q|
174
+ s += "#{q}\t\t"
175
+
176
+ rounds.each do |r|
177
+ _a = rs.select { |a| a[:round] == r and a[:quant] == q }
178
+ if _a.size > 0
179
+ speed = _a.first[:speed]
180
+ s += "#{(speed * 3.6).round}\t"
181
+ else
182
+ s += ".\t"
183
+ end
184
+ end
185
+ s += "\n"
186
+ end
187
+
188
+ puts s
189
+
190
+ end
191
+ end
192
+ end
@@ -0,0 +1,6 @@
1
+ $:.unshift(File.dirname(__FILE__))
2
+
3
+ require 'ski_analyzer/analyzer'
4
+
5
+ module SkiAnalyzer
6
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gpx2exif
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-07 00:00:00.000000000Z
12
+ date: 2013-12-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: nokogiri
16
- requirement: &16633900 !ruby/object:Gem::Requirement
15
+ name: mini_exiftool
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,31 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *16633900
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
25
30
  - !ruby/object:Gem::Dependency
26
- name: mini_exiftool
27
- requirement: &16633240 !ruby/object:Gem::Requirement
31
+ name: rmagick
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: chunky_png
48
+ requirement: !ruby/object:Gem::Requirement
28
49
  none: false
29
50
  requirements:
30
51
  - - ! '>='
@@ -32,10 +53,15 @@ dependencies:
32
53
  version: '0'
33
54
  type: :runtime
34
55
  prerelease: false
35
- version_requirements: *16633240
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
36
62
  - !ruby/object:Gem::Dependency
37
- name: builder
38
- requirement: &16632640 !ruby/object:Gem::Requirement
63
+ name: gpx_utils
64
+ requirement: !ruby/object:Gem::Requirement
39
65
  none: false
40
66
  requirements:
41
67
  - - ! '>='
@@ -43,43 +69,63 @@ dependencies:
43
69
  version: '0'
44
70
  type: :runtime
45
71
  prerelease: false
46
- version_requirements: *16632640
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
47
78
  - !ruby/object:Gem::Dependency
48
79
  name: rspec
49
- requirement: &16626120 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
50
81
  none: false
51
82
  requirements:
52
- - - ~>
83
+ - - ! '>='
53
84
  - !ruby/object:Gem::Version
54
- version: 2.3.0
85
+ version: '0'
55
86
  type: :development
56
87
  prerelease: false
57
- version_requirements: *16626120
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
58
94
  - !ruby/object:Gem::Dependency
59
95
  name: bundler
60
- requirement: &16625620 !ruby/object:Gem::Requirement
96
+ requirement: !ruby/object:Gem::Requirement
61
97
  none: false
62
98
  requirements:
63
- - - ~>
99
+ - - ! '>='
64
100
  - !ruby/object:Gem::Version
65
- version: 1.0.0
101
+ version: '0'
66
102
  type: :development
67
103
  prerelease: false
68
- version_requirements: *16625620
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
69
110
  - !ruby/object:Gem::Dependency
70
111
  name: jeweler
71
- requirement: &16625080 !ruby/object:Gem::Requirement
112
+ requirement: !ruby/object:Gem::Requirement
72
113
  none: false
73
114
  requirements:
74
- - - ~>
115
+ - - ! '>='
75
116
  - !ruby/object:Gem::Version
76
- version: 1.6.4
117
+ version: '0'
77
118
  type: :development
78
119
  prerelease: false
79
- version_requirements: *16625080
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
80
126
  - !ruby/object:Gem::Dependency
81
127
  name: simplecov
82
- requirement: &16624580 !ruby/object:Gem::Requirement
128
+ requirement: !ruby/object:Gem::Requirement
83
129
  none: false
84
130
  requirements:
85
131
  - - ! '>='
@@ -87,13 +133,17 @@ dependencies:
87
133
  version: '0'
88
134
  type: :development
89
135
  prerelease: false
90
- version_requirements: *16624580
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
91
142
  description: Mass geotagger using GPX files.
92
143
  email: bobikx@poczta.fm
93
144
  executables:
94
145
  - geotag_all_images
95
146
  - geotag_simulate
96
- - generate_garmin_waypoints
97
147
  - gpx2png
98
148
  extensions: []
99
149
  extra_rdoc_files:
@@ -106,7 +156,6 @@ files:
106
156
  - README.md
107
157
  - Rakefile
108
158
  - VERSION
109
- - bin/generate_garmin_waypoints
110
159
  - bin/geotag_all_images
111
160
  - bin/geotag_simulate
112
161
  - bin/gpx2png
@@ -123,10 +172,9 @@ files:
123
172
  - lib/gpx2png/renderers/rmagick_renderer.rb
124
173
  - lib/gpx2png/ump.rb
125
174
  - lib/gpx_utils.rb
126
- - lib/gpx_utils/track_importer.rb
127
- - lib/gpx_utils/waypoints_exporter.rb
128
- - lib/gpx_utils/waypoints_importer.rb
129
175
  - lib/mini_exiftool/mini_exiftool.rb
176
+ - lib/ski_analyzer.rb
177
+ - lib/ski_analyzer/analyzer.rb
130
178
  homepage: http://github.com/akwiatkowski/gpx2exif
131
179
  licenses:
132
180
  - LGPLv3
@@ -142,7 +190,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
142
190
  version: '0'
143
191
  segments:
144
192
  - 0
145
- hash: -1136394423762975328
193
+ hash: -2766757745175557176
146
194
  required_rubygems_version: !ruby/object:Gem::Requirement
147
195
  none: false
148
196
  requirements:
@@ -151,7 +199,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
151
199
  version: '0'
152
200
  requirements: []
153
201
  rubyforge_project:
154
- rubygems_version: 1.8.15
202
+ rubygems_version: 1.8.25
155
203
  signing_key:
156
204
  specification_version: 3
157
205
  summary: Mass geotagger using GPX files
@@ -1,46 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'rubygems'
4
- require 'gpx2exif'
5
- require 'optparse'
6
-
7
- options = { }
8
- OptionParser.new do |opts|
9
- opts.banner = "Usage: generate_garmin_waypoints [options]"
10
-
11
- opts.on("-y", "--yaml FILE", "Add points from yaml file") do |v|
12
- options[:yaml] = v
13
- end
14
- opts.on("-C", "--check", "Check distance of waypoints") do
15
- options[:check] = true
16
- end
17
- opts.on("-t", "--check_threshold DISTANCE", "Min distance of waypoints") do |v|
18
- options[:check_threshold] = v
19
- end
20
- opts.on("-o", "--output FILE", "Save output to file") do |v|
21
- options[:output_file] = v
22
- end
23
- end.parse!
24
-
25
- g = GpxUtils::WaypointsExporter.new
26
- if options[:yaml]
27
- g.add_yaml_file(options[:yaml])
28
- end
29
- if options[:check_threshold]
30
- g.check_min_threshold = options[:check_threshold].to_f
31
- end
32
-
33
- # result
34
- if options[:check]
35
- g.check
36
- else
37
- xml = g.to_xml
38
- if options[:output_file]
39
- f = File.open(options[:output_file], 'w')
40
- f.puts xml
41
- f.close
42
- else
43
- puts xml
44
- end
45
-
46
- end
@@ -1,63 +0,0 @@
1
- require 'rubygems'
2
- require 'nokogiri'
3
-
4
- #$:.unshift(File.dirname(__FILE__))
5
-
6
- # Simple parsing GPX file
7
- module GpxUtils
8
- class TrackImporter
9
-
10
- def initialize
11
- @coords = Array.new
12
- end
13
-
14
- attr_reader :coords
15
-
16
- def add_file(path)
17
- f = File.new(path)
18
- doc = Nokogiri::XML(f)
19
- doc.remove_namespaces!
20
- a = Array.new
21
- error_count = 0
22
-
23
- trackpoints = doc.xpath('//gpx/trk/trkseg/trkpt')
24
- trackpoints.each do |wpt|
25
- w = {
26
- :lat => wpt.xpath('@lat').to_s.to_f,
27
- :lon => wpt.xpath('@lon').to_s.to_f,
28
- :time => proc_time(wpt.xpath('time').children.first.to_s),
29
- :alt => wpt.xpath('ele').children.first.to_s.to_f
30
- }
31
-
32
- if self.class.coord_valid?(w[:lat], w[:lon], w[:alt], w[:time])
33
- a << w
34
- else
35
- error_count += 1
36
- end
37
-
38
- end
39
-
40
- f.close
41
-
42
- @coords += a
43
- @coords = @coords.sort { |b, c| b[:time] <=> c[:time] }
44
- end
45
-
46
- # Only import valid coords
47
- def self.coord_valid?(lat, lon, elevation, time)
48
- return true if lat and lon
49
- return false
50
- end
51
-
52
- def self.proc_time(ts)
53
- if ts =~ /(\d{4})-(\d{2})-(\d{2})T(\d{1,2}):(\d{2}):(\d{2})Z/
54
- return Time.gm($1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i).localtime
55
- end
56
- end
57
-
58
- def proc_time(ts)
59
- self.class.proc_time(ts)
60
- end
61
-
62
- end
63
- end
@@ -1,133 +0,0 @@
1
- require 'rubygems'
2
- require 'builder'
3
- require 'yaml'
4
-
5
- $:.unshift(File.dirname(__FILE__))
6
-
7
- module GpxUtils
8
- class WaypointsExporter
9
-
10
- def initialize
11
- @pois = Array.new
12
- @etrex_model = "eTrex 30"
13
- @check_min_threshold = 0.01
14
- end
15
-
16
- attr_accessor :check_min_threshold
17
- attr_accessor :etrex_model
18
-
19
- def add_yaml_file(y)
20
- @pois += YAML::load_file(y)
21
- end
22
-
23
- def add(lat, lon, name, cmt = nil, time = nil, ele = nil, sym = nil)
24
- @pois << {
25
- :lat => lat,
26
- :lon => lon,
27
- :name => name,
28
- :cmt => cmt,
29
- :time => time,
30
- :ele => ele,
31
- :sym => sym
32
- }
33
- end
34
-
35
- def check
36
- puts "Distance conflicts:"
37
-
38
- sorted = @pois.sort { |p, q| p[:lat] <=> q[:lat] }
39
- (1...sorted.size).each do |i|
40
- l = (sorted[i-1][:lat] - sorted[i][:lat]) ** 2 +
41
- (sorted[i-1][:lon] - sorted[i][:lon]) ** 2
42
- l = Math.sqrt(l)
43
-
44
- if l < @check_min_threshold
45
- puts "* #{sorted[i-1][:name]} - #{sorted[i][:name]} = #{l}"
46
- end
47
- end
48
- end
49
-
50
- def to_xml
51
- #xml = Builder::XmlMarkup.new(:indent => 2)
52
- string = ""
53
- xml = Builder::XmlMarkup.new(:target => string, :indent => 0)
54
- xml.instruct! :xml, :encoding => "UTF-8", :standalone => 'no'
55
- xml.gpx(
56
- 'xmlns' => "http://www.topografix.com/GPX/1/1",
57
- 'xmlns:gpxx' => "http://www.garmin.com/xmlschemas/GpxExtensions/v3",
58
- 'xmlns:wptx1' => "http://www.garmin.com/xmlschemas/WaypointExtension/v1",
59
- 'xmlns:gpxtpx' => "http://www.garmin.com/xmlschemas/TrackPointExtension/v1",
60
- 'creator' => @etrex_model,
61
- 'version' => "1.1",
62
- 'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance",
63
- 'xsi:schemaLocation' => "http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www8.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/WaypointExtension/v1 http://www8.garmin.com/xmlschemas/WaypointExtensionv1.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd"
64
-
65
-
66
- ) do |g|
67
- g.metadata do |meta|
68
- meta.link('href' => "http://www.garmin.com") do |link|
69
- link.text 'Garmin International'
70
- end
71
- meta.time process_time(Time.now) # 2012-03-24T15:41:34Z
72
- end
73
-
74
- # coords
75
- # <wpt lat="52.484444" lon="16.893056"><ele>113.286499</ele><time>2012-03-18T16:42:47Z</time><name>GORA MORASKO</name><cmt>DUZY</cmt><sym>Flag, Blue</sym></wpt>
76
- @pois.each do |poi|
77
- g.wpt('lat' => poi[:lat], 'lon' => poi[:lon]) do |wp|
78
- wp.ele poi[:elevation] unless poi[:elevation].nil?
79
- wp.ele poi[:ele] unless poi[:ele].nil?
80
-
81
- unless poi[:time].nil?
82
- wp.time process_time(poi[:time])
83
- else
84
- wp.time process_time(Time.now)
85
- end
86
- wp.name poi[:name]
87
-
88
- wp.cmt poi[:comment] unless poi[:comment].nil?
89
- wp.cmt poi[:cmt] unless poi[:cmt].nil?
90
-
91
- wp.sym poi[:sym] || "Flag, Blue" # default garmin symbol
92
- end
93
- end
94
- end
95
-
96
- #return string
97
- return string.gsub(/\n/, '').gsub(/\r/, '')
98
-
99
- end
100
-
101
- attr_reader :pois
102
-
103
- def self.symbols
104
- # http://freegeographytools.com/2008/garmin-gps-unit-waypoint-icons-table
105
- [
106
- "Flag, Blue",
107
- "Flag, Green",
108
- "Flag, Red",
109
-
110
- "Pin, Blue",
111
- "Pin, Green",
112
- "Pin, Red",
113
-
114
- "Block, Blue",
115
- "Block, Green",
116
- "Block, Red",
117
-
118
- "Summit",
119
- "Trail Head", # other trail parts, not summits
120
- "Lodging", # rooms
121
-
122
- "Ground Transportation" # all public ground transportation
123
- # ...
124
-
125
- ]
126
- end
127
-
128
- def process_time(time)
129
- time.utc.strftime('%Y-%m-%dT%H:%M:%SZ')
130
- end
131
-
132
- end
133
- end
@@ -1,54 +0,0 @@
1
- require 'rubygems'
2
-
3
- $:.unshift(File.dirname(__FILE__))
4
-
5
- module GpxUtils
6
- class WaypointsImporter
7
-
8
- def initialize
9
- @pois = Array.new
10
- end
11
-
12
- attr_reader :pois
13
-
14
- def add_file(y)
15
- @pois += parse_gpx_file(y)
16
- end
17
-
18
- def parse_gpx_file(path)
19
- f = File.new(path)
20
- doc = Nokogiri::XML(f)
21
- doc.remove_namespaces!
22
- a = Array.new
23
-
24
- trackpoints = doc.xpath('//gpx/wpt')
25
- trackpoints.each do |wpt|
26
- w = {
27
- :lat => wpt.xpath('@lat').to_s.to_f,
28
- :lon => wpt.xpath('@lon').to_s.to_f,
29
- :time => GpxUtils::TrackImporter.proc_time(wpt.xpath('time').children.first.to_s),
30
- :alt => wpt.xpath('ele').children.first.to_s.to_f,
31
- :name => wpt.xpath('name').children.first.to_s,
32
- :sym => wpt.xpath('sym').children.first.to_s
33
- }
34
- a << w
35
- end
36
- f.close
37
-
38
- return a
39
- end
40
-
41
- #def add(lat, lon, name, cmt = nil, time = nil, ele = nil, sym = nil)
42
- # @pois << {
43
- # :lat => lat,
44
- # :lon => lon,
45
- # :name => name,
46
- # :cmt => cmt,
47
- # :time => time,
48
- # :ele => ele,
49
- # :sym => sym
50
- # }
51
- #end
52
-
53
- end
54
- end