class Geocoder::Lookup::Mapbox
def base_query_url(query)
def base_query_url(query) "#{protocol}://api.mapbox.com/geocoding/v5/#{dataset}/#{mapbox_search_term(query)}.json?" end
def dataset
def dataset configuration[:dataset] || "mapbox.places" end
def mapbox_search_term(query)
def mapbox_search_term(query) require 'cgi' unless defined?(CGI) && defined?(CGI.escape) if query.reverse_geocode? lat,lon = query.coordinates "#{CGI.escape lon},#{CGI.escape lat}" else # truncate at first semicolon so Mapbox doesn't go into batch mode # (see Github issue #1299) CGI.escape query.text.to_s.split(';').first.to_s end end
def name
def name "Mapbox" end
def query_url_params(query)
def query_url_params(query) {access_token: configuration.api_key}.merge(super(query)) end
def results(query)
def results(query) return [] unless data = fetch_data(query) if data['features'] sort_relevant_feature(data['features']) elsif data['message'] =~ /Invalid\sToken/ raise_error(Geocoder::InvalidApiKey, data['message']) else [] end end
def sort_relevant_feature(features)
def sort_relevant_feature(features) # Sort by descending relevance; Favor original order for equal relevance (eg occurs for reverse geocoding) features.sort_by do |feature| [feature["relevance"],-features.index(feature)] end.reverse end
def supported_protocols
def supported_protocols [:https] end