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.
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
- 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 jours d'ouverture"
Vous saisirez ensuite l'expression Arcade suivante :
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.// 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 }
- 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).
- La couche possède deux champs de type "Date uniquement" (DateOnly) permettent de stocker les dates d'ouverture et de fermeture de chaque station.
- 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 }
- 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.
0 comments :
Enregistrer un commentaire