Packages
geo
3.4.1
4.1.0
4.0.1
4.0.0
3.6.0
3.5.1
3.5.0
3.4.3
3.4.2
3.4.1
3.4.0
3.3.8
3.3.7
3.3.5
3.3.4
3.3.3
3.3.2
3.3.1
3.3.0
3.2.0
3.1.0
3.0.0
2.1.0
2.0.0
1.5.0
1.4.1
1.4.0
1.3.1
1.3.0
1.2.1
1.2.0
1.1.2
1.1.1
1.1.0
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.18.0
0.17.0
0.16.1
0.16.0
0.15.2
0.15.1
0.15.0
0.14.0
0.13.0
0.12.0
0.11.2
0.11.1
0.11.0
0.10.1
0.10.0
0.9.3
0.9.2
0.9.1
0.9.0
0.8.0
0.7.2
0.7.1
0.6.1
0.5.1
Encodes and decodes WKB, WKT, and GeoJSON formats.
Current section
Files
Jump to
Current section
Files
lib/geo/wkb.ex
defmodule Geo.WKB do
@moduledoc """
Converts to and from WKB and EWKB.
## Examples
iex> {:ok, point} = Geo.WKB.decode("0101000000000000000000F03F000000000000F03F")
Geo.Point[coordinates: {1, 1}, srid: nil]
iex> Geo.WKT.encode!(point)
"POINT(1 1)"
iex> point = Geo.WKB.decode!("0101000020E61000009EFB613A637B4240CF2C0950D3735EC0")
Geo.Point[coordinates: {36.9639657, -121.8097725}, srid: 4326]
"""
alias Geo.WKB.{Encoder, Decoder}
@doc """
Takes a Geometry and returns a WKB string. The endian decides
what the byte order will be.
"""
@spec encode!(Geo.geometry(), Geo.endian()) :: binary
def encode!(geom, endian \\ :xdr) do
geom |> Encoder.encode!(endian) |> IO.iodata_to_binary() |> Base.encode16()
end
@doc """
Takes a Geometry and returns a WKB string.
The endian decides what the byte order will be.
"""
@spec encode(binary, Geo.endian()) :: {:ok, binary} | {:error, Exception.t()}
def encode(geom, endian \\ :xdr) do
{:ok, geom |> Encoder.encode!(endian) |> IO.iodata_to_binary() |> Base.encode16()}
rescue
exception ->
{:error, exception}
end
@doc """
Takes a Geometry and returns a WKB as iodata.
The endian decides what the byte order will be.
"""
@spec encode_to_iodata(Geo.geometry(), Geo.endian()) :: iodata()
def encode_to_iodata(geom, endian \\ :xdr) do
Encoder.encode!(geom, endian)
end
@doc """
Takes a WKB string and returns a Geometry.
"""
@spec decode(binary) :: {:ok, Geo.geometry()} | {:error, Exception.t()}
def decode("00" <> _ = wkb) do
wkb
|> Base.decode16!()
|> decode()
end
def decode("01" <> _ = wkb) do
wkb
|> Base.decode16!()
|> decode()
end
def decode(wkb) when is_list(wkb) do
wkb
|> IO.iodata_to_binary()
|> decode()
end
def decode(wkb) do
{:ok, decode!(wkb)}
rescue
exception ->
{:error, exception}
end
@doc """
Takes a WKB string and returns a Geometry.
"""
@spec decode!(iodata()) :: Geo.geometry()
def decode!(wkb)
def decode!("00" <> _ = wkb) do
wkb
|> Base.decode16!()
|> decode!()
end
def decode!("01" <> _ = wkb) do
wkb
|> Base.decode16!()
|> decode!()
end
def decode!(wkb) when is_list(wkb) do
wkb |> IO.iodata_to_binary() |> decode!()
end
def decode!(wkb) do
Decoder.decode(wkb) |> elem(0)
end
end