Current section
Files
Jump to
Current section
Files
lib/output.ex~
defmodule GeoPartition.Output do
@moduledoc """
Output formatting for the result of a partitioning
"""
def format(list, :multipolygon) do
coords = Enum.map(list, &(&1.coordinates))
%Geo.MultiPolygon{coordinates: coords}
end
def format(list, :multipolygon_json) do
format(list, :multipolygon)
|> Geo.JSON.encode!
|> Poison.encode!
end
def format(list, :list) do
list
end
def format(list, :feature_collection) do
polys = list
|> Enum.map(&Geo.JSON.encode!(&1))
|> Enum.map(&wrap_in_feature(&1, %{}))
%{
"type" => "FeatureCollection",
"features" => polys
}
|> Poison.encode!
end
def format(list, :feature_collection_json) do
format(list, :feature_collection)
|> Poison.encode!
end
def format(list, :feature_collection_multipolygon) do
polys = list
|> Enum.map(&(poly_to_multi(&1)))
|> Enum.map(&wrap_in_feature(&1, %{}))
%{
"type" => "FeatureCollection",
"features" => polys
}
|> Poison.encode!
end
defp wrap_in_feature(shape = %{"type" => type}, props \\ %{}) do
%{
"type" => "Feature",
"properties" => props,
"geometry" => shape
}
end
defp coords_to_list(coords) do
case coords do
[{a, b}|_] -> Enum.map(coords, fn({x, y}) -> [x, y] end)
[] -> []
_ -> Enum.map(coords, &([coords_to_list(&1)]))
end
end
defp poly_to_multi(shape = %Geo.Polygon{}) do
%Geo.MultiPolygon{
coordinates: [shape.coordinates]
}
|> Geo.JSON.encode!
end
end