Le blog francophone consacré
aux technologies Esri

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.

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


  2. Pour plus de clarté, nous donnons un titre explicite "Pharmacies à proximité" à cette nouvelle expression Arcade.


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

  4. La fenêtre contextuelle de notre couche des pharmacies affiche désormais la liste des 3 pharmacies les plus proches (à vol d'oiseau).



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

  

Partager cet article:

Rejoindre la discussion

    Les commentaires à propos de cet article: