Geocoder [![Build Status](]( [![Inline docs](]( [![Coverage Status](](

A simple, efficient geocoder/reverse geocoder with a built-in cache.

Is it extensible? Yes.
**Is it any good?** Absolutely.


Keep calm and add Geocoder to your `mix.exs` dependencies:

def deps do
  [{:geocoder, "~> 1.0"}]

Update your mix dependencies:

mix deps.get


All configuration below is optional. Sane defaults are set so you don't need to think too hard.

Set pool configuration:

config :geocoder, :worker_pool_config, size: 4, max_overflow: 2

Set provider configuration:

config :geocoder, :worker,
  # OpenStreetMaps or OpenCageData are other supported providers
  provider: Geocoder.Providers.GoogleMaps,
  key: System.get_env("GEOCODER_GOOGLE_API_KEY")

Note that `OpenStreetMaps` is the only provider that does not require an API key to operate.
All other providers require an API key that you'll need to provide.

If you need to set a proxy (or any other option supported by HTTPoison.get/3):

config :geocoder, Geocoder.Worker, [
  httpoison_options: [proxy: "my.proxy.server:3128", proxy_auth: {"username", "password"}]

Let's rumble!


{:ok, coordinates } ="Toronto, ON")
{:ok, coordinates } ={43.653226, -79.383184})


You can pass options to the function that will be passed to the geocoder provider, for example:

```elixir "Toronto, ON", language: "es", key: "...", ...)

See [here]( and [here]( for a list of supported parameters for the default geocoder provider (`Geocoder.Provider.GoogleMaps`).

And you're done! How simple was that?


Right now, `geocoder` supports three providers (i.e. sources):

* `Geocoder.Providers.GoogleMaps`
* `Geocoder.Providers.OpenCageData`
* `Geocoder.Providers.OpenStreetMaps`

To run the tests for these, and any future providers, you'll want to pass a `PROVIDER` environment variable:

PROVIDER=google mix test

By default, the tests run on OpenStreetMaps.

## Copyright and License

Copyright (c) 2015, Kash Nouroozi.

The source code is licensed under the [MIT License](