Packages
geo
0.9.0
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/postgis.ex
defmodule Geo.PostGIS do
alias Postgrex.TypeInfo
@moduledoc """
Encoder, Decoder, and Formatter to be used with Postgrex for PostGIS data types
iex(1)> opts = [hostname: "localhost",
...(1)> username: "postgres", database: "geo_postgrex_test",
...(1)> encoder: &Geo.PostGIS.encoder/3, decoder: &Geo.PostGIS.decoder/4,
...(1)> formatter: &Geo.PostGIS.formatter/1 ]
[hostname: "localhost", username: "postgres", database: "geo_postgrex_test",
encoder: &Geo.PostGIS.encoder/3, decoder: &Geo.PostGIS.decoder/4,
formatter: &Geo.PostGIS.formatter/1]
iex(2)> {:ok, pid} = Postgrex.Connection.start_link(opts)
{:ok, #PID<0.115.0>}
iex(3)> geo = %Geo.Geometry{type: :point, coordinates: [30, -90], srid: 4326}
%Geo.Geometry{coordinates: [30, -90], srid: 4326, type: :point}
iex(4)> {:ok, _} = Postgrex.Connection.query(pid, "CREATE TABLE point_test (id int, geom geometry(Point, 4326))")
{:ok,
%Postgrex.Result{columns: nil, command: :create_table, num_rows: 0, rows: nil}}
iex(5)> {:ok, _} = Postgrex.Connection.query(pid, "INSERT INTO point_test VALUES ($1, $2)", [42, geo])
{:ok, %Postgrex.Result{columns: nil, command: :insert, num_rows: 1, rows: nil}}
iex(6)> Postgrex.Connection.query(pid, "SELECT * FROM point_test")
{:ok,
%Postgrex.Result{columns: ["id", "geom"], command: :select, num_rows: 1,
rows: [{42,
%Geo.Geometry{coordinates: [30.0, -90.0], srid: 4326, type: :point}}]}}
"""
def decoder(%TypeInfo{sender: "geometry", type: "geometry"}, _format , _, value) do
Geo.WKB.decode(value)
end
def decoder(%TypeInfo{}, _format, default, bin) do
default.(bin)
end
def encoder(%TypeInfo{sender: "geometry", type: "geometry"}, _, value) do
Geo.WKT.encode(value)
end
def encoder(%TypeInfo{}, default, value) do
default.(value)
end
def formatter(%TypeInfo{sender: "geometry"}), do: :text
def formatter(%TypeInfo{}), do: nil
end