Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Vue listing des restrictions #1167

Open
1 task
florimondmanca opened this issue Jan 23, 2025 · 0 comments
Open
1 task

Vue listing des restrictions #1167

florimondmanca opened this issue Jan 23, 2025 · 0 comments

Comments

@florimondmanca
Copy link
Collaborator

florimondmanca commented Jan 23, 2025

User story

ETQ visiteur du site, je cherche les restrictions autour d'un lieu afin de savoir si la circulation y sera bientôt impactée

Critères d'acceptation

TODO

Design

Maquette

  • Sur la page carte, ajout d'un switcher "Carte / Liste" dans le panneau latéral
  • Comportement du champ Recherche
    • Vue Carte : inchangé, quand on choisit un lieu la carte se centre dessus
    • Vue Liste : affichage de restrictions ayant lieu à l'endroit choisi (les autres filtres sont aussi pris en compte).
  • La liste est paginée
  • Un affichage spécifique de la liste est prévu pour les cas "Aucun résultat" et "Veuillez rechercher un lieu"

Image

Implémentation

A. Principe de fonctionnement du champ Recherche

Ce champ est "dual" : il n'a pas le même effet selon qu'on regarde la vue Carte ou la vue Liste

  • Vue Carte : il est utilisé pour récupérer les coordonnées (x, y) du lieu recherché afin de centrer la carte dessus (comportement actuel)
  • Vue Liste : il est utilisé pour faire un recherche géométrique des restrictions et afficher une liste de résultats

B. Onglets Carte / Liste

À réaliser avec le composant DSFR Contrôle segmenté (Segmented control) et Turbo Streams

Stocker l'onglet choisi dans l'URL afin qu'on puisse partager un lien montrant la vue carte ou bien la vue liste. Par exemple utiliser un query parameter ?view=(map|list)

⚠️ Il n'y a pas d'interaction croisée entre la carte et la liste. Leur affichage dépend uniquement du champ de recherche et des filtres, pas des résultats de l'un ou de l'autre.

Comportement de chargement des données :

  • Les deux vues ne se mettent à jour que quand elles sont ou deviennent visibles. Pas de calcul en arrière-plan, pour éviter une surconsommation.
  • Quand on bascule sur une vue, on utilise le contenu actuel du champ Recherche et des filtres pour calculer son affichage :
    • Basculement vers la vue Liste : calcul et affichage des résultats
    • Basculement vers la vue Carte : calcul des coordonnées X/Y où centrer la carte à partir du champ Recherche

C. Recherche géométrique des restrictions sur la vue Liste

Dans la vue Liste, le champ Recherche permet de faire une recherche géométrique de restrictions

"Rouen, 76000" => Affichage de toutes les restrictions dont la géométrie "intersecte" celle de la ville de Rouen, etc

Quand l'utilisateur saisit sa recherche, on utilise comme pour la Carte l'API de l'IGN pour obtenir une liste d'options

Quand une option est choisie, un (multi)polygône est calculé pour représenter la "zone de recherche".

La façon de calculer cette zone d'influence dépend du type de lieu

Migration de l'API IGN de recherche

⚠️ L'API IGN ne fournit que le code postal, or on a besoin du code Insee pour la ville

Récemment l'API Adresse a été migrée vers la Géoplateforme : la doc API Adresse pointe vers la page Service Géoplateforme de géocodage avec l'endpoint https://data.geopf.fr/geocodage/search

Cette API a été enrichie de nouveaux champs qui permettent un croisement avec la BDTOPO, il faut donc qu'on passe dessus

  • Migrer IgnMapGeocoder pour utiliser l'endopint /geocodage/search plutôt que /geocodage/completion. De cette façon, on peut récupérer le code Insee dans les résultats.

Calcul de la zone de recherche

Ville (type = municipality) : on récupère son code Insee pour récupérer son contour à partir de l'API découpage administratif : GET https://geo.api.gouv.fr/communes/76540?format=geojson&geometry=contour

Image

Rue (type = street) : on trouve la voie_nommee correspondante dans la BDTOPO en faisant correspondre l'id du résultat IGN avec id_pseudo_fpb. Puis on convertit sa geometrie en polygone avec un ST_Buffer() (de 10 mètres de large par exemple)

Adresse (type = address) : on passe les coordonnées x/y du point dans le résultat IGN dans un ST_Buffer(), ce qui donnera un disque

❓ Y a-t-il d'autres "type" à considérer ?

Correspondance localisation / zone de recherce

Une fois qu'on a la zone de recherche sous forme d'une géométrie GeoJSON, on peut inclure un filtre WHERE ST_Intersects(geometry, :geometry) dans la méthode LocationRepository::findAllForMapAsGeoJSON().

Cas des départementales et nationales

Actuellement sur la carte on ne peut pas cherche des RD ou RN

Avec la nouvelle API IGN (API Adresse migrée vers la Géoplateforme), ça ne sera pas possible non plus

Donc la question ne se posera que quand on envisagera d'ajouter la possibilité de chercher des RD ou RN sur la page Carte, cf MTES-MCT/dialog-roadmap#7

Contexte supplémentaire

Dans la roadmap : MTES-MCT/dialog-roadmap#12

Dans la version "publique" de DiaLog, qui permet à tout un chacun de consulter les données qui se trouvent dans la base, nous souhaitons mettre en avant les restrictions de circulation et non pas les arrêtés, qui restent du domaine des gestionnaires de voirie.

Ainsi nous souhaitons qu'un utilisateur non enregistré puisse facilement s'informer sur les restrictions de circulation en cherchant dans la base de données par rapport à une localisation, une période, par rapport à son véhicule, etc.

@github-project-automation github-project-automation bot moved this to Backlog in DiaLog Jan 23, 2025
@florimondmanca florimondmanca moved this from Backlog to Exploration en cours in DiaLog Jan 23, 2025
@florimondmanca florimondmanca moved this from Exploration en cours to Review avant implé in DiaLog Jan 23, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Status: Review avant implé
Development

No branches or pull requests

1 participant