class Overhelper

Constants

EARTH_RADIUS_IN_M

Public Class Methods

convert_to_ways(json_string) click to toggle source
# File lib/overhelper.rb, line 54
def self.convert_to_ways(json_string)
  data = JSON.parse(json_string)

  node_library = nodes_to_dict(data)

  ways = []
  data["elements"].each do |element|
    next unless element["type"] == "way"

    nodes_of_way = element["nodes"]
    prev_node = nil
    nodes_of_way.each do |node|
      unless prev_node.nil?
        way = {}
        way[:lat1] = (node_library[prev_node])[:lat]
        way[:lon1] = (node_library[prev_node])[:lon]
        way[:lat2] = (node_library[node])[:lat]
        way[:lon2] = (node_library[node])[:lon]
        ways << way
      end
      prev_node = node
    end
  end

  return ways
end
distance_in_m(lat1, lon1, lat2, lon2) click to toggle source
# File lib/overhelper.rb, line 19
  def self.distance_in_m(lat1, lon1, lat2, lon2)
=begin
  * Computes distance between two points on Earth using Haversine formula
  * Earth is assumed to be sphere, errors from assuming spherical geometry might be up to 0.55% crossing the equator
  * source: https://en.wikipedia.org/wiki/Haversine_formula and http://www.movable-type.co.uk/scripts/latlong.html
=end
    lat1 = lat1 * Math::PI / 180
    lon1 = lon1 * Math::PI / 180
    lat2 = lat2 * Math::PI / 180
    lon2 = lon2 * Math::PI / 180

    dLat = (lat2 - lat1).abs
    dLon = (lon2 - lon1).abs

    # a: square of half the chord length between the points
    a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
    a += Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat2) * Math.cos(lat1)
    angularDistanceInRadians = Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))
    delta_in_m = 2 * EARTH_RADIUS_IN_M * angularDistanceInRadians
    return delta_in_m
  end
list_of_locations_from_overpass_into_array(list, data = []) click to toggle source
# File lib/overhelper.rb, line 8
def self.list_of_locations_from_overpass_into_array(list, data = [])
  list.split(/[\n]+/m).each do |element|
    element = Hash[[:lat, :lon].zip(element.split(/[\s]+/m))]
    element[:lat] = element[:lat].to_f
    element[:lon] = element[:lon].to_f
    data << element
  end
  return data
end
nodes_to_dict(data) click to toggle source
# File lib/overhelper.rb, line 41
def self.nodes_to_dict(data)
  node_library = {}
  data["elements"].each do |element|
    next unless element["type"] == "node"

    saved = {}
    saved[:lat] = element["lat"].to_f
    saved[:lon] = element["lon"].to_f
    node_library[element["id"]] = saved
  end
  return node_library
end