Le blog francophone consacré
aux technologies Esri

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.
  1. 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.


  2. Vous donnerez tout d'abord un nom à votre expression, par exemple ici : "Table des horaires d'ouverture".



  3. 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
    }
    
  4. 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.

  

Partager cet article:

Rejoindre la discussion

    Les commentaires à propos de cet article:

3 comments :

Anonyme a dit…

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) ?

Gaëtan Lavenu a dit…

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 ;-)

Gaëtan Lavenu a dit…

L'article est disponible ici : https://www.arcorama.fr/2024/01/conseils-astuces-arcgis-online-n184.html