Conseils & Astuces ArcGIS Online - N°190
N° 190 - Utiliser Arcade pour afficher dans une fenêtre contextuelle les
entités à proximité
Dans mon précédent article de Conseils & Astuces ArcGIS Online n°189, je vous ai
montré comment vous pouviez utiliser une expression Arcade pour interroger,
dans une fenêtre contextuelle, les entités adjacentes au polygone cliqué par
l'utilisateur. Le langage Arcade permet ainsi d'adresser différents cas de
figure où vous aurez besoin de réaliser des recherches géographiques autour de
l'entité courante pour obtenir des informations sur d'autres entités de la
même couche (ou d'une autre couche de la carte). Par exemple, vous disposez
d'une couche des pharmacies et vous souhaitez afficher le nom des 3 pharmacies
qui sont les plus proches de celle que l(utilisateur a cliqué sur la carte.
Je vous propose de prendre cet exemple des pharmacies pour vous expliquer
comment faire ce type de recherche à l'aide d'une expression Arcade.
-
Après avoir ajouté la couche des pharmacies dans la carte, nous allons
ajouter un bloc de contenu "Arcade" dans la fenêtre contextuelle de
cette dernière.
-
Pour plus de clarté, nous donnons un titre explicite "Pharmacies à proximité" à cette nouvelle expression Arcade.
-
L'expression Arcade à saisir dans l'éditeur est alors la suivante :
Expects($feature,"*") // Nom du champ qui contient le libellé des entités, ici il // s'agit du champ contenant la raison sociale des pharmacies var field_name = "rs" // Nombre d'entités à proximité que l'on souhaite rexhercher var count_feature = 3 // Distance minimum pour la recherche, choisir une valeur priche de la Distance // moyenne séparant les entité de la couche var searchDist = 200 // Cette fonction permet de trier le tableau de résultat par distance croissantes function compareDistances(a,b){ if (a['Distance']<b['Distance']) return -1; if (a['Distance']>b['Distance']) return 1; return 0; } // récupération de la géométrie ponctuelle de l'entité var pt = Geometry($feature) // On recherche d'un premier rayon minimum autour du point var result_featureset = Intersects($layer,Buffer(pt, searchDist,"meters")) // On compte le nombre de points trouvés var cnt = Count(result_featureset) // Tant que l'on a pas le nombre suffisant de résultats // avec l'entité elle-même en plus de count_feature while(cnt<=(count_feature+1)){ searchDist = searchDist*2 result_featureset =Intersects($layer,Buffer(pt, searchDist,"meters")) cnt = Count(result_featureset) } // Création d'un tableau avec les résultats de la recherche pour pouvoir // les trier par ordre de distances croissantes var result_array = [] for (var feat in result_featureset){ // On exclut l'entité elle-même des résultats finaux if(Text(feat[field_name])!=Text($feature[field_name])){ var result_dict={} // On construit un dictionnaire "Nom","Distance" pour la fonction de tri result_dict[field_name]=feat[field_name] result_dict["Distance"]=Distance(pt, Geometry(feat), "kilometers") Push(result_array,result_dict) } } // On récupère un tableau trié sur les distances result_array = Sort(result_array, compareDistances) // On construit la chaîne HTML à renvoyer var str_HTML = "Les " + Text(count_feature) + " phamarcies les plus proches sont les suivantes :<br/>" // On démarre une liste HTML str_HTML += "<ul>" // On boucle uniquement sur le nombre "count_feature" d'entités à retourner var i=0 while (i<count_feature){ str_HTML += "<li>" + Text(result_array[i][field_name]) + " (" + Text(result_array[i]["Distance"],"0.0") + " km)</li><br/>" i+=1 } // On termine la liste HTML str_HTML += "</ul>" // On renvoie la chaîne HTML return { type : 'text', text : str_HTML }
-
La fenêtre contextuelle de notre couche des pharmacies affiche désormais la liste des 3 pharmacies les plus proches (à vol d'oiseau).
-
Il ne vous reste plus qu'à personnaliser cette expression pour l'adapter à vos données et à vos besoins.
Bonne route sur ArcGIS Online !
Pour retrouver l'ensemble des Conseils & Astuces ArcGIS Online,
cliquez sur ce lien.