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