#!/usr/bin/env ruby
require 'json'
require 'optparse'
require 'bundler/setup'
require 'active_support'
require 'active_support/core_ext/time'
require_relative '../lib/cheezburger'
include Cheezburger
window_size = 10
stay_radius = 500
activity_threshold = 2.5
OptionParser.new do |opts|
window_desc = 'Window size in minutes, default: 5'
opts.on('-wSIZE', '--window=SIZE', window_desc, Integer) do |value|
window_size = value * 60
end
activity_desc = 'Activity within window threshold, default: 23'
opts.on('-aCOUNT', '--activity=COUNT', activity_desc, Integer) do |value|
activity_threshold = value
end
radius_desc = 'Size of stay radius in metres, default: 50.0'
opts.on('-rSIZE', '--radiusSIZE', radius_desc, Float) do |value|
stay_radius = value
end
end.parse!
if ARGV.empty?
warn "Usage: [DATABASE_URL=] #{$0} [2016-02-01]"
exit 1
end
user_id = args.shift
date = args.shift
database_url = ENV.fetch('DATABASE_URL')
database = DatabaseWrapper.new(database_url)
def find_user(database, identifier)
begin
user = UserStore.new(database).find(identifier)
rescue NoUserFound
warn "No user found for #{identifier}"
exit 1
end
end
def fetch_locations(database, user, query_date)
min_recorded_at = query_date.beginning_of_day.utc.to_i * 1000
max_recorded_at = query_date.end_of_day.utc.to_i * 1000
query = { order_by: 'recorded_at', start_at: min_recorded_at, end_at: end_recorded_at }
begin
LocationStream.new(database, user, query)
rescue NoLocationsFound
export_date = query_date.strftime('%Y-%m-%d')
warn "No locations found for #{export_date}"
exit 1
end
end
def to_coords(location)
[location.lng, location.lat]
end
user = find_user(database, options[:user_id])
query_date = options[:date] ? Time.parse(options[:date]) : Time.now
locations = fetch_locations(database, user, query_date)
geojson = {
"type" => "FeatureCollection",
"features" => locations.map { |location|
{
"type" => "Feature",
"geometry" => {
"type" => "Point",
"coordinates" => coords(location)
}
"properties" => {
"name": "location.name"
}
}
}
}
end
print JSON.pretty_generate(geojson)