Le blog francophone consacré
aux technologies Esri

Conseils & Astuces ArcGIS Online - N°181

N° 181 - Afficher des jours d'ouverture dans des fenêtres contextuelles avec Arcade 

Dans mon précédent Conseils & Astuces ArcGIS Online n°180, je vous proposais 2 cas d'usage dans lesquels l'utilisation d'expressions Arcade permet de cartographier les informations sur le jour ou la date d'ouverture d'un établissement ou d'un lieu.


Dans cet article, je vous propose de voir 2 cas d'usage d'expressions Arcade pour représenter les jours d'ouverture de vos points d'intérêt. 

Exemple 1:

Le premier exemple est une couche de points contenant les déchèteries sur la région Ile-de-France. Cette dernière contient la liste des jours d'ouverture stockés dans un champ de type "Chaîne de caractères" et séparés par une virgule.



Voici comment vous pouvez représenter les déchèteries ouvertes ou fermées en fonction du jour actuel
  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 jours d'ouverture"



    Vous saisirez ensuite l'expression Arcade suivante :
    // Récupération de l'index du jour courant 
    // (Lundi = 1 et Dimanche = 7)
    var IndexJourCourant = ISOWeekday(Now()) 
    // On crée une liste des noms des jours 
    var ListeJourSemaine=["Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi","Dimanche"]
    // On récupère le nom du jour courant
    // Note: Dans une liste l'index démarre à 0, on retire donc 1 à l'index du jour courant
    var NomJourCourant = ListeJourSemaine[IndexJourCourant-1]
    
    // On initialise une variable contenant le bloc de code HTML pour la fenêtre contextuelle
    var strHTML = "<p style='font-family: Arial'>Jours d'ouverture :<br/>"
    strHTML += "<table style='border-collapse: collapse;'>"
    
    // On boucle sur chaque jour de la semaine pour créer chaque ligne du tableau
    for(var index in ListeJourSemaine) {
      var NomJour = ListeJourSemaine[index]
      var strTD = "<td style='width: 100px;'>"
      // Si la ligne actuelle correspond au jour courant, on applique un fond grisé à la cellule
      if (NomJour==NomJourCourant){
        strTD = "<td style='witdh: 100px; font-weight: bold;background-color: #CCCCCC'>"
      }
      // On teste si le jour est bien dans la liste des jours d'ouverture. Si c'est le cas
      // on affiche "Ouvert" sur un fond vert, sinon on affiche "Fermé" sur un fond rouge.
      // Il est préférable de comparer les chaînes en les mettant en minuscule
      if(Find(Lower(NomJour),Lower($Feature.Jours_Ouverture)) > -1){
        strHTML += "<tr style='border: 1px solid black;'>" + strTD + NomJour + 
        "</td><td style='width: 100px; text-align: center; color: white; 
         background-color: #00AA00'>Ouvert</td></tr>"
      }else {
        strHTML += "<tr style='border: 1px solid black;'>" + strTD + NomJour + 
        "</td><td style='width: 100px; text-align: center; color: white; 
         background-color: #AA0000'>Fermé</td></tr>"
      }
    }
    
    // On referme le tableau et le paragraphe HTML
    strHTML += "</table></p>"
    
    // On renvoie la chaîne de code HTML
    return { 
    	type : 'text', 
    	text : strHTML
    }
    
    L'expression génère un bloc de code HTML correspondant à un paragraphe de texte et un tableau. Pour remplir le tableau, on boucle sur les 7 jours de la semaine et on teste si ce jour est dans la liste de jours d'ouverture. On modifie le style des cellule en fonction du statut "Ouvert" ou "Fermé" et on affiche en gras sur fond gris le jour correspond au jour courant.

  3. Votre carte affiche désormais les fenêtres contextuelles de la couche des déchèteries comme ceci (ici le jour courant est un jeudi) :




Exemple 2:

Dans ce second exemple, nous disposons d'une couche des stations de ski en France contenant cette fois-ci des dates d'ouverture et la dates de fermeture de leur domaine skiable. L'objectif est d'afficher une carte qui indique les stations ouvertes ou fermées à la date courante ainsi que celles-qui vont prochainement ouvrir (dans 15 jours ou moins).

  1. La couche possède deux champs de type "Date uniquement" (DateOnly) permettent de stocker les dates d'ouverture et de fermeture de chaque station.



  2. De la même manière que dans le premier exemple, vous allez créer une expression spécifique pour définir le contenu de la fenêtre contextuelle. Vous saisirez ensuite l'expression Arcade suivante :
    /// Fonction permettant de construire les lignes du calendrier
    function  CalendrierDuMois(DebutMois,DateOuverture,DateFermeture){
      // Récupération du nombre de jours dans le mois
      var NombreJourDansMois = DateDiff(DateAdd(DebutMois,1,"months"),DebutMois,"days")
      // Calcul de la date du dernier jour du mois
      var FinMois = DateAdd(DebutMois,NombreJourDansMois-1,"days")
      var strTD = ""
      // Si la date d'ouverture se trouve dans ce mois (sauf premier jour)
      if(DateOuverture > DebutMois && DateOuverture <= FinMois){
        // Position du jour d'ouverture dans le mois
        var indexJourDansMois = Day(DateOuverture)
        // Calcul du nombre de pixels pour séparer les 2 blocs de couleur 
        var pixels = Floor((indexJourDansMois/NombreJourDansMois)*200)
        // Bloc gris (fermé)
        strTD += "<td style='width: "+pixels+"px;background-color: #cccccc'></td>"
        // Bloc vert (ouvert)
        strTD += "<td style='width: "+(200-pixels)+"px;background-color: #00cc00'></td>"
      }
      // Si la date d'ouverture est le premier jour ou si le mois est complémtement
      // dans la période d'ouverture
      else if (DateOuverture<=DebutMois && FinMois<=DateFermeture) {
        strTD += "<td style='width: 100px;background-color: #00CC00'></td>"
        strTD += "<td style='width: 100px;background-color: #00CC00'></td>"
      }
      // Si ma date de fermeture se trove dans le mois
      else if(DateFermeture >= DebutMois && DateFermeture <= FinMois){
        var indexJourDansMois = Day(DateFermeture)
        var pixels = Ceil((indexJourDansMois/NombreJourDansMois)*200)
        strTD += "<td style='width: "+pixels+"px;background-color: #00cc00'></td>"
        strTD += "<td style='width: "+(200-pixels)+"px;background-color: #cccccc'></td>"
      }
      return strTD
    }
    
    var ListeDesMois = ["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Aout",
                        "Septembre","Octobre","Novembre","Décembre"]
    var DateOuverture = $feature.DateOuverture
    var DateFermeture = $feature.DateFermeture
    
    // 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;'>Période d'ouverture :" +
               Text(DateOuverture,"DD/MM/YYYY") + " au " +
               Text(DateFermeture,"DD/MM/YYYY") + "<br/>"
    var DebutMois = DateOnly("01/"+ (Month(DateOuverture)+1) + "/"+Year(DateOuverture),"DD/M/YYYY") // Varaible pour gérer la bordure supérieure du premier tableau var border_top = "" // On boucle sur chaque mois de la période d'ouverture while (DebutMois <= DateFermeture) { // On démarre un nouveau tableau strHTML += "<table style='border-collapse: collapse;font-family: Arial; font-size: 10pt;'>" // La première cellule contient le mois et l'année strHTML += "<tr style='border: 1px solid;"+border_top+"'><td style='width: 150px;'>" + ListeDesMois[Month(DebutMois)] + " " + Year(DebutMois)+"</td>" // Appel de la fonction remplissant la partie calendrier strHTML += CalendrierDuMois(DebutMois,DateOuverture,DateFermeture) // Fin du tableau strHTML += "</tr></table>" DebutMois=DateAdd(DebutMois,1,"months") // Pour les autres mois/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 }

  3. La fenêtre contextuelle de la couche ressemble désormais à ceci pour la station de Tignes :



    Et à ceci pour la station du Grand Tourmalet :



Dans le prochain article, nous verrons ce qu'il est possible de faire lorsque vous souhaitez exploiter des horaires d'ouverture.


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: