Conseils & Astuces ArcGIS Online - N°183
N° 183 - Afficher des horaires d'ouverture dans des fenêtres contextuelles avec Arcade
Dans mon précédent article (Conseils & Astuces ArcGIS Online n°182), je vous ai montré comment représenter, via la symbologie de la couche et une expression Arcade, des informations concernant les heures d'ouverture et de fermeture associés à vos points d'intérêts. Lorsque vous disposez d'informations relatives aux heures d'ouverture et de fermeture, il est également possible de réaliser des cartes plus dynamiques en utilisant des expressions Arcade.
Dans cet article, je vous propose de voir deux exemples d'expression Arcade pour afficher les heures d'ouvertures de chacun de vos points d'intérêt dans des fenêtres contextuelles.
Reprenons l'exemple d'une couche de points contenant les déchèteries sur la région Ile-de-France. Cette dernière contient les horaires d'ouverture et de fermeture, pour chaque jour de la semaine, stockés dans 14 champs de type "Heure uniquement" (Time only). Par exemple, pour la journée du lundi, les horaires se trouveront dans les champs Ouverture_Lundi et Fermeture_Lundi. Dans mon cas, l'absence de valeur indique une fermeture durant toute la journée.
Voici comment vous pouvez préparer les déchèteries ouvertes ou fermées en fonction du jour et de l'heure actuels.
- Après avoir ajouté la couche des déchèteries dans la carte, vous afficherez l'interface de définition des fenêtres contextuelles. Vous supprimerez la liste des champs proposée par défaut et vous ajouterez une expression Arcade.
- Vous donnerez tout d'abord un nom à votre expression, par exemple ici : "Table des horaires d'ouverture".
- Vous saisirez ensuite l'expression Arcade suivante :
Expects($feature,"*") var ListeJourSemaine=["Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi","Dimanche"] // On initialise la variable contenant le bloc HTML de la fenêtre contextuelle var strHTML = "" // On commence à construire le paragraphe de texte strHTML += "<p style='font-family: Arial; font-size: 10pt;'>Horaires d'ouverture<br/>" // Varaible pour gérer la bordure supérieure du premier tableau var border_top = "" // On boucle sur chaque jour de la semaine for(var i in ListeJourSemaine) { // On récupère le nom du jour var NomDuJour = ListeJourSemaine[i] // On démarre un nouveau tableau strHTML += "<table style='border-collapse: collapse;font-family: Arial; font-size: 9pt;'>" // La première cellule contient le nom du jour // Si la ligne courante (i va de 0 à 6) est égal au jour courant (ISOWeekday de 1 à 7) // alors on met la ligne en gras et su fond gris clair if(i == ISOWeekday(Today())-1){ strHTML += "<tr style='border: 1px solid;" + border_top + ";" strHTML += "background-color: #EEEEEE;font-weight: bold'>" }else{ strHTML += "<tr style='border: 1px solid;" + border_top + ";'>" } // On affiche le nom du jour strHTML += "<td style='width: 80px;padding-left: 5px;'>" + NomDuJour + " :</td>" // On récupère les heures d'ouverture et de fermeture correspondant // à ce jour de la semaine var HeureOuverture = $feature["Ouverture_"+NomDuJour] var HeureFermeture = $feature["Fermeture_"+NomDuJour] // Si le lieu a bien une heure d'ouverture et de fermeture, on affiche // ces deux informations dans le tableau if(!IsEmpty(HeureOuverture) && !IsEmpty(HeureFermeture)){ strHTML += "<td style='width: 100px;color: #00CC00;'>" +Text(HeureOuverture,"H:mm")+" - " + Text(HeureFermeture,"H:mm") +"</td>" } // Sinon on affiche qu'il est fermé else{ strHTML += "<td style='width: 100px;color: #CC0000;'>Fermé</td>" } // Fin du tableau strHTML += "</tr></table>" // Pour les autres jours/tableaux, la bordure supérieure sera invisible border_top = "border-top: 0px;" } strHTML += "</p>" // On renvoie le bloc de code HTML de la fenêtre contextuelle return { type : 'text', text : strHTML }
- Votre carte affiche désormais les déchèteries avec des fenêtres contextuelles présentant le tableau des horaires d'ouverture.
Aller plus loin...
- Vous pouvez améliorer encore l'exploitation des heures en proposant une fenêtre contextuelle plus graphique. Par exemple, vous pouvez utiliser Arcade pour construire un tableau HTML affichant les plages d'ouverture à l'aide de zones colorisées.
L'expression Arcade ressemblera alors à ceci :Expects($feature,"*") /// Fonction permettant de construire la partie horaire du calendrier function GenererPlagesHoraires(HeureMinCalendrier,HeureMaxCalendrier,HeureOuverture,HeureFermeture){ // Récupération du nombre minutes de la plage horaire du calendrier var MinutesDansLaPlage = DateDiff(HeureMaxCalendrier,HeureMinCalendrier,"minutes") // On initialise la variable du bloc HTML de la cellule du tableau var strTD = "" // Si les heures d'ouverture et de fermetur sont bien défines if(!IsEmpty(HeureOuverture) && !IsEmpty(HeureFermeture)){ // Position des heures d'ouverture dans la journée var MinutesOuverture = DateDiff(HeureOuverture,HeureMinCalendrier,"minutes") var MinutesFermeture = DateDiff(HeureFermeture,HeureMinCalendrier,"minutes") // Calcul du nombre de pixels pour séparer les 2 blocs de couleur var pixels_ouverture = Floor((MinutesOuverture/MinutesDansLaPlage)*250) var pixels_fermeture = Floor((MinutesFermeture/MinutesDansLaPlage)*250) // Bloc gris (fermé) strTD += "<td style='width: "+pixels_ouverture+"px;background-color: #cccccc'></td>" // Bloc vert (ouvert) strTD += "<td style='width: "+(pixels_fermeture - pixels_ouverture)+ "px;background-color: #00cc00;color: #FFFFFF;font-size: 8pt;text-align: center'>" +Text(HeureOuverture,"H:mm")+" - " + Text(HeureFermeture,"H:mm") +"</td>" strTD += "<td style='width: "+ (250 - pixels_fermeture) + "px;background-color: #cccccc;font-size: 8pt;'></td>" } // Si aucune heure d'ouverture ou de fermeture n'est défninie alors c'est fermé ! else{ // On créé 2 blocs gris cote à cote pour une largeur totale de 300px strTD += "<td style='width: 125px;background-color: #CCCCCC'></td>" strTD += "<td style='width: 125px;background-color: #CCCCCC'></td>" } return strTD } var ListeJourSemaine=["Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi","Dimanche"] // 2 variables pour définir les heures min et max des journées dans le calendrier var HeureMinCalendrier = Time("07:00") var HeureMaxCalendrier = Time("20:00") // On initialise la variable contenant le bloc HTML de la fenêtre contextuelle var strHTML = "" // On commence à construire le paragraphe de texte strHTML += "<p style='font-family: Arial; font-size: 10pt;'>Horaires d'ouverture<br/>" // Varaible pour gérer la bordure supérieure du premier tableau var border_top = "" strHTML += "<table style='border-collapse: collapse;font-family: Arial; font-size: 10pt;'>" strHTML += "<tr style='border: Opx solid;'><td style='width: 80px;'> </td>" strHTML += "<td style='width: 125px;text-align: left;font-size: 8pt;'>"+ Text(HeureMinCalendrier,"H:mm")+"</td>" strHTML += "<td style='width: 125px;text-align: right;font-size: 8pt;'>"+ Text(HeureMaxCalendrier,"H:mm")+"</td>" // Fin du tableau strHTML += "</tr></table>" // On boucle sur chaque jour de la semaine for(var i in ListeJourSemaine) { var NomDuJour = ListeJourSemaine[i] // On démarre un nouveau tableau strHTML += "<table style='border-collapse: collapse;font-family: Arial; font-size: 9pt;'>" // Si la ligne courante (i va de 0 à 6) est égal au jour courant (ISOWeekday de 1 à 7) // alors on met la ligne en gras et su fond gris clair if(i == ISOWeekday(Today())-1){ strHTML += "<tr style='border: 1px solid;" + border_top + ";" strHTML += "background-color: #EEEEEE;font-weight: bold'>" }else{ strHTML += "<tr style='border: 1px solid;" + border_top + ";'>" } // La première cellule contient le nom du jour strHTML += "<td style='width: 80px;padding-left: 5px;'>" + NomDuJour+"</td>" // On récupère les heures d'ouverture et de fermeture correspondant à ce // jour de la semaine var HeureOuverture = $feature["Ouverture_"+NomDuJour] var HeureFermeture = $feature["Fermeture_"+NomDuJour] // Appel de la fonction remplissant la partie horaire du calendrier strHTML += GenererPlagesHoraires(HeureMinCalendrier,HeureMaxCalendrier,HeureOuverture,HeureFermeture) // Fin du tableau strHTML += "</tr></table>" // Pour les autres jours/tableaux, la bordure supérieure sera invisible border_top = "border-top: 0px;" } strHTML += "</p>" // On renvoie le bloc de code HTML de la fenêtre contextuelle return { type : 'text', text : strHTML }
Voici un exemple de rendu de la nouvelle fenêtre contextuelle :
Bonne route sur ArcGIS Online !
Pour retrouver l'ensemble des Conseils & Astuces ArcGIS Online, cliquez sur ce lien.
3 comments :
Bonjour Gaëtan,
Excellent article.
Serait-il possible de présenter le code arcade avec 2 plages horaires (ex: de 8h30 à 11h30 puis de 13h30 à 16h30) ?
Bonjour,
Avec une petite adaptation de l'expression Arcade de cet article c'est tout à fait possible. Je vous prépare un article illustrant ce cas de figure ;-)
L'article est disponible ici : https://www.arcorama.fr/2024/01/conseils-astuces-arcgis-online-n184.html
Enregistrer un commentaire