lib/geocoder/results/geoapify.rb
# frozen_string_literal: true
require 'geocoder/results/base'
module Geocoder
module Result
# https://apidocs.geoapify.com/docs/geocoding/api
class Geoapify < Base
def address(_format = :full)
properties['formatted']
end
def address_line1
properties['address_line1']
end
def address_line2
properties['address_line2']
end
def house_number
properties['housenumber']
end
def street
properties['street']
end
def postal_code
properties['postcode']
end
def district
properties['district']
end
def suburb
properties['suburb']
end
def city
properties['city']
end
def county
properties['county']
end
def state
properties['state']
end
# Not currently available in the API
def state_code
''
end
def country
properties['country']
end
def country_code
return unless properties['country_code']
properties['country_code'].upcase
end
def coordinates
return unless properties['lat']
return unless properties['lon']
[properties['lat'], properties['lon']]
end
# See: https://tools.ietf.org/html/rfc7946#section-3.1
#
# Each feature has a "Point" type in the Geoapify API.
def geometry
return unless data['geometry']
symbol_hash data['geometry']
end
# See: https://tools.ietf.org/html/rfc7946#section-5
def bounds
data['bbox']
end
# Type of the result, one of:
#
# * :unknown
# * :amenity
# * :building
# * :street
# * :suburb
# * :district
# * :postcode
# * :city
# * :county
# * :state
# * :country
#
def type
return :unknown unless properties['result_type']
properties['result_type'].to_sym
end
# Distance in meters to given bias:proximity or to given coordinates for
# reverse geocoding
def distance
properties['distance']
end
# Calculated rank for the result, containing the following keys:
#
# * `popularity` - The popularity score of the result
# * `confidence` - The confidence value of the result (0-1)
# * `match_type` - The result's match type, one of following:
# * full_match
# * inner_part
# * match_by_building
# * match_by_street
# * match_by_postcode
# * match_by_city_or_disrict
# * match_by_country_or_state
#
# Example:
# {
# popularity: 8.615793062435909,
# confidence: 0.88,
# match_type: :full_match
# }
def rank
return unless properties['rank']
r = symbol_hash(properties['rank'])
r[:match_type] = r[:match_type].to_sym if r[:match_type]
r
end
# Examples:
#
# Open
# {
# sourcename: 'openstreetmap',
# wheelchair: 'limited',
# wikidata: 'Q186125',
# wikipedia: 'en:Madison Square Garden',
# website: 'http://www.thegarden.com/',
# phone: '12124656741',
# osm_type: 'W',
# osm_id: 138141251,
# continent: 'North America',
# }
def datasource
return unless properties['datasource']
symbol_hash properties['datasource']
end
private
def properties
@properties ||= data['properties'] || {}
end
def symbol_hash(orig_hash)
{}.tap do |result|
orig_hash.each_key do |key|
next unless orig_hash[key]
result[key.to_sym] = orig_hash[key]
end
end
end
end
end
end