X-Git-Url: https://git.openstreetmap.org/rails.git/blobdiff_plain/40e920bd52619f549ff829296865f87f89f2fd2a..09895069c5508d5e656d938166f45755cceb7d35:/lib/osm.rb diff --git a/lib/osm.rb b/lib/osm.rb index 5be2da56a..cb23b0c97 100644 --- a/lib/osm.rb +++ b/lib/osm.rb @@ -37,7 +37,7 @@ module OSM end def status - :precondition_failed + :precondition_failed end def to_s @@ -50,13 +50,13 @@ module OSM def initialize(object = "object", object_id = "") @object, @object_id = object, object_id end - + attr_reader :object, :object_id def status :gone end - + def to_s "The #{object} with the id #{object_id} has already been deleted" end @@ -89,7 +89,7 @@ module OSM "The changeset #{@changeset.id} was closed at #{@changeset.closed_at}" end end - + # Raised when a change is expecting a changeset, but the changeset doesn't exist class APIChangesetMissingError < APIError def status @@ -116,7 +116,7 @@ module OSM "Changeset mismatch: Provided #{@provided} but only #{@allowed} is allowed" end end - + # Raised when a diff upload has an unknown action. You can only have create, # modify, or delete class APIChangesetActionInvalid < APIError @@ -127,7 +127,7 @@ module OSM def status :bad_request end - + def to_s "Unknown action #{@provided}, choices are create, modify, delete" end @@ -183,22 +183,22 @@ module OSM "Element #{@type}/#{@id} has duplicate tags with key #{@tag_key}" end end - + # Raised when a way has more than the configured number of way nodes. # This prevents ways from being to long and difficult to work with class APITooManyWayNodesError < APIError - def initialize(provided, max) - @provided, @max = provided, max + def initialize(id, provided, max) + @id, @provided, @max = id, provided, max end - - attr_reader :provided, :max + + attr_reader :id, :provided, :max def status :bad_request end - + def to_s - "You tried to add #{provided} nodes to the way, however only #{max} are allowed" + "You tried to add #{provided} nodes to way #{id}, however only #{max} are allowed" end end @@ -327,13 +327,25 @@ module OSM # get the worst case bounds for a given radius from the base position def bounds(radius) latradius = 2 * asin(sqrt(sin(radius / 6372.795 / 2) ** 2)) - lonradius = 2 * asin(sqrt(sin(radius / 6372.795 / 2) ** 2 / cos(@lat) ** 2)) + + begin + lonradius = 2 * asin(sqrt(sin(radius / 6372.795 / 2) ** 2 / cos(@lat) ** 2)) + rescue Errno::EDOM + lonradius = PI + end + minlat = (@lat - latradius) * 180 / PI maxlat = (@lat + latradius) * 180 / PI minlon = (@lon - lonradius) * 180 / PI maxlon = (@lon + lonradius) * 180 / PI + return { :minlat => minlat, :maxlat => maxlat, :minlon => minlon, :maxlon => maxlon } end + + # get the SQL to use to calculate distance + def sql_for_distance(lat_field, lon_field) + "6372.795 * 2 * asin(sqrt(power(sin((radians(#{lat_field}) - #{@lat}) / 2), 2) + cos(#{@lat}) * cos(radians(#{lat_field})) * power(sin((radians(#{lon_field}) - #{@lon})/2), 2)))" + end end class GeoRSS @@ -436,12 +448,20 @@ module OSM def self.IPLocation(ip_address) Timeout::timeout(4) do - Net::HTTP.start('api.hostip.info') do |http| - country = http.get("/country.php?ip=#{ip_address}").body - country = "GB" if country == "UK" - country = Country.find_by_code(country) - return { :minlon => country.min_lon, :minlat => country.min_lat, :maxlon => country.max_lon, :maxlat => country.max_lat } + ipinfo = Quova::IpInfo.new(ip_address) + + if ipinfo.status == Quova::Success then + country = ipinfo.country_code + else + Net::HTTP.start('api.hostip.info') do |http| + country = http.get("/country.php?ip=#{ip_address}").body + country = "GB" if country == "UK" + end end + + country = Country.find_by_code(country.upcase) + + return { :minlon => country.min_lon, :minlat => country.min_lat, :maxlon => country.max_lon, :maxlat => country.max_lat } end return nil