class Geokit::Geocoders::MapboxGeocoder

Mapbox geocoder implementation. Requires the Geokit::Geocoders::MapboxGeocoder:key variable to contain a Mapbox access token. Conforms to the interface set by the Geocoder class.

Constants

PRECISION_VALUES

Private Class Methods

do_geocode(address, _options = nil) click to toggle source

Template method which does the geocode lookup.

# File lib/geokit/geocoders/mapbox.rb, line 20
def self.do_geocode(address, _options = nil)
  address_str = address.is_a?(GeoLoc) ? address.to_geocodeable_s : address
  url =  "#{protocol}://api.tiles.mapbox.com/v4/geocode/mapbox.places-v1/"
  url += "#{Geokit::Inflector.url_escape(address_str)}.json?access_token=#{key}"
  process :json, url
end
do_reverse_geocode(latlng, _options = nil) click to toggle source

Template method which does the reverse-geocode lookup.

# File lib/geokit/geocoders/mapbox.rb, line 12
def self.do_reverse_geocode(latlng, _options = nil)
  latlng = LatLng.normalize(latlng)
  url =  "#{protocol}://api.tiles.mapbox.com/v4/geocode/mapbox.places-v1/"
  url += "#{latlng.lng},#{latlng.lat}.json?access_token=#{key}"
  process :json, url
end
extract_geoloc(result_json) click to toggle source
# File lib/geokit/geocoders/mapbox.rb, line 41
def self.extract_geoloc(result_json)
  loc = new_loc
  loc.lng = result_json['center'][0]
  loc.lat = result_json['center'][1]
  set_address_components(result_json, loc)
  set_precision(loc)
  set_bounds(result_json['bbox'], loc)
  loc.success = true
  loc
end
parse_json(results) click to toggle source
# File lib/geokit/geocoders/mapbox.rb, line 27
def self.parse_json(results)
  return GeoLoc.new unless results['features'].count > 0
  loc = nil
  results['features'].each do |feature|
    extracted_geoloc = extract_geoloc(feature)
    if loc.nil?
      loc = extracted_geoloc
    else
      loc.all.push(extracted_geoloc)
    end
  end
  loc
end
set_address_components(result_json, loc) click to toggle source
# File lib/geokit/geocoders/mapbox.rb, line 52
def self.set_address_components(result_json, loc)
  if result_json['context']
    result_json['context'].each do |context|
      if context['id'] =~ /^country\./
        loc.country = context['text']
      elsif context['id'] =~ /^province\./
        loc.state = context['text']
      elsif context['id'] =~ /^city\./
        loc.city = context['text']
      elsif context['id'] =~ /^postcode/
        loc.zip = context['text']
      end
    end
    loc.country = loc.country_code if loc.country_code && !loc.country
  end
  if result_json['place_name']
    loc.full_address = result_json['place_name']
  end
  if !loc.city && result_json['id'] =~ /^city\./
    loc.city = result_json['text']
  end
  if !loc.state && result_json['id'] =~ /^province\./
    loc.state = result_json['text']
  end
end
set_bounds(bounds, loc) click to toggle source
# File lib/geokit/geocoders/mapbox.rb, line 87
def self.set_bounds(bounds, loc)
  if bounds
    loc.suggested_bounds = Bounds.normalize([bounds[1], bounds[0]], [bounds[3], bounds[2]])
  end
end
set_precision(loc) click to toggle source
# File lib/geokit/geocoders/mapbox.rb, line 80
def self.set_precision(loc)
  PRECISION_VALUES.each do |precision|
    break unless loc.send(precision) && loc.send(precision).length
    loc.precision = precision
  end
end