Class: Geokit::Geocoders::OpencageGeocoder

Inherits:
Geocoder show all
Defined in:
lib/geokit/geocoders/opencage.rb

Overview

OpenCage geocoder implementation. Requires the Geokit::Geocoders::OpencageGeocoder.key variable to contain an API key. Conforms to the interface set by the Geocoder class.

Class Method Summary collapse

Methods inherited from Geocoder

call_geocoder_service, config, do_get, geocode, inherited, logger, net_adapter, new_loc, parse, process, protocol, provider_name, reverse_geocode, set_mappings, use_https?

Class Method Details

.do_geocode(address, options = {}) ⇒ Object

Template method which does the geocode lookup.



12
13
14
15
16
17
18
19
20
21
22
23
# 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) ⇒ Object

Template method which does the reverse-geocode lookup.



25
26
27
28
29
30
# 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) ⇒ Object



62
63
64
65
66
67
68
69
70
# 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) ⇒ Object



40
41
42
# 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) ⇒ Object



32
33
34
# 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) ⇒ Object



36
37
38
# 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) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# 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) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# 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.county         = address_data['county']
  loc.city           = address_data['city']
  loc.city           = address_data['town'] if loc.city.nil? && address_data['town']
  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.neighborhood   = address_data['neighbourhood']
  loc.neighborhood   = address_data['suburb'] if loc.neighborhood.nil?
  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) ⇒ Object



91
92
93
94
# File 'lib/geokit/geocoders/opencage.rb', line 91

def self.set_precision(result_json, loc)
  # a value between 1 (worse) and 10 (best). 0 means unknown
  loc.precision = result_json['confidence']
end