Transform a street address into geoloction and timezone data.


License
MIT
Install
gem install locotimezone -v 1.0.3

Documentation

Build Status

Locotimezone

Transform a street address into geoloction and timezone data. Essentially, this is an adapter for the Google Maps Time Zone API and the The Google Maps Geolocation API.

All requests to the Google APIs are done over HTTPS.

Installation

Add this line to your application's Gemfile:

gem 'locotimezone'

And then execute:

$ bundle

Or install it yourself as:

$ gem install locotimezone

Rails Usage

Setup an initializer. It might look something like this:

# config/initializers/locotimezone.rb

Locotimezone.configure do |config|
  config.google_api_key = ENV['GOOGLE_API_KEY']
end

You can use a callback to set the following attributes on your model: :latitude, :longitude, and :timezone_id. Most likely, the address data will be in stored separate fields, so create method that aggregates the address information into a single string. For more options, see detailed usage below.

# app/models/user.rb

class User < ApplicationRecord
  after_validation -> { locotime address: address } 

  def address
    [street, city, region, postal_code, country].join(' ')
  end
end

The default model attributes are :latitude, :longitude, and :timezone_id.
You can override the defaults and setup your own default attribute names in the configuration block.

# config/initializers/locotimezone.rb

Locotimezone.configure do |config|
  config.google_api_key = ENV['GOOGLE_API_KEY']
  config.attributes = {
    latitude: :lat,
    longitude: :lng,
    timezone_id: :tz_id
  }
end

Detailed Usage

First, set your Google API key:

Locotimezone.configure do |config|
  config.google_api_key = 'YOUR_API_KEY' 
end

Geolocate and get timezone details:

require 'locotimezone'

address = '525 NW 1st Ave Fort Lauderdale, FL 33301'

Locotimezone.locotime address: address
# =>
# {:geo=>
#   {:formatted_address=>"525 NW 1st Ave, Fort Lauderdale, FL 33301, USA",
#      :location=>{:lat=>26.1288238, :lng=>-80.1449743}},
#  :timezone=>
#   {:timezone_id=>"America/New_York", :timezone_name=>"Eastern Daylight Time"}}

Not interested in timezone? Skip it to just get geocoded results.

require 'locotimezone'

Locotimezone.locotime address: address, skip: :timezone
# =>
# {:geo=>
#   {:formatted_address=>"525 NW 1st Ave, Fort Lauderdale, FL 33301, USA",
#      :location=>{:lat=>26.1288238, :lng=>-80.1449743}}}

If you already have latitude and longitude, and you're only interested in getting the timezone data, just pass your own location hash like so:

location = { lat: 26.1288238, lng: -80.1449743 }

Locotimezone.locotime location: location
# =>
# {:timezone=>
#   {:timezone_id=>"America/New_York", :timezone_name=>"Eastern Daylight Time"}}

If the address or location cannot be resolved, an empty hash will be returned.

Locotimezone.locotime address: '1234 Fake Address'
# => 
# {:geo=>{}, :timezone=>{}}

Locotimezone.locotime address: '1234 Fake Address', skip: :timezone
# => 
# {:geo=>{}}

Locotimezone.locotime location: { lat: 0, lng: 0 }
# => 
# {:timezone=>{}}

Options

Locotimezone.locotime can take the following option hash keys:

  • :address is a string representation of a street address.
  • :location is a hash containing the latitude and longitude: { lat: 26.1288238, lng: -80.1449743 }. When passing a location hash, the call to Google Maps Geolocation API is skipped.
  • skip: :timezone skips the call to Google Maps Timezone API. For geolocation, only

Setup

Locotimezone.configuration takes a block where the following can be setup:

  • google_api_key. Create an API key and enable APIs in your Google Developer Console. You will also need to enable Google Maps Geocoding API and Google Maps Time Zone API. While using an API key is optional, it's recommended since you will get larger request quota.
  • attributes. For overriding the default attribute names used for Rails models. The defaults are :latitude, :longitude, and :timezone_id. See example above under Rails usage

Command Line Utility

Use the command-line utility to convert an address.

$ locotimezone 525 NW 1st Ave Fort Lauderdale, FL 33301
{:geo=>{:formatted_address=>"150 NW 1st Ave, Fort Lauderdale, FL 33301, USA", :location=>{:lat=>26.1222723, :lng=>-80.1445756}}, :timezone=>{:timezone_id=>"America/New_York", :timezone_name=>"Eastern Daylight Time"}}

Use the command-line utility to get timezone data for latitude and longitude

$ locotimezone -l 26.1288238,-80.1449743
{:timezone=>{:timezone_id=>"America/New_York", :timezone_name=>"Eastern Daylight Time"}}

Versions of Ruby

This library should work with Ruby 2.1 and higher versions.

It has been tested on the following versions of Ruby:

  • Ruby 2.3

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake test to run the tests. You can also run rake run for an interactive prompt that will allow you to experiment. rake run will automatically run the configuration block which sets the google_api_key to ENV['GOOGLE_API_KEY'].

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/apmiller108/locotimezone.

License

The gem is available as open source under the terms of the MIT License.