]> git.openstreetmap.org Git - rails.git/blobdiff - lib/osm.rb
Work round ruby's half assed Tempfile class which, because for some
[rails.git] / lib / osm.rb
index aca4031ebb047e504a1e0c81ea77d96442d6fdc3..bd935102658576295b2670ca46a8b28de89e94b4 100644 (file)
@@ -1,13 +1,6 @@
+# The OSM module provides support functions for OSM.
 module OSM
 
-  # This piece of magic reads a GPX with SAX and spits out
-  # lat/lng and stuff
-  #
-  # This would print every latitude value:
-  #
-  # gpx = OSM::GPXImporter.new('somefile.gpx')
-  # gpx.points {|p| puts p['latitude']}
-
   require 'time'
   require 'rexml/parsers/sax2parser'
   require 'rexml/text'
@@ -15,11 +8,27 @@ module OSM
   require 'digest/md5'
   require 'RMagick'
 
+  # The base class for API Errors.
+  class APIError < RuntimeError
+  end
+
+  # Raised when an API object is not found.
+  class APINotFoundError < APIError
+  end
+
+  # Raised when a precondition to an API action fails sanity check.
+  class APIPreconditionFailedError < APIError
+  end
+
+  # Raised when to delete an already-deleted object.
+  class APIAlreadyDeletedError < APIError
+  end
+
+  # Helper methods for going to/from mercator and lat/lng.
   class Mercator
     include Math
 
     #init me with your bounding box and the size of your image
-
     def initialize(min_lat, min_lon, max_lat, max_lon, width, height)
       xsize = xsheet(max_lon) - xsheet(min_lon)
       ysize = ysheet(max_lat) - ysheet(min_lat)
@@ -62,14 +71,21 @@ module OSM
   end
 
 
+  # This piece of magic reads a GPX with SAX and spits out
+  # lat/lng and stuff
+  #
+  # This would print every latitude value:
+  #
+  # gpx = OSM::GPXImporter.new('somefile.gpx')
+  # gpx.points {|p| puts p['latitude']}
   class GPXImporter
     # FIXME swap REXML for libXML
     attr_reader :possible_points
     attr_reader :actual_points
     attr_reader :tracksegs
 
-    def initialize(filename)
-      @filename = filename
+    def initialize(file)
+      @file = file
     end
 
     def points
@@ -85,7 +101,9 @@ module OSM
       gotele = false
       gotdate = false
 
-      parser = REXML::Parsers::SAX2Parser.new(File.new(@filename))
+      @file.rewind
+
+      parser = REXML::Parsers::SAX2Parser.new(@file)
 
       parser.listen( :start_element,  %w{ trkpt }) do |uri,localname,qname,attributes| 
         lat = attributes['lat'].to_f
@@ -277,7 +295,7 @@ module OSM
     def initialize(feed_title='OpenStreetMap GPS Traces', feed_description='OpenStreetMap GPS Traces', feed_url='http://www.openstreetmap.org/traces/')
       @doc = XML::Document.new
       @doc.encoding = 'UTF-8' 
-      
+
       rss = XML::Node.new 'rss'
       @doc.root = rss
       rss['version'] = "2.0"
@@ -422,4 +440,6 @@ module OSM
 
     return "#{tilesql} AND #{prefix}latitude BETWEEN #{minlat} AND #{maxlat} AND #{prefix}longitude BETWEEN #{minlon} AND #{maxlon}"
   end
+
+
 end