class PHLGeocode
Attributes
address_key_response[RW]
coordinates_response[RW]
last_queried_address_key_addr[RW]
last_queried_coordinates_addr[RW]
settings[RW]
Public Class Methods
new(options={})
click to toggle source
# File lib/phl_geocode.rb, line 12 def initialize(options={}) @settings = { :min_confidence => 85, :api_base => "http://services.phila.gov", :location_path => "/ULRS311/Data/Location/", :address_key_path => "/ULRS311/Data/LIAddressKey/" }.merge(options) end
Public Instance Methods
get_address_key(address=nil)
click to toggle source
# File lib/phl_geocode.rb, line 34 def get_address_key(address=nil) raise ArgumentError("Argument must be a string") unless address.is_a? String if address == @last_queried_address_key_addr @address_key_response ||= call_api('address_key', address) else @address_key_response = call_api('address_key', address) @last_queried_address_key_addr = address end parse_address_key @address_key_response end
get_coordinates(address=nil)
click to toggle source
# File lib/phl_geocode.rb, line 21 def get_coordinates(address=nil) raise ArgumentError("Argument must be a string") unless address.is_a? String if address == @last_queried_coordinates_addr @coordinates_response ||= call_api('coordinates', address) else @coordinates_response = call_api('coordinates', address) @last_queried_coordinates_addr = address end parse_locations @coordinates_response end
Private Instance Methods
call_api(type, address)
click to toggle source
# File lib/phl_geocode.rb, line 74 def call_api(type, address) addr = URI::encode(address) type_path_map = { :coordinates => @settings[:location_path], :address_key => @settings[:address_key_path] } Net::HTTP.get_response(URI.parse("#{@settings[:api_base]}#{type_path_map[type.to_sym]}#{addr}")) end
parse_address_key(response)
click to toggle source
# File lib/phl_geocode.rb, line 48 def parse_address_key(response) key_json = JSON.parse(response.body) { :agency_id => key_json["AgencyID"], :topic_name => key_json["TopicName"], :topic_id => key_json["TopicID"], :address_ref => key_json["AddressRef"] } end
parse_locations(response)
click to toggle source
# File lib/phl_geocode.rb, line 59 def parse_locations(response) locations_json = JSON.parse(response.body)["Locations"] locations_json.find_all { |loc| loc["Address"]["Similarity"] >= @settings[:min_confidence] }.map { |item| { :address => item["Address"]["StandardizedAddress"], :similarity => item["Address"]["Similarity"], :latitude => item["YCoord"], :longitude => item["XCoord"] } } end