Skip to content
Snippets Groups Projects
yandex.rb 2.59 KiB
require 'geocoder/results/base'

module Geocoder::Result
  class Yandex < Base

    def coordinates
      @data['GeoObject']['Point']['pos'].split(' ').reverse.map(&:to_f)
    end

    def address(format = :full)
      @data['GeoObject']['metaDataProperty']['GeocoderMetaData']['text']
    end

    def city
      if state.empty? and address_details and address_details.has_key? 'Locality'
        address_details['Locality']['LocalityName']
      elsif sub_state.empty? and address_details and address_details.has_key? 'AdministrativeArea' and
          address_details['AdministrativeArea'].has_key? 'Locality'
        address_details['AdministrativeArea']['Locality']['LocalityName']
      elsif not sub_state_city.empty?
        sub_state_city
      else
        ""
      end
    end

    def country
      if address_details
        address_details['CountryName']
      else
        ""
      end
    end

    def country_code
      if address_details
        address_details['CountryNameCode']
      else
        ""
      end
    end

    def state
      if address_details and address_details['AdministrativeArea']
        address_details['AdministrativeArea']['AdministrativeAreaName']
      else
        ""
      end
    end

    def sub_state
      if !state.empty? and address_details and address_details['AdministrativeArea']['SubAdministrativeArea']
        address_details['AdministrativeArea']['SubAdministrativeArea']['SubAdministrativeAreaName']
      else
        ""
      end
    end

    def state_code
      ""
    end

    def postal_code
      ""
    end

    def premise_name
      address_details['Locality']['Premise']['PremiseName']
    end
    def kind
      @data['GeoObject']['metaDataProperty']['GeocoderMetaData']['kind']
    end

    def precision
      @data['GeoObject']['metaDataProperty']['GeocoderMetaData']['precision']
    end

    def viewport
      envelope = @data['GeoObject']['boundedBy']['Envelope'] || fail
      east, north = envelope['upperCorner'].split(' ').map(&:to_f)
      west, south = envelope['lowerCorner'].split(' ').map(&:to_f)
      [south, west, north, east]
    end

    private # ----------------------------------------------------------------

    def address_details
      @data['GeoObject']['metaDataProperty']['GeocoderMetaData']['AddressDetails']['Country']
    end

    def sub_state_city
      if !sub_state.empty? and address_details and address_details['AdministrativeArea']['SubAdministrativeArea'].has_key? 'Locality'
        address_details['AdministrativeArea']['SubAdministrativeArea']['Locality']['LocalityName'] || ""
      else
        ""
      end
    end
  end
end