defmodule LocationSimulator.Gps do @moduledoc """ Generate a random location. Get next gps from a location. """ require Logger alias :math, as: Math @doc """ Generates a random location. """ @spec generate_pos :: {float, float} def generate_pos() do :rand.seed(System.monotonic_time(:nanosecond)) {:rand.uniform(90), :rand.uniform(180)} end @doc """ Gets next location from current location. """ @spec generate_next_pos(float, float, integer, integer) :: {float, float} def generate_next_pos(lati, long, step_lati \\ 1, step_long \\ 1) when is_number(long) and is_number(lati) do new_lati = lati + step_lati * meter_in_degree() new_long = long + step_long * meter_in_degree() / Math.cos(lati * (Math.pi() / 180)) {new_lati, new_long} end @spec meter_in_degree() :: float defp meter_in_degree() do # Radius of the earth (km) earth_radius = 6378.137 pi = Math.pi() r = 2 * pi / 360 r = 1 / (r * earth_radius) r / 1000 end end