+ ##
+ # raised when an API call takes too long
+ class APITimeoutError < APIError
+ def status
+ :request_timeout
+ end
+
+ def to_s
+ "Request timed out"
+ end
+ end
+
+ ##
+ # raised when someone tries to redact a current version of
+ # an element - only historical versions can be redacted.
+ class APICannotRedactError < APIError
+ def status
+ :bad_request
+ end
+
+ def to_s
+ "Cannot redact current version of element, only historical versions may be redacted."
+ end
+ 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)
+ xscale = xsize / width
+ yscale = ysize / height
+ scale = [xscale, yscale].max
+
+ xpad = width * scale - xsize
+ ypad = height * scale - ysize
+
+ @width = width
+ @height = height
+
+ @tx = xsheet(min_lon) - xpad / 2
+ @ty = ysheet(min_lat) - ypad / 2