+ file.open do |file|
+ gpx = GPX::File.new(file.path, :maximum_points => Settings.max_trace_size)
+
+ f_lat = 0
+ f_lon = 0
+ first = true
+
+ # If there are any existing points for this trace then delete them
+ Tracepoint.where(:trace => id).delete_all
+
+ gpx.points.each_slice(1_000) do |points|
+ # Gather the trace points together for a bulk import
+ tracepoints = []
+
+ points.each do |point|
+ if first
+ f_lat = point.latitude
+ f_lon = point.longitude
+ first = false
+ end
+
+ tp = Tracepoint.new
+ tp.lat = point.latitude
+ tp.lon = point.longitude
+ tp.altitude = point.altitude
+ tp.timestamp = point.timestamp
+ tp.gpx_id = id
+ tp.trackid = point.segment
+ tracepoints << tp
+ end
+
+ # Run the before_save and before_create callbacks, and then import them in bulk with activerecord-import
+ tracepoints.each do |tp|
+ tp.run_callbacks(:save) { false }
+ tp.run_callbacks(:create) { false }
+ end
+
+ Tracepoint.import!(tracepoints)
+ end
+
+ if gpx.actual_points.positive?
+ max_lat = Tracepoint.where(:trace => id).maximum(:latitude)
+ min_lat = Tracepoint.where(:trace => id).minimum(:latitude)
+ max_lon = Tracepoint.where(:trace => id).maximum(:longitude)
+ min_lon = Tracepoint.where(:trace => id).minimum(:longitude)
+
+ max_lat = max_lat.to_f / 10000000
+ min_lat = min_lat.to_f / 10000000
+ max_lon = max_lon.to_f / 10000000
+ min_lon = min_lon.to_f / 10000000
+
+ self.latitude = f_lat
+ self.longitude = f_lon
+ image.attach(:io => gpx.picture(min_lat, min_lon, max_lat, max_lon, gpx.actual_points), :filename => "#{id}.gif", :content_type => "image/gif")
+ icon.attach(:io => gpx.icon(min_lat, min_lon, max_lat, max_lon), :filename => "#{id}_icon.gif", :content_type => "image/gif")
+ self.size = gpx.actual_points
+ self.inserted = true
+ save!
+ end