diff --git a/apps/transport/client/javascripts/explore.js b/apps/transport/client/javascripts/explore.js index 1e8b5c15db..cb63c6b429 100644 --- a/apps/transport/client/javascripts/explore.js +++ b/apps/transport/client/javascripts/explore.js @@ -59,9 +59,17 @@ function getTooltip ({ object, layer }) { if (layer.id === 'bnlc-layer') { return { html: `Aire de covoiturage
${object.properties.nom_lieu}` } } else if (layer.id === 'parkings_relais-layer') { - return { html: `Parking relai
${object.properties.nom}
Capacité : ${object.properties.nb_pr} places` } + return { html: `Parking relais
${object.properties.nom}
Capacité : ${object.properties.nb_pr} places` } } else if (layer.id === 'zfe-layer') { return { html: 'Zone à Faible Émission' } + } else if (layer.id === 'irve-layer') { + return { + html: `Infrastructure de recharge
+ ${object.properties.nom_station}
+ Enseigne : ${object.properties.nom_enseigne}
+ Identifiant : ${object.properties.id_station_itinerance}
+ Nombre de points de charge : ${object.properties.nbre_pdc}` + } } else { return { html: `Position temps-réel
transport_resource: ${object.transport.resource_id}
id: ${object.vehicle.id}` } } @@ -75,6 +83,7 @@ function getLayers (layers) { layersArray.push(layers.bnlc) layersArray.push(layers.parkings_relais) layersArray.push(layers.zfe) + layersArray.push(layers.irve) return layersArray } @@ -131,6 +140,16 @@ document.getElementById('zfe-check').addEventListener('change', (event) => { } }) +// Handle IRVE toggle +document.getElementById('irve-check').addEventListener('change', (event) => { + if (event.currentTarget.checked) { + fetch('/api/geo-query?data=irve') + .then(data => updateIRVELayer(data.json())) + } else { + updateIRVELayer(null) + } +}) + function updateBNLCLayer (geojson) { layers.bnlc = createPointsLayer(geojson, 'bnlc-layer') deckGLLayer.setProps({ layers: getLayers(layers) }) @@ -143,12 +162,17 @@ function updateZFELayer (geojson) { layers.zfe = createPointsLayer(geojson, 'zfe-layer') deckGLLayer.setProps({ layers: getLayers(layers) }) } +function updateIRVELayer (geojson) { + layers.irve = createPointsLayer(geojson, 'irve-layer') + deckGLLayer.setProps({ layers: getLayers(layers) }) +} function createPointsLayer (geojson, id) { const fillColor = { 'bnlc-layer': [255, 174, 0, 100], 'parkings_relais-layer': [0, 33, 70, 100], - 'zfe-layer': [155, 89, 182, 100] + 'zfe-layer': [155, 89, 182, 100], + 'irve-layer': [245, 40, 145, 100] }[id] return new GeoJsonLayer({ diff --git a/apps/transport/client/stylesheets/components/_explore.scss b/apps/transport/client/stylesheets/components/_explore.scss index 8d97d44234..f4ff945a69 100644 --- a/apps/transport/client/stylesheets/components/_explore.scss +++ b/apps/transport/client/stylesheets/components/_explore.scss @@ -19,4 +19,7 @@ #zfe-check:checked { background-color: rgb(155, 89, 182); } + #irve-check:checked { + background-color: rgb(245, 40, 145); + } } diff --git a/apps/transport/lib/transport_web/api/controllers/geo_query_controller.ex b/apps/transport/lib/transport_web/api/controllers/geo_query_controller.ex index 4273225c1d..dfe489dc5d 100644 --- a/apps/transport/lib/transport_web/api/controllers/geo_query_controller.ex +++ b/apps/transport/lib/transport_web/api/controllers/geo_query_controller.ex @@ -34,6 +34,10 @@ defmodule TransportWeb.API.GeoQueryController do "zfe" => %{ dataset: Transport.Jobs.LowEmissionZonesToGeoData.relevant_dataset(), transform_fn: &zfe_geojson/1 + }, + "irve" => %{ + dataset: Transport.Jobs.IRVEToGeoData.relevant_dataset(), + transform_fn: &irve_geojson/1 } } end @@ -58,4 +62,19 @@ defmodule TransportWeb.API.GeoQueryController do DB.GeoData.geo_data_as_geojson(geo_data_import, add_fields) end + + def irve_geojson(%DB.GeoDataImport{} = geo_data_import) do + add_fields = fn query -> + from(g in query, + select_merge: %{ + nom_enseigne: fragment("payload->>'nom_enseigne'"), + id_station_itinerance: fragment("payload->>'id_station_itinerance'"), + nom_station: fragment("payload->>'nom_station'"), + nbre_pdc: fragment("payload->>'nbre_pdc'") + } + ) + end + + DB.GeoData.geo_data_as_geojson(geo_data_import, add_fields) + end end diff --git a/apps/transport/lib/transport_web/controllers/explore_controller.ex b/apps/transport/lib/transport_web/controllers/explore_controller.ex index 0f8e7ae6ed..52c38e72a2 100644 --- a/apps/transport/lib/transport_web/controllers/explore_controller.ex +++ b/apps/transport/lib/transport_web/controllers/explore_controller.ex @@ -6,6 +6,7 @@ defmodule TransportWeb.ExploreController do |> assign(:bnlc_dataset, Transport.Jobs.BNLCToGeoData.relevant_dataset()) |> assign(:parcs_relais_dataset, Transport.Jobs.ParkingsRelaisToGeoData.relevant_dataset()) |> assign(:zfe_dataset, Transport.Jobs.LowEmissionZonesToGeoData.relevant_dataset()) + |> assign(:irve_dataset, Transport.Jobs.IRVEToGeoData.relevant_dataset()) |> render("explore.html") end diff --git a/apps/transport/lib/transport_web/templates/explore/explore.html.heex b/apps/transport/lib/transport_web/templates/explore/explore.html.heex index 8be0ad721a..886cdeb9ed 100644 --- a/apps/transport/lib/transport_web/templates/explore/explore.html.heex +++ b/apps/transport/lib/transport_web/templates/explore/explore.html.heex @@ -2,60 +2,83 @@ <% bnlc_link = dataset_path(@conn, :details, @bnlc_dataset.slug) %> <% parcs_relais_link = dataset_path(@conn, :details, @parcs_relais_dataset.slug) %> <% zfe_link = dataset_path(@conn, :details, @zfe_dataset.slug) %> +<% irve_link = dataset_path(@conn, :details, @irve_dataset.slug) %>

<%= dgettext("explore", "Transport Explore") %>

-
- -
- - <%= dgettext("explore", "Real time vehicle positions (GTFS-RT)") %> - - <%= raw( - dgettext("explore", "gtfs-rt-explanation", - link: - safe_to_string(link(dgettext("explore", "GTFS-RT feeds referenced on this site"), to: real_time_datasets)) - ) - ) %> -
-
- -
- -
- - <%= dgettext("explore", "Carpooling areas national database") %> - - <%= raw( - dgettext("explore", "bnlc-explanation", - link: safe_to_string(link(dgettext("explore", "dataset"), to: bnlc_link)) - ) - ) %> -
-
-
- -
- - <%= dgettext("explore", "Park and ride database") %> - - <%= raw( - dgettext("explore", "park-and-ride-explanation", - link: safe_to_string(link(dgettext("explore", "dataset"), to: parcs_relais_link)) - ) - ) %> -
-
-
- -
- - <%= dgettext("explore", "Low emission zones database") %> - - <%= raw( - dgettext("explore", "lez-explanation", link: safe_to_string(link(dgettext("explore", "dataset"), to: zfe_link))) - ) %> -
+
+
+
+ +
+ + <%= dgettext("explore", "Real time vehicle positions (GTFS-RT)") %> + + <%= raw( + dgettext("explore", "gtfs-rt-explanation", + link: + safe_to_string( + link(dgettext("explore", "GTFS-RT feeds referenced on this site"), to: real_time_datasets) + ) + ) + ) %> +
+
+
+ +
+ + <%= dgettext("explore", "Carpooling areas national database") %> + + <%= raw( + dgettext("explore", "bnlc-explanation", + link: safe_to_string(link(dgettext("explore", "dataset"), to: bnlc_link)) + ) + ) %> +
+
+
+ +
+ + <%= dgettext("explore", "Park and ride database") %> + + <%= raw( + dgettext("explore", "park-and-ride-explanation", + link: safe_to_string(link(dgettext("explore", "dataset"), to: parcs_relais_link)) + ) + ) %> +
+
+
+
+
+ +
+ + <%= dgettext("explore", "Low emission zones database") %> + + <%= raw( + dgettext("explore", "lez-explanation", + link: safe_to_string(link(dgettext("explore", "dataset"), to: zfe_link)) + ) + ) %> +
+
+
+ +
+ + <%= dgettext("explore", "IRVE map") %> + + <%= raw( + dgettext("explore", "irve-explanation", + link: safe_to_string(link(dgettext("explore", "dataset"), to: irve_link)) + ) + ) %> +
+
+
diff --git a/apps/transport/priv/gettext/en/LC_MESSAGES/explore.po b/apps/transport/priv/gettext/en/LC_MESSAGES/explore.po index abb3ba1355..dca84fc0da 100644 --- a/apps/transport/priv/gettext/en/LC_MESSAGES/explore.po +++ b/apps/transport/priv/gettext/en/LC_MESSAGES/explore.po @@ -110,3 +110,11 @@ msgstr "Consolidated GTFS stops map (beta)" #, elixir-autogen, elixir-format msgid "Consolidated GTFS stops map explanation" msgstr "This map consolidates all the GTFS referenced on this site. It is in beta and may include outdated or duplicate data (see %{link}). Feedback is most welcome." + +#, elixir-autogen, elixir-format +msgid "irve-explanation" +msgstr "Consolidated national map of charging stations static %{link}." + +#, elixir-autogen, elixir-format +msgid "IRVE map" +msgstr "Electric Vehicule Charging Infrastructure database" diff --git a/apps/transport/priv/gettext/explore.pot b/apps/transport/priv/gettext/explore.pot index 51d2d0c16f..bea1c89134 100644 --- a/apps/transport/priv/gettext/explore.pot +++ b/apps/transport/priv/gettext/explore.pot @@ -109,3 +109,11 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Consolidated GTFS stops map explanation" msgstr "" + +#, elixir-autogen, elixir-format +msgid "irve-explanation" +msgstr "" + +#, elixir-autogen, elixir-format +msgid "IRVE map" +msgstr "" diff --git a/apps/transport/priv/gettext/fr/LC_MESSAGES/explore.po b/apps/transport/priv/gettext/fr/LC_MESSAGES/explore.po index 708360f204..35b4b675a1 100644 --- a/apps/transport/priv/gettext/fr/LC_MESSAGES/explore.po +++ b/apps/transport/priv/gettext/fr/LC_MESSAGES/explore.po @@ -110,3 +110,11 @@ msgstr "Carte consolidée des arrêts GTFS (beta)" #, elixir-autogen, elixir-format, fuzzy msgid "Consolidated GTFS stops map explanation" msgstr "Cette carte consolide tous les GTFS référencés sur ce site. En beta, peut inclure des éléments expirés ou des doublons (voir %{link}). Vos retours sont les bienvenus." + +#, elixir-autogen, elixir-format, fuzzy +msgid "irve-explanation" +msgstr "Carte du %{link} consolidé des IRVE (données statiques)." + +#, elixir-autogen, elixir-format +msgid "IRVE map" +msgstr "Infrastructures de Recharge des Véhicules Électriques (IRVE)" diff --git a/apps/transport/test/transport_web/controllers/api/geo_query_controller_test.exs b/apps/transport/test/transport_web/controllers/api/geo_query_controller_test.exs index de29c9e084..feb79cee1f 100644 --- a/apps/transport/test/transport_web/controllers/api/geo_query_controller_test.exs +++ b/apps/transport/test/transport_web/controllers/api/geo_query_controller_test.exs @@ -9,6 +9,7 @@ defmodule TransportWeb.API.GeoQueryControllerTest do test "a BNLC geo query", %{conn: conn} do insert_parcs_relais_dataset() insert_zfe_dataset() + insert_irve_dataset() %{id: dataset_id} = insert_bnlc_dataset() %{id: resource_history_id} = insert(:resource_history, %{payload: %{"dataset_id" => dataset_id}}) @@ -47,6 +48,7 @@ defmodule TransportWeb.API.GeoQueryControllerTest do test "a parkings relais geo query", %{conn: conn} do insert_bnlc_dataset() insert_zfe_dataset() + insert_irve_dataset() %{id: dataset_id} = insert_parcs_relais_dataset() %{id: resource_history_id} = insert(:resource_history, %{payload: %{"dataset_id" => dataset_id}}) @@ -97,6 +99,7 @@ defmodule TransportWeb.API.GeoQueryControllerTest do test "a ZFE geo query", %{conn: conn} do insert_bnlc_dataset() insert_parcs_relais_dataset() + insert_irve_dataset() %{id: dataset_id} = insert_zfe_dataset() %{id: resource_history_id} = insert(:resource_history, %{payload: %{"dataset_id" => dataset_id}}) @@ -150,10 +153,74 @@ defmodule TransportWeb.API.GeoQueryControllerTest do } end + test "a IRVE geo query", %{conn: conn} do + insert_parcs_relais_dataset() + insert_zfe_dataset() + insert_bnlc_dataset() + %{id: dataset_id} = insert_irve_dataset() + + %{id: resource_history_id} = insert(:resource_history, %{payload: %{"dataset_id" => dataset_id}}) + %{id: geo_data_import_id} = insert(:geo_data_import, %{resource_history_id: resource_history_id}) + + point1 = %Geo.Point{coordinates: {1, 1}, srid: 4326} + point2 = %Geo.Point{coordinates: {2, 2}, srid: 4326} + + insert(:geo_data, %{ + geo_data_import_id: geo_data_import_id, + geom: point1, + payload: %{ + "nom_enseigne" => "Recharge Super 95", + "id_station_itinerance" => "FRELCPEYSPC", + "nom_station" => "Dehaven Centre", + "nbre_pdc" => 2 + } + }) + + insert(:geo_data, %{ + geo_data_import_id: geo_data_import_id, + geom: point2, + payload: %{ + "nom_enseigne" => "Recharge Super 95", + "id_station_itinerance" => "FRELCPBLOHM", + "nom_station" => "Gemina Port", + "nbre_pdc" => 3 + } + }) + + conn = conn |> get(TransportWeb.API.Router.Helpers.geo_query_path(conn, :index, data: "irve")) + + assert json_response(conn, 200) == %{ + "type" => "FeatureCollection", + "features" => [ + %{ + "geometry" => %{"coordinates" => [1, 1], "type" => "Point"}, + "properties" => %{ + "nom_enseigne" => "Recharge Super 95", + "id_station_itinerance" => "FRELCPEYSPC", + "nom_station" => "Dehaven Centre", + "nbre_pdc" => "2" + }, + "type" => "Feature" + }, + %{ + "geometry" => %{"coordinates" => [2, 2], "type" => "Point"}, + "properties" => %{ + "nom_enseigne" => "Recharge Super 95", + "id_station_itinerance" => "FRELCPBLOHM", + "nom_station" => "Gemina Port", + "nbre_pdc" => "3" + }, + "type" => "Feature" + } + ] + } + end + test "404 cases", %{conn: conn} do insert_bnlc_dataset() insert_parcs_relais_dataset() insert_zfe_dataset() + insert_irve_dataset() conn |> get(TransportWeb.API.Router.Helpers.geo_query_path(conn, :index)) @@ -186,4 +253,13 @@ defmodule TransportWeb.API.GeoQueryControllerTest do organization: Application.fetch_env!(:transport, :datagouvfr_transport_publisher_label) }) end + + defp insert_irve_dataset do + insert(:dataset, %{ + type: "charging-stations", + custom_title: "Infrastructures de Recharge pour Véhicules Électriques - IRVE", + organization: "data.gouv.fr", + organization_id: "646b7187b50b2a93b1ae3d45" + }) + end end diff --git a/apps/transport/test/transport_web/controllers/explore_controller_test.exs b/apps/transport/test/transport_web/controllers/explore_controller_test.exs index 17c6f4e327..32c8e06c26 100644 --- a/apps/transport/test/transport_web/controllers/explore_controller_test.exs +++ b/apps/transport/test/transport_web/controllers/explore_controller_test.exs @@ -17,6 +17,13 @@ defmodule TransportWeb.ExploreControllerTest do organization: pan_org }) + insert(:dataset, %{ + type: "charging-stations", + custom_title: "Infrastructures de Recharge pour Véhicules Électriques - IRVE", + organization: "data.gouv.fr", + organization_id: "646b7187b50b2a93b1ae3d45" + }) + :ok end