defmodule CoreUtils.GeoJson do @moduledoc """ Provides functions to return workers with geojson format """ @spec worker_list_to_geojson([map]) :: map def worker_list_to_geojson(worker_list) do %{ type: "FeatureCollection", features: get_workers_features(worker_list) } end @spec get_workers_features([map]) :: list def get_workers_features(worker_list) do Enum.map(worker_list, &map_feature/1) end @spec map_feature([any]) :: map def map_feature([worker_id, worker_vehicle_id, lon, lat, service_id, task_id, properties, inserted_at]) do properties = properties || %{} custom_properties = %{ inserted_at: inserted_at, lat: lat, lon: lon, service_id: service_id, task_id: task_id, user_id: worker_id, worker_vehicle_id: worker_vehicle_id } |> Enum.reject(fn {_, value} -> is_nil(value) end) |> Map.new %{ type: "Feature", properties: Map.merge(properties, custom_properties), geometry: %{ type: "Point", coordinates: [lon, lat] } } end def map_feature([worker_id, worker_vehicle_id, lon, lat, distance]) do %{ type: "Feature", properties: %{ user_id: worker_id, worker_vehicle_id: worker_vehicle_id, lat: lat, lon: lon, distance: distance }, geometry: %{ type: "Point", coordinates: [lon, lat] } } end def map_feature([worker_id, worker_vehicle_id, lon, lat]) do %{ type: "Feature", properties: %{ user_id: worker_id, worker_vehicle_id: worker_vehicle_id, lat: lat, lon: lon }, geometry: %{ type: "Point", coordinates: [lon, lat] } } end def map_feature([]), do: %{} def map_feature(nil), do: %{} end