Skip to content

evuez/geohax

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

33 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Geohax

Hex.pm Build Status Inline docs Hex.pm

Geohash encoding and decoding for Elixir.

Note: This project doesn't receive many updates mainly because its API is fairly small. I'm still actively maintaining it.

Ordering of longitude and latitude

Every function in Geohax use the longitude,latitude ordering; make sure not to invert these!

Both Redis and PostGIS use this same ordering, but if you feel strongly about that and would prefer to use latitude,longitude instead, you can simply create a new module that does this for you:

defmodule MyGeohash do
  def decode(geohash) do
    {lon, lat} = Geohax.decode(geohash)
    {lat, lon}
  end

  def encode(latitude, longitude, precision \\ 12),
    do: Geohax.encode(longitude, latitude, precision)

  defdelegate neighbor(geohash, direction), to: Geohax

  defdelegate neighbors(geohash), to: Geohax

  defdelegate within(min, max, precision \\ 5), to: Geohax
end

Usage

Encoding and decoding

iex> Geohax.encode(-132.83, -38.1033, 6)
"311x1r"
iex> Geohax.decode("311x1r")
{-132.83, -38.1033}

Note that the format for coordinates is {longitude, latitude}.

Finding neighbors

iex> Geohax.neighbors("311x1r")
%{north: "311x32", south: "311x1q", east: "311x1x", west: "311x1p"}
iex> Geohax.neighbor("311x1r", :north)
"311x32"

Calculating geoashes within an envelope

iex> Geohax.within({52.291725, 16.731831}, {52.508736, 17.071703})
["u37ck", "u37cm", "u37cq", "u37cr", "u3k12", "u3k13", "u3k16", "u3k17", "u3k1k", "u37cs", "u37ct", "u37cw", "u37cx", "u3k18", "u3k19", "u3k1d", "u3k1e", "u3k1s", "u37cu", "u37cv", "u37cy", "u37cz", "u3k1b", "u3k1c", "u3k1f", "u3k1g", "u3k1u", "u37fh", "u37fj", "u37fn", "u37fp", "u3k40", "u3k41", "u3k44", "u3k45", "u3k4h", "u37fk", "u37fm", "u37fq", "u37fr", "u3k42", "u3k43", "u3k46", "u3k47", "u3k4k", "u37fs", "u37ft", "u37fw", "u37fx", "u3k48", "u3k49", "u3k4d", "u3k4e", "u3k4s"]

Installation

Add the :geohax dependency to your mix.exs file:

defp deps do
  [{:geohax, "~> 1.0"}]
end

Then, run mix deps.get to fetch the new dependency.