geoptima 0.1.11 → 0.1.12

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/bin/show_geoptima CHANGED
@@ -258,6 +258,12 @@ class Export
258
258
  end
259
259
  end
260
260
  end
261
+ def export_gpx(trace)
262
+ File.open("#{$export_prefix}#{trace}.gpx",'w') do |out|
263
+ puts "Exporting #{trace.length} GPS events to trace: #{trace}"
264
+ out.puts trace.as_gpx
265
+ end
266
+ end
261
267
  def header(name=nil)
262
268
  @headers[name]
263
269
  end
@@ -317,6 +323,11 @@ $datasets.keys.sort.each do |imei|
317
323
  names = dataset.events_names if(names.length<1)
318
324
  export = Export.new(imei,names,dataset)
319
325
  export.export_stats(dataset.stats) if($export_stats)
326
+ if $export_gpx
327
+ dataset.each_trace do |trace|
328
+ export.export_gpx(trace)
329
+ end
330
+ end
320
331
  if $header_maps && $header_maps.length > 0
321
332
  $header_maps.each do |hm|
322
333
  puts "Searching for events for header_maps '#{hm.event}'"
@@ -258,6 +258,12 @@ class Export
258
258
  end
259
259
  end
260
260
  end
261
+ def export_gpx(trace)
262
+ File.open("#{$export_prefix}#{trace}.gpx",'w') do |out|
263
+ puts "Exporting #{trace.length} GPS events to trace: #{trace}"
264
+ out.puts trace.as_gpx
265
+ end
266
+ end
261
267
  def header(name=nil)
262
268
  @headers[name]
263
269
  end
@@ -317,6 +323,11 @@ $datasets.keys.sort.each do |imei|
317
323
  names = dataset.events_names if(names.length<1)
318
324
  export = Export.new(imei,names,dataset)
319
325
  export.export_stats(dataset.stats) if($export_stats)
326
+ if $export_gpx
327
+ dataset.each_trace do |trace|
328
+ export.export_gpx(trace)
329
+ end
330
+ end
320
331
  if $header_maps && $header_maps.length > 0
321
332
  $header_maps.each do |hm|
322
333
  puts "Searching for events for header_maps '#{hm.event}'"
data/lib/geoptima/data.rb CHANGED
@@ -33,6 +33,75 @@ module Geoptima
33
33
  end
34
34
  end
35
35
 
36
+ class Trace
37
+ attr_reader :dataset, :name, :tracename, :bounds, :events
38
+ def initialize(dataset)
39
+ @dataset = dataset
40
+ @name = dataset.name
41
+ @events = []
42
+ end
43
+ def <<(e)
44
+ @tracename ||= "#{name}-#{e.time}"
45
+ check_bounds(e)
46
+ @events << e unless(co_located(e,@events[-1]))
47
+ end
48
+ def co_located(event,other)
49
+ event && other && event.latitude == other.latitude && event.longitude == other.longitude
50
+ end
51
+ def length
52
+ events.length
53
+ end
54
+ def to_s
55
+ tracename || name
56
+ end
57
+ def check_bounds(e)
58
+ @bounds ||= {}
59
+ check_bounds_min :minlat, e.latitude
60
+ check_bounds_min :minlon, e.longitude
61
+ check_bounds_max :maxlat, e.latitude
62
+ check_bounds_max :maxlon, e.longitude
63
+ end
64
+ def check_bounds_min(key,value)
65
+ @bounds[key] = value if(@bounds[key].nil? || @bounds[key] > value)
66
+ end
67
+ def check_bounds_max(key,value)
68
+ @bounds[key] = value if(@bounds[key].nil? || @bounds[key] < value)
69
+ end
70
+ def each
71
+ events.each{|e| yield e}
72
+ end
73
+ def too_far(other)
74
+ events && events[-1] && (events[-1].days_from(other) > 0.5 || events[-1].distance_from(other) > 0.002)
75
+ end
76
+ def bounds_as_gpx
77
+ "<bounds " + bounds.keys.map{|k| "#{k}=\"#{bounds[k]}\""}.join(' ') + "/>"
78
+ end
79
+ def event_as_gpx(e,index)
80
+ "<trkpt lat=\"#{e.latitude}\" lon=\"#{e.longitude}\"><ele>#{index}</ele><time>#{e.time}</time></trkpt>"
81
+ end
82
+ def as_gpx
83
+ ei = 0
84
+ gpx = %{<?xml version="1.0" encoding="UTF-8"?>
85
+ <gpx version="1.1" creator="geoptima.rb - Craig Taverner">
86
+ <metadata>
87
+ #{bounds_as_gpx}
88
+ </metadata>
89
+ <trk>
90
+ <name>#{tracename}</name>
91
+ <trkseg>
92
+ } +
93
+ events.map do |e|
94
+ ei += 1
95
+ event_as_gpx(e,ei)
96
+ end.join("\n ") +
97
+ """
98
+ </trkseg>
99
+ </trk>
100
+ </gpx>
101
+ """
102
+ end
103
+ end
104
+
36
105
  module ErrorCounter
37
106
  attr_reader :errors
38
107
  def errors
@@ -135,6 +204,12 @@ module Geoptima
135
204
  def time_key
136
205
  utc.strftime("%Y-%m-%d %H:%M:%S.%3N").gsub(/\.(\d{3})\d+/,'.\1')
137
206
  end
207
+ def days_from(other)
208
+ (other.time - time).abs
209
+ end
210
+ def distance_from(other)
211
+ Math.sqrt((other.latitude.to_f - latitude.to_f)**2 + (other.longitude.to_f - longitude.to_f)**2)
212
+ end
138
213
  def [](key)
139
214
  @fields[key] || @fields[key.gsub(/#{name}\./,'')]
140
215
  end
@@ -516,6 +591,20 @@ module Geoptima
516
591
  @sorted
517
592
  end
518
593
 
594
+ def each_trace
595
+ puts "Exporting GPX traces"
596
+ trace = nil
597
+ sorted('gps').each do |gps|
598
+ trace ||= Trace.new(self)
599
+ if trace.too_far(gps)
600
+ yield trace
601
+ trace = Trace.new(self)
602
+ end
603
+ trace << gps
604
+ end
605
+ yield trace if(trace)
606
+ end
607
+
519
608
  def locate_events
520
609
  prev_gps = nil
521
610
  count = 0
@@ -1,6 +1,6 @@
1
1
  module Geoptima
2
2
 
3
- VERSION = "0.1.11"
3
+ VERSION = "0.1.12"
4
4
 
5
5
  class Version
6
6
  attr_reader :comparator, :version, :major, :minor, :patch
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: geoptima
3
3
  version: !ruby/object:Gem::Version
4
- hash: 13
4
+ hash: 3
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 11
10
- version: 0.1.11
9
+ - 12
10
+ version: 0.1.12
11
11
  platform: ruby
12
12
  authors:
13
13
  - Craig Taverner
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-06-07 00:00:00 Z
18
+ date: 2012-06-08 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: multi_json