class Geokit::Geocoders::OpencageGeocoder
OpenCage geocoder implementation. Requires the Geokit::Geocoders::OpencageGeocoder.key variable to contain an API key. Conforms to the interface set by the Geocoder class.
Private Class Methods
do_geocode(address, options = {})
click to toggle source
Template method which does the geocode lookup.
# File lib/geokit/geocoders/opencage.rb, line 12 def self.do_geocode(address, options = {}) options_str = generate_param_for_option(:language, options) options_str << generate_param_for_option(:bounds, options) options_str << generate_param_for_option(:min_confidence, options) address_str = address.is_a?(GeoLoc) ? address.to_geocodeable_s : address url = "#{protocol}://api.opencagedata.com/geocode/v1/json?" url += "key=#{key}#{options_str}&" url += "query=#{Geokit::Inflector.url_escape(address_str)}&" url += "no_annotations=1" process :json, url end
do_reverse_geocode(latlng)
click to toggle source
Template method which does the reverse-geocode lookup.
# File lib/geokit/geocoders/opencage.rb, line 25 def self.do_reverse_geocode(latlng) latlng = LatLng.normalize(latlng) url = "#{protocol}://api.opencagedata.com/geocode/v1/json?" url += "key=#{key}&query=#{latlng.lat},#{latlng.lng}" process :json, url end
extract_geoloc(result_json)
click to toggle source
# File lib/geokit/geocoders/opencage.rb, line 62 def self.extract_geoloc(result_json) loc = new_loc loc.lat = result_json["geometry"]["lat"] loc.lng = result_json["geometry"]["lng"] set_address_components(result_json["components"], loc) set_precision(result_json, loc) loc.success = true loc end
generate_bool_param_for_option(param, options)
click to toggle source
# File lib/geokit/geocoders/opencage.rb, line 40 def self.generate_bool_param_for_option(param, options) options[param] ? "&#{param}=1" : "&#{param}=0" end
generate_param_for(param, value)
click to toggle source
# File lib/geokit/geocoders/opencage.rb, line 32 def self.generate_param_for(param, value) "&#{param}=#{Geokit::Inflector.url_escape(value.to_s)}" end
generate_param_for_option(param, options)
click to toggle source
# File lib/geokit/geocoders/opencage.rb, line 36 def self.generate_param_for_option(param, options) options[param] ? "&#{param}=#{Geokit::Inflector.url_escape(options[param])}" : "" end
parse_json(results)
click to toggle source
# File lib/geokit/geocoders/opencage.rb, line 44 def self.parse_json(results) return GeoLoc.new if results.empty? if results.is_a?(Hash) return GeoLoc.new unless results["status"]["message"] == "OK" end loc = nil results["results"].each do |result| extracted_geoloc = extract_geoloc(result) if loc.nil? loc = extracted_geoloc else loc.all.push(extracted_geoloc) end end loc end
set_address_components(address_data, loc)
click to toggle source
# File lib/geokit/geocoders/opencage.rb, line 72 def self.set_address_components(address_data, loc) return unless address_data loc.country = address_data["country"] loc.country_code = address_data["country_code"].upcase if address_data["country_code"] loc.state_name = address_data["state"] loc.city = address_data["city"] loc.city = address_data["county"] if loc.city.nil? && address_data["county"] loc.zip = address_data["postcode"] loc.district = address_data["city_district"] loc.district = address_data["state_district"] if loc.district.nil? && address_data["state_district"] loc.street_address = "#{address_data['road']} #{address_data['house_number']}".strip if address_data["road"] loc.street_name = address_data["road"] loc.street_number = address_data["house_number"] end
set_precision(result_json, loc)
click to toggle source
# File lib/geokit/geocoders/opencage.rb, line 87 def self.set_precision(result_json, loc) # a value between 1 (worse) and 10 (best). 0 means unknown loc.precision = result_json["confidence"] end