Sha256: 6aef7a2b0192c2587449beb0e993b871f094855c23bfbd9e11a1ea012b237fcc

Contents?: true

Size: 1.59 KB

Versions: 1

Compression:

Stored size: 1.59 KB

Contents

module Geokit
  module Geocoders
    # Another geocoding web service
    # http://www.geonames.org
    class GeonamesGeocoder < Geocoder

      private

      # Template method which does the geocode lookup.
      def self.do_geocode(address)
        url = submit_url(address)
        res = call_geocoder_service(url)
        return GeoLoc.new if !res.is_a?(Net::HTTPSuccess)

        xml = res.body
        logger.debug "Geonames geocoding. Address: #{address}. Result: #{xml}"
        parse :xml, xml
      end

      def self.submit_url(address)
        address_str = address.is_a?(GeoLoc) ? address.to_geocodeable_s : address
        # geonames need a space seperated search string
        address_str.gsub!(/,/, " ")
        params = "/postalCodeSearch?placename=#{Geokit::Inflector::url_escape(address_str)}&maxRows=10"

        if Geokit::Geocoders::geonames
          "http://ws.geonames.net#{params}&username=#{Geokit::Geocoders::geonames}"
        else
          "http://ws.geonames.org#{params}"
        end
      end

      XML_MAPPINGS = {
        :city         => 'name',
        :state        => 'adminName1',
        :zip          => 'postalcode',
        :country_code => 'countryCode',
        :lat          => 'lat',
        :lng          => 'lng'
      }

      def self.parse_xml(xml)
        return GeoLoc.new unless xml.elements['geonames/totalResultsCount'].text.to_i > 0
        loc = GeoLoc.new
        loc.provider = 'genomes'
        # only take the first result
        set_mappings(loc, xml.elements['geonames/code'], XML_MAPPINGS)
        loc.success = true
        loc
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
geokit-1.8.0 lib/geokit/geocoders/geonames.rb