Add timezone handling

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel
2021-10-10 16:25:50 +02:00
parent eba3c70c9b
commit d58ca5743d
49 changed files with 1218 additions and 429 deletions

View File

@@ -66,12 +66,15 @@ defmodule Mobilizon.Service.Geospatial.Addok do
defp process_data(features) do
features
|> Enum.map(fn %{"geometry" => geometry, "properties" => properties} ->
coordinates = geometry |> Map.get("coordinates") |> Provider.coordinates()
%Address{
country: Map.get(properties, "country", default_country()),
locality: Map.get(properties, "city"),
region: Map.get(properties, "context"),
description: Map.get(properties, "name") || street_address(properties),
geom: geometry |> Map.get("coordinates") |> Provider.coordinates(),
geom: coordinates,
timezone: Provider.timezone(coordinates),
postal_code: Map.get(properties, "postcode"),
street: properties |> street_address()
}

View File

@@ -124,12 +124,15 @@ defmodule Mobilizon.Service.Geospatial.GoogleMaps do
description
end
coordinates = Provider.coordinates([lon, lat])
%Address{
country: Map.get(components, "country"),
locality: Map.get(components, "locality"),
region: Map.get(components, "administrative_area_level_1"),
description: description,
geom: [lon, lat] |> Provider.coordinates(),
geom: coordinates,
timezone: Provider.timezone(coordinates),
postal_code: Map.get(components, "postal_code"),
street: street_address(components),
origin_id: "gm:" <> to_string(place_id)

View File

@@ -98,12 +98,15 @@ defmodule Mobilizon.Service.Geospatial.MapQuest do
end
defp produce_address(address, lat, lng) do
coordinates = Provider.coordinates([lng, lat])
%Address{
country: Map.get(address, "adminArea1"),
locality: Map.get(address, "adminArea5"),
region: Map.get(address, "adminArea3"),
description: Map.get(address, "street"),
geom: [lng, lat] |> Provider.coordinates(),
geom: coordinates,
timezone: Provider.timezone(coordinates),
postal_code: Map.get(address, "postalCode"),
street: Map.get(address, "street")
}

View File

@@ -75,7 +75,8 @@ defmodule Mobilizon.Service.Geospatial.Mimirsbrunn do
"properties" => %{"geocoding" => geocoding}
} ->
address = process_address(geocoding)
%Address{address | geom: Provider.coordinates(coordinates)}
coordinates = Provider.coordinates(coordinates)
%Address{address | geom: coordinates, timezone: Provider.timezone(coordinates)}
end)
end

View File

@@ -75,7 +75,8 @@ defmodule Mobilizon.Service.Geospatial.Nominatim do
"properties" => %{"geocoding" => geocoding}
} ->
address = process_address(geocoding)
%Address{address | geom: Provider.coordinates(coordinates)}
coordinates = Provider.coordinates(coordinates)
%Address{address | geom: coordinates, timezone: Provider.timezone(coordinates)}
end)
end

View File

@@ -76,7 +76,8 @@ defmodule Mobilizon.Service.Geospatial.Pelias do
"properties" => properties
} ->
address = process_address(properties)
%Address{address | geom: Provider.coordinates(coordinates)}
coordinates = Provider.coordinates(coordinates)
%Address{address | geom: coordinates, timezone: Provider.timezone(coordinates)}
end)
end

View File

@@ -69,12 +69,15 @@ defmodule Mobilizon.Service.Geospatial.Photon do
defp process_data(features) do
features
|> Enum.map(fn %{"geometry" => geometry, "properties" => properties} ->
coordinates = geometry |> Map.get("coordinates") |> Provider.coordinates()
%Address{
country: Map.get(properties, "country"),
locality: Map.get(properties, "city"),
region: Map.get(properties, "state"),
description: Map.get(properties, "name") || street_address(properties),
geom: geometry |> Map.get("coordinates") |> Provider.coordinates(),
geom: coordinates,
timezone: Provider.timezone(coordinates),
postal_code: Map.get(properties, "postcode"),
street: properties |> street_address()
}

View File

@@ -79,6 +79,19 @@ defmodule Mobilizon.Service.Geospatial.Provider do
def coordinates(_), do: nil
@doc """
Returns the timezone for a Geo.Point
"""
@spec timezone(nil | Geo.Point.t()) :: nil | String.t()
def timezone(nil), do: nil
def timezone(%Geo.Point{} = point) do
case TzWorld.timezone_at(point) do
{:ok, tz} -> tz
{:error, _err} -> nil
end
end
@spec endpoint(atom()) :: String.t()
def endpoint(provider) do
Application.get_env(:mobilizon, provider) |> get_in([:endpoint])