Quantcast
Channel: arcOrama
Viewing all articles
Browse latest Browse all 2048

Utiliser les relations spatiales entre les couches dans vos expressions Arcade

$
0
0
Les récentes évolutions du langage d'expressions Arcade (ArcGIS Online de décembre dernier et prochaine version 10.7 d'ArcGIS Enterprise en mars prochain) permettent désormais la récupération, par relation spatiale, d'informations issues d'entités se trouvant dans d'autres couches de la carte. Ceci peut être très utile pour enrichir le contenus de vos étiquettes ou de vos fenêtres contextuelles (popups) en allant requêter dynamiquement des informations se trouvant dans d'autres couches de la carte.
  
  
Ci-dessous, quelques de cas d'usages dans lesquels ce type d'expression évoluée est particulièrement intéressant et peut éviter de lourds développements applicatifs:
  1. En cliquant sur un parc public, je souhaite afficher une fenêtre contextuelle avec ses caractéristiques mais aussi la liste des trois arrêts de bus les plus proches.
  2. En cliquant sur l'emprise de mes zones de projets immobiliers, je souhaite afficher la zone de réglementaire de PLU dans laquelle elle se trouve.
  3. En cliquant sur une parcelle cadastrale, je souhaite compter combien de bâtiments elle contient.
  4. En cliquant sur un bâtiment, je souhaite savoir si il se trouve à moins de 500 m. d'un monument historique.
  5. En cliquant sur une conduite d'eau, je veux afficher le nombre de parcelles qu'elle traverse.
  6. En cliquant sur ma ligne électrique, je souhaite connaître la proportion des différents type d'occupation des sols sur une bande de 100m le long de ma ligne.

Je ne reviendrai pas sur la manière d'ajouter une expression Arcade dans la calculatrice de champ, dans une fenêtre contextuelle ou dans les paramètres d'étiquettes, l'aide en ligne (ou cet article arcOrama) vous y aideront. En revanche, je vous propose de reprendre chacun de ces 6 exemples et de voir une expression Arcade répondant au besoin. S'agissant d'expressions parfois complexes, différentes variantes peuvent être envisagées, peut-être même plus optimisées que celles que je vous propose :-)


Exemple n°1:

On considère que votre carte contient une couche avec les parcs publics (la couche courante) et une seconde couche nommée "Arrêts de bus" qui contient les arrêts de bus. Cette dernière possède un champ "Nom" contenant le nom de l'arrêt.

L'expression Arcade pourra être la suivante:

var my_buffer = Buffer($feature, 10, 'kilometers');
var distances_arrets = [];
var i = 0;
for (var my_feature in Intersects(FeatureSetByName($map,"Arrêts de bus"),my_buffer))
{
  var d = Distance($feature,my_feature,'meters');
  distances_arrets[i] = { 'NOM': my_feature.Nom, 'DISTANCE': d };
  i++;
}

function comparer_distances(a,b){
  if (a['DISTANCE']
    return -1;
  if (a['DISTANCE']>b['DISTANCE'])
    return 1;
  return 0;
}

var distances_arrets_tries = Sort(distances_arrets, comparer_distances)
var resultat = 'Les 3 arrêts de bus les plus proches:';
for (var i=0; i<3 b="" i="">3>
{
    resultat += TextFormatting.NewLine + 
                distances_arrets_tries[i].NOM + 
                ' (' +
                Round(distances_arrets_tries[i].DISTANCE) + 
                'm.)'
}

return resultat;

 

Exemple n°2:

On considère que votre carte contient une couche avec les projets d'aménagement (la couche courante) et une seconde couche nommée "Zonage PLU" qui contient les zones réglementaires du Plan Local d'Urbanisme. Cette dernière possède un champ "Type_Zone" contenant le code de la zone réglementaire.

L'expression Arcade pourra être la suivante:

for (var my_zone in FeatureSetByName($map,"Zonage PLU")){
    if (Intersects($feature, Geometry(my_zone))){
        return my_zone["Type_Zone"];
    }
}


 
Exemple n°3:

On considère que votre carte contient une couche avec les parcelles cadastrales (la couche courante) et une seconde couche nommée "Bâtiments" qui contient les bâtiments du cadastre.

L'expression Arcade pourra être la suivante:

var intersected_features = Intersects(FeatureSetByName($map,"Bâtiments"), $feature);
var n=0;
for (var my_feature in intersected_features)
{
    var my_centroid = Centroid(my_feature);
    Console(my_centroid);
    if (Within(my_centroid,$feature)){
        n++;
    }
}
return Text(n,'#');

  

Exemple n°4:

On considère que votre carte contient une couche avec les bâtiments (la couche courante) et une seconde couche nommée "Monuments Historiques" qui contient les bâtiments classés monuments historiques.

L'expression Arcade pourra être la suivante:

var my_buffer = Buffer($feature, 500, 'meters');
var nb_monuments = Count(Intersects(FeatureSetByName($map,"Monuments Historiques"),my_buffer))
return Text(nb_monuments,"#")

  

Exemple n°5:

On considère que votre carte contient une couche avec les conduites d'un réseau de distribution d'eau (la couche courante) et une seconde couche nommée "Parcelles" qui contient les parcelles cadastrales.

L'expression Arcade pourra être la suivante:

var intersected_features = Intersects(FeatureSetByName($map,"Parcelles"), $feature);
return Text(Count(intersected_features),"#")

   
 
Exemple n°6:

On considère que votre carte contient une couche avec les lignes électriques (la couche courante) et une seconde couche nommée "Occupation du sol" qui contient l'occupation des sols décrite dans un champ "Code_Occup_Sol".

L'expression Arcade pourra être la suivante:

var my_buffer = Buffer($feature, 100, 'meters');
var area_buffer = Area(my_buffer,'meters';
var intersected_features = Intersects(FeatureSetByName($map,"Occupation du sol"),my_buffer)
var type_field_name = "Code_Occup_Sol";
var my_types = [];
var resultat = '';
var i=0;


for (var my_feature in intersected_features)
{
    my_types[i] = my_feature[type_field_name]
    i++;
}

var my_unique_types = Distinct(my_types);

for (var j=0; j
{
   var my_type = my_unique_types[j];
   my_type = Replace(my_type,"'","");
   var sqlQuery = type_field_name + ' LIKE \'%' + my_type + '%\'';
   var features_by_type = Filter(intersected_features,sqlQuery);
   var sum_area_of_my_type = 0;
   
   for (var my_feature in features_by_type)
   {
       sum_area_of_my_type += Area(Intersection(my_buffer,my_feature),'meters');
       
   }

   resultat +=  '- ' +
                my_type +
                ' à ' + 
                Text( 100 * sum_area_of_my_type / area_buffer),"#.#") + 
                '%' +
                TextFormatting.NewLine 
}

return resultat

    

En espérant que ces exemples vous donneront des idées pour créer d'autres expressions spatiales avec Arcade. N'hésitez pas à les adapter à vos contextes et à me communiquer vos cas d'usage via les commentaires au bas de cet article.
   

Viewing all articles
Browse latest Browse all 2048

Trending Articles