From a14ebfc544d43a84d35a48a1cd6f5c7a4f2184ff Mon Sep 17 00:00:00 2001 From: Marc Seeger Date: Mon, 15 Feb 2010 11:25:06 +0100 Subject: [PATCH] changed dir structure a bit --- models/gpx_file.rb | 4 +- models/lib/geo.rb | 61 ----- models/lib/gmap_polyline_encoder.rb | 394 ---------------------------- parser/gpx_parser.rb | 55 ---- public/images/logo.png | Bin 16891 -> 14571 bytes 5 files changed, 2 insertions(+), 512 deletions(-) delete mode 100644 models/lib/geo.rb delete mode 100644 models/lib/gmap_polyline_encoder.rb delete mode 100644 parser/gpx_parser.rb diff --git a/models/gpx_file.rb b/models/gpx_file.rb index 7924a7c..f9fd38b 100644 --- a/models/gpx_file.rb +++ b/models/gpx_file.rb @@ -1,8 +1,8 @@ class GPX_file require "hpricot" require "time" - require "models/lib/geo.rb" - require "models/lib/gmap_polyline_encoder.rb" + require "lib/geo.rb" + require "lib/gmap_polyline_encoder.rb" attr_accessor :filename, :speed_avg, :elevation_min, :elevation_max, :polyline, :time_start, :time_end, :duration, :distance, :polyline, :startingpoint def initialize(path_to_file) diff --git a/models/lib/geo.rb b/models/lib/geo.rb deleted file mode 100644 index a5f3745..0000000 --- a/models/lib/geo.rb +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env ruby -=begin - Andrew Turner, ruby distance calculation - Copyright (C) 2005 Andrew Turner - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Please send patches / bug reports to andrew@highearthorbit.com - -=end - - -class Geo - def deg2rad(deg) - (deg * Math::PI / 180) - end - - def rad2deg(rad) - (rad * 180 / Math::PI) - end - - def abs(x) - if x >= 0 - x - else - -x - end - end - - def acos(rad) - Math.atan2(Math.sqrt(abs(1 - rad**2)), rad) - end - - def distance_in_km(lat1, lon1, lat2, lon2) - theta = lon1 - lon2 - - dist = Math.sin(self.deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(self.deg2rad(lat1)) * Math.cos(self.deg2rad(lat2)) * Math.cos(deg2rad(theta)) - - dist = self.rad2deg(self.acos(dist)) - - (dist * 60.0 * 1.1515 * 1.609344) #distance in km - end - - def distance_in_m(lat1, lon1, lat2, lon2) - distance_in_km(lat1, lon1, lat2, lon2) * 1000 - end - - -end \ No newline at end of file diff --git a/models/lib/gmap_polyline_encoder.rb b/models/lib/gmap_polyline_encoder.rb deleted file mode 100644 index 1f31c20..0000000 --- a/models/lib/gmap_polyline_encoder.rb +++ /dev/null @@ -1,394 +0,0 @@ -#-- -# -# Utility for creating Google Maps Encoded GPolylines -# -# License: You may distribute this code under the same terms as Ruby itself -# -# Author: Joel Rosenberg -# -# ( Drawing from the official example pages as well as Mark McClure's work ) -# -# == Example -# -# data = [ -# [ 37.4419, -122.1419], -# [ 37.4519, -122.1519], -# [ 37.4619, -122.1819], -# ] -# -# encoder = GMapPolylineEncoder.new() -# result = encoder.encode( data ) -# -# javascript << " var myLine = new GPolyline.fromEncoded({\n" -# javascript << " color: \"#FF0000\",\n" -# javascript << " weight: 10,\n" -# javascript << " opacity: 0.5,\n" -# javascript << " zoomFactor: #{result[:zoomFactor]},\n" -# javascript << " numLevels: #{result[:numLevels]},\n" -# javascript << " points: \"#{result[:points]}\",\n" -# javascript << " levels: \"#{result[:levels]}\"\n" -# javascript << " });" -# -# == Methods -# -# Constructor args (all optional): -# :numLevels (default 18) -# :zoomFactor (default 2) -# :reduce: Reduce points (default true) -# :escape: Escape backslashes (default true) -# -# encode( points ) method -# points (required): array of longitude, latitude pairs -# -# returns hash with keys :points, :levels, :zoomFactor, :numLevels -# -# == Background -# -# Description: http://www.google.com/apis/maps/documentation/#Encoded_Polylines -# API: http://www.google.com/apis/maps/documentation/reference.html#GPolyline -# Hints: http://www.google.com/apis/maps/documentation/polylinealgorithm.html -# -# Example Javascript for instantiating an encoded polyline: -# var encodedPolyline = new GPolyline.fromEncoded({ -# color: "#FF0000", -# weight: 10, -# points: "yzocFzynhVq}@n}@o}@nzD", -# levels: "BBB", -# zoomFactor: 32, -# numLevels: 4 -# }); -# -# == Changes -# -# 08.14.2007 - Release 0.2 -# Doug Fales pointed out a null pointer exception bug in the zoom -# factor implementation -# -# 06.29.2007 - Release 0.1 -# Profiling showed that distance() accounted for 50% of the time when -# processing McClure's British coast data. By moving the distance -# calculation into encode(), we can cache a few of the calculations -# (magnitude) and eliminate the overhead of the function call. This -# reduced the time to encode by ~ 30% -# -# 06.21.2007 Implementing the Doublas-Peucker algorithm for removing superflous -# points as per Mark McClure's design: -# http://facstaff.unca.edu/mcmcclur/GoogleMaps/EncodePolyline/ -# -# 10.14.2006 Cleaned up (and finally grasped) zoom levels -# -# 09.2006 First port of the official example's javascript. Ignoring zoom -# levels for now, showing points at all zoom levels -# -#++ - -class GMapPolylineEncoder - attr_accessor :reduce, :escape #zoomFactor and numLevels need side effects - attr_reader :zoomFactor, :numLevels - - # The minimum distance from the line that a point must exceed to avoid - # elimination under the DP Algorithm. - @@dp_threshold = 0.00001 - - def initialize(options = {}) - # There are no required parameters - - # Nice defaults - @numLevels = options.has_key?(:numLevels) ? options[:numLevels] : 18 - @zoomFactor = options.has_key?(:zoomFactor) ? options[:zoomFactor] : 2 - - # Calculate the distance thresholds for each zoom level - calculate_zoom_breaks() - - # By default we'll simplify the polyline unless told otherwise - @reduce = ! options.has_key?(:reduce) ? true : options[:reduce] - - # Escape by default; most people are using this in a web context - @escape = ! options.has_key?(:escape) ? true : options[:escape] - - end - - def numLevels=( new_num_levels ) - @numLevels = new_num_levels - # We need to recalculate our zoom breaks - calculate_zoom_breaks() - end - - def zoomFactor=( new_zoom_factor ) - @zoomFactor = new_zoom_factor - # We need to recalculate our zoom breaks - calculate_zoom_breaks() - end - - def encode( points ) - - # - # This is an implementation of the Douglas-Peucker algorithm for simplifying - # a line. You can thing of it as an elimination of points that do not - # deviate enough from a vector. That threshold for point elimination is in - # @@dp_threshold. See - # - # http://everything2.com/index.pl?node_id=859282 - # - # for an explanation of the algorithm - # - - max_dist = 0 # Greatest distance we measured during the run - stack = [] - distances = Array.new(points.size) - - if(points.length > 2) - stack << [0, points.size-1] - - while(stack.length > 0) - current_line = stack.pop() - p1_idx = current_line[0] - pn_idx = current_line[1] - pb_dist = 0 - pb_idx = nil - - x1 = points[p1_idx][0] - y1 = points[p1_idx][1] - x2 = points[pn_idx][0] - y2 = points[pn_idx][1] - - # Caching the line's magnitude for performance - magnitude = Math.sqrt((x2 - x1)**2 + (y2 - y1)**2) - magnitude_squared = magnitude ** 2 - - # Find the farthest point and its distance from the line between our pair - for i in (p1_idx+1)..(pn_idx-1) - - # Refactoring distance computation inline for performance - #current_distance = compute_distance(points[i], points[p1_idx], points[pn_idx]) - - # - # This uses Euclidian geometry. It shouldn't be that big of a deal since - # we're using it as a rough comparison for line elimination and zoom - # calculation. - # - # TODO: Implement Haversine functions which would probably bring this to - # a snail's pace (ehhhh) - # - - px = points[i][0] - py = points[i][1] - - current_distance = nil - - if( magnitude == 0 ) - # The line is really just a point - current_distance = Math.sqrt((x2-px)**2 + (y2-py)**2) - else - - u = (((px - x1) * (x2 - x1)) + ((py - y1) * (y2 - y1))) / magnitude_squared - - if( u <= 0 || u > 1 ) - # The point is closest to an endpoint. Find out which one - ix = Math.sqrt((x1 - px)**2 + (y1 - py)**2) - iy = Math.sqrt((x2 - px)**2 + (y2 - py)**2) - if( ix > iy ) - current_distance = iy - else - current_distance = ix - end - else - # The perpendicular point intersects the line - ix = x1 + u * (x2 - x1) - iy = y1 + u * (y2 - y1) - current_distance = Math.sqrt((ix - px)**2 + (iy - py)**2) - end - end - - # See if this distance is the greatest for this segment so far - if(current_distance > pb_dist) - pb_dist = current_distance - pb_idx = i - end - end - - # See if this is the greatest distance for all points - if(pb_dist > max_dist) - max_dist = pb_dist - end - - if(pb_dist > @@dp_threshold) - # Our point, Pb, that had the greatest distance from the line, is also - # greater than our threshold. Process again using Pb as a new - # start/end point. Record this distance - we'll use it later when - # creating zoom values - distances[pb_idx] = pb_dist - stack << [p1_idx, pb_idx] - stack << [pb_idx, pn_idx] - end - - end - end - - # Force line endpoints to be included (sloppy, but faster than checking for - # endpoints in encode_points()) - distances[0] = max_dist - distances[distances.length-1] = max_dist - - # Create Base64 encoded strings for our points and zoom levels - points_enc = encode_points( points, distances) - levels_enc = encode_levels( points, distances, max_dist) - - # Make points_enc an escaped string if desired. - # We should escape the levels too, in case google pulls a switcheroo - @escape && points_enc && points_enc.gsub!( /\\/, '\\\\\\\\' ) - - - # Returning a hash. Yes, I am a Perl programmer - return { - :points => points_enc, - :levels => levels_enc, - :zoomFactor => @zoomFactor, - :numLevels => @numLevels, - } - - end - - private - - def calculate_zoom_breaks() - # Calculate the distance thresholds for each zoom level - @zoom_level_breaks = Array.new(@numLevels); - - for i in 0..(@numLevels-1) - @zoom_level_breaks[i] = @@dp_threshold * (@zoomFactor ** ( @numLevels-i-1)); - end - - return - end - - def encode_points( points, distances ) - encoded = "" - - plat = 0 - plon = 0 - - #points.each do |point| # Gah, need the distances. - for i in 0..(points.size() - 1) - if(! @reduce || distances[i] != nil ) - point = points[i] - late5 = (point[0] * 1e5).floor(); - lone5 = (point[1] * 1e5).floor(); - - dlat = late5 - plat - dlon = lone5 - plon - - plat = late5; - plon = lone5; - - # I used to need this for some reason - #encoded << encodeSignedNumber(Fixnum.induced_from(dlat)).to_s - #encoded << encodeSignedNumber(Fixnum.induced_from(dlon)).to_s - encoded << encodeSignedNumber(dlat).to_s - encoded << encodeSignedNumber(dlon).to_s - end - end - - return encoded - - end - - def encode_levels( points, distances, max_dist ) - - encoded = ""; - - # Force startpoint - encoded << encodeNumber(@numLevels - 1) - - if( points.size() > 2 ) - for i in 1..(points.size() - 2) - distance = distances[i] - if( ! @reduce || distance != nil) - computed_level = 0 - - while (distance and (distance < @zoom_level_breaks[computed_level])) do - computed_level += 1 - end - - encoded << encodeNumber( @numLevels - computed_level - 1 ) - end - end - end - - # Force endpoint - encoded << encodeNumber(@numLevels - 1) - - return encoded; - - end - - def compute_distance( point, lineStart, lineEnd ) - - # - # Note: This has been refactored to encode() inline for performance and - # computation caching - # - - px = point[0] - py = point[1] - x1 = lineStart[0] - y1 = lineStart[1] - x2 = lineEnd[0] - y2 = lineEnd[1] - - distance = nil - - magnitude = Math.sqrt((x2 - x1)**2 + (y2 - y1)**2) - - if( magnitude == 0 ) - return Math.sqrt((x2-px)**2 + (y2-py)**2) - end - - u = (((px - x1) * (x2 - x1)) + ((py - y1) * (y2 - y1))) / (magnitude**2) - - if( u <= 0 || u > 1 ) - # The point is closest to an endpoint. Find out which - ix = Math.sqrt((x1 - px)**2 + (y1 - py)**2) - iy = Math.sqrt((x2 - px)**2 + (y2 - py)**2) - if( ix > iy ) - distance = iy - else - distance = ix - end - else - # The perpendicular point intersects the line - ix = x1 + u * (x2 - x1) - iy = y1 + u * (y2 - y1) - distance = Math.sqrt((ix - px)**2 + (iy - py)**2) - end - - return distance - end - - def encodeSignedNumber(num) - # Based on the official google example - - sgn_num = num << 1 - - if( num < 0 ) - sgn_num = ~(sgn_num) - end - - return encodeNumber(sgn_num) - end - - def encodeNumber(num) - # Based on the official google example - - encoded = ""; - - while (num >= 0x20) do - encoded << ((0x20 | (num & 0x1f)) + 63).chr; - num = num >> 5; - end - - encoded << (num + 63).chr; - return encoded; - end - -end \ No newline at end of file diff --git a/parser/gpx_parser.rb b/parser/gpx_parser.rb deleted file mode 100644 index 32aa489..0000000 --- a/parser/gpx_parser.rb +++ /dev/null @@ -1,55 +0,0 @@ -def parse_gpx(filehandle) - - - require "time" - - #creating our container which will be returned by the parser - my_container = Container.new - - @currently_in_trackpoint = false - @temp_stamp = nil - filehandle.each_line do |line| - - if line.include?("") - #puts "trackpoint ended" - #ok, we should by now know our time, so we simply generate a new container, copy the stuff from the old one and delete the old one - my_container._timestamps[(@temp_stamp.get_data(:time))]=@temp_stamp - @temp_stamp = nil - #and we're finished editing our trackpoint - @currently_in_trackpoint = false - end - - #USUAL DATA - if (@currently_in_trackpoint) - if line.include?("lat=") - @temp_stamp.set_data(:latitude, Float(line.split("lat=\"")[1].split('"')[0])) - end - - if line.include?("lon=") - @temp_stamp.set_data(:longitude, Float(line.split("lon=\"")[1].split('"')[0])) - end - - if line.include?("ele") - @temp_stamp.set_data(:altitude, Float(line.split("")[1].split("")[0])) - end - - if line.include?("time") - @temp_stamp.set_data(:time, Time.parse(line.split("")[0])) - end - #META DATA - if line.include?("gpxdata:hr") - @temp_stamp.set_meta(:heartrate, Integer(line.split("")[1].split("")[0])) - end - - - end - end - - - #returning my_container - my_container -end \ No newline at end of file diff --git a/public/images/logo.png b/public/images/logo.png index 79e07e632f1c7dbfb7b9a965755146ca45cd0585..31da6556ca6c1f31aeb10914a52ad2aeb4d23c6c 100644 GIT binary patch literal 14571 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 Q3-nbpQYW