<\/HEAD>
Hoje foi publicado um ótimo blog por Paul Barker<\/A> sobre as novas funções FeatureSet: O que há de novo no Arcade: Um passeio pelos FeatureSets (Parte 1)<\/A> e também Kelly Gerrow<\/A> compartilhou um ótimo documento sobre este tema: https:\/\/community.esri.com\/community\/gis\/web-gis\/arcgisonline\/blog\/2018\/12\/10\/overlapping-features-in-pop-ups-quick-introduction-to-using-featuresets-with-arcade<\/A> . <\/P><\/P>
Eu não queria ficar para trás, então pensei em compartilhar alguns exemplos usando hidrantes, o histórico de manutenção e sub setores e setores hidráulicos para mostrar o que você pode alcançar com as novas funções Arcade lançadas no ArcGIS Online em 5 de dezembro<\/P>
<\/P>
Considere que temos um mapa web com várias camadas e uma tabela:<\/P>
<\/P>
<\/P>
- Hidrantes<\/EM> é uma camada de pontos com hidrantes<\/LI>Sub Sector<\/EM> é uma camada de polígonos com uma subdivisão da área de interesse<\/LI>Sector Hidraulico<\/EM> é uma camada de polígonos que une sub setores em setores hidráulicos<\/LI>Hist Mantenimiento<\/EM> é uma tabela com os registros históricos de manutenção para cada hidrante<\/LI><\/UL><\/P>Primeiro de tudo, vamos aplicar um pouco de Arcade para visualizar os hidrantes com base na sua idade. Isso já era possível na versão anterior, então nada novo aqui ainda. Temos a data de instalação armazenada no campo FECHAINSTALACION e podemos usar as funções DateDiff<\/EM> e Now<\/EM> para determinar a idade em anos, o que acontece nas duas primeiras linhas. Depois disso classificamos o valor em faixas significativas:<\/P>
<SPAN class="keyword token">var<\/SPAN> fecha_inst <SPAN class="operator token">=<\/> $feature<SPAN class="punctuation token">.<\/>FECHAINSTALACION<SPAN class="punctuation token">;<\/>\n<SPAN class="keyword token">var<\/> edad <SPAN class="operator token">=<\/> <SPAN class="token function">DateDiff<\/>\(<SPAN class="token function">Now<\/>\(\)\, fecha_inst\, "years"\);\nvar clase_edad = "";\nif (edad > 50) {\n clase_edad = "Maior que 50 anos";\n} else if (edad > 40) {\n clase_edad = "Entre 40 e 50 anos";\n} else if (edad > 30) {\n clase_edad = "Entre 30 e 40 anos";\n} else if (edad > 20) {\n clase_edad = "Entre 20 e 30 anos";\n} else if (edad > 10) {\n clase_edad = "Entre 10 e 20 anos";\n} else if (edad > 5) {\n clase_edad = "Entre 5 e 10 anos";\n} else {\n clase_edad = "Menor que 5 anos";\n}\nreturn clase_edad;\n
<\/P>O resultado é um texto descrevendo a idade, para o qual podemos definir símbolos representativos (aqui usando os símbolos Firefly):<\/P>
<\/P><\\/P>Nenhum símbolo chamativo para as outras duas camadas de polígonos para evitar distrair a atenção dos hidrantes.<\\/P>
Desejamos mostrar na janela pop-up de cada hidrante a lista de todas as manutenções realizadas no hidrante. Tanto a tabela do histórico de manutenção quanto a camada dos hidrantes contêm o ID do hidrante. A tabela também contém as datas e tipos de manutenção.<\\/P>
No configuração do pop-up dos hidrantes podemos adicionar uma expressão Arcade como esta:<\\/P>
var tbl = FeatureSetByName($datastore,"Hist_Mantenimiento");
var codigo = $feature["COD_HIDRANTE"];
var sql = "COD_HIDRANTE = '" + codigo + "'";
Console(sql);
var mantenimientos = Filter(tbl, sql);
var cnt = Count(mantenimientos);
var historia = "";
if (cnt > 0) {
historia = cnt + " Manutenção(s):";
<SPAN class="keyword token">para</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="keyword token">var</SPAN> mantenimiento <SPAN class="keyword token">em</SPAN> mantenimientos<SPAN class="punctuation token">)</SPAN> <SPAN class="punctuation token">{</SPAN>
<SPAN class="keyword token">var</SPAN> txt_fecha <SPAN class="operator token">=</SPAN> <SPAN class="token function">Text</SPAN><SPAN class="punctuation token">(</SPAN>mantenimiento<SPAN class="punctuation token">.</SPAN>Fecha_Mantenimiento<SPAN class="punctuation token">,</SPAN> <SPAN class="string token">' - (Y/MM/DD) '</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="keyword token">var</SPAN> txt_man <SPAN class="operator token">=</SPAN> txt_fecha <SPAN class="operator token">+</SPAN> mantenimiento<SPAN class="punctuation token">.</SPAN>Mantenimiento<SPAN class="punctuation token">;</SPAN>
historia <SPAN class="operator token">+=</SPAN> TextFormatting<SPAN class="punctuation token">.</SPAN>NewLine <SPAN class="operator token">+</SPAN> txt_man<SPAN class="punctuation token">;</SPAN>
<span class="punctuation token">}</span>
<span class="punctuation token">}</span> <span class="keyword token">senão</span> <span class="punctuation token">{</span>
historia <span class="operator token">=</span> <span class="string token">"Não há mantenimentos"</span><span class="punctuation token">;</span>
<span class="punctuation token">}</span>
<span class="keyword token">retornar</span> historia<span class="punctuation token">;</span>
<span class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span>Primeiro, acessamos a tabela com o histórico de manutenção e a atribuímos a uma variável tbl. Em seguida, lemos o id do hidrante atual para o qual queremos criar o pop-up. Definimos uma expressão SQL usando o ID do hidrante que é então usada para filtrar a tabela de histórico. O resultado é armazenado em uma variável chamada mantenimientos. Podemos fazer um Count para obter o número de manutenções realizadas no hidrante. Se a contagem (cnt) for maior que 0, começamos a ler os detalhes e construir uma lista de manutenções incluindo a data e o tipo de manutenção.
O resultado aparecerá assim depois que configurarmos um html personalizado simples para mostrar os atributos e o resultado da expressão Arcade no pop-up:

Agora vamos continuar fazendo algo com essas novas funções Arcade para obter alguns dados dos hidrantes no nível do sub setor. Como o número de manutenções obviamente depende da idade do hidrante, seria bom obter alguns detalhes sobre isso no nível do sub setor.
No pop-up de configuração dos sub setores podemos adicionar a seguinte expressão Arcade:
<SPAn class="keyword token">var</SPAn> fs <SPAn class="operator token">=</SPAn> <SPAn class="token function">FeatureSetByName</SPAn>( $datastore , "Hidrantes" ) ;
<SPAn class="keyword token">var</SPAn> hidrantes <SPAn class="operator token">=</SPAn> <SPAn class="token function">Intersects</SPAn>( fs , $feature ) ;
<SPAn class="keyword token">var</SPAn> cnt <SPAn class="operator token">=</SPAn> <SPAn class="token function">Count</SPAn>( hidrantes ) ;
<SPAn class="keyword token">var</SPAn> edad_tot <SPAn class="operator token">=</SPAn> 0 ;
<SPAn class="keyword token">para</SPAn>( <SPAn class="keyword token">var</SPAn> hidrante <SPAn class="keyword token">em</SPAn> hidrantes ) {
<SPAn class="keyword token">var</SPAn> edad <SPAn class="operator token">=</SPAn> <SPAn class="token function">DateDiff</SPAn>( <SPAn class="token function">Now</SPAn>(), hidrante.FECHAINSTALACION, "years" ) ;
edad_tot <SPAn class="operator token">+=</SPAn> edad ;
}
<SPAn class="keyword token">var</SPAn> resultado <SPAn class="operator token">=</SPAn> "" ;
<SPAn class="keyword token">se</SPAn>( cnt > 0 ) {
<SPAn class="keyword token">var</SPAn> edad_media <SPAn class="operator token">=</SPAn> edad_tot / cnt ;
resultado = "Há " + cnt + " hidrantes no sub setor" ;
resultado += TextFormatting.NewLine + "A idade média dos hidrantes é de " + <SPAn class="token function">Round</SPAn>( edad_media , 2 ) + " anos" ;
} senão {
resultado = "Não há hidrantes no sub setor" ;
}
retornar resultado ;
<span class="line-numbers-rows"><span><<EMOJI_19>></span><span><<EMOJI_20>></span><span><<EMOJI_21>></span><span><<EMOJI_22>></span><span><<EMOJI_23>></span><span><<EMOJI_24>></span><span><<EMOJI_25>></span><span><<EMOJI_26>></span><span><<EMOJI_27>></span><span><<EMOJI_28>></span><span><<EMOJI_29>></span><span><<EMOJI_30>></span><span><<EMOJI_31>></span><span><<EMOJI_32>></span><span><<EMOJI_33>></span><span><<EMOJI_34>></span><span><<EMOJI_35>></span><span><<EMOJI_36>></span><span><<EMOJI_37>></span><Span><<EMOJI_38>></Span></Span>
Esta expressão irá:
- Acessar a camada Hydrants
- Cruzar com a feição atual do sub setor (intersect)
- Contar o número de hidrantes no sub setor
- Cacular a idade de cada hidrante e somar todas as idades
- Cacular a idade média dos hidrantes e formatar o texto com essa informação
O resultado aparecerá assim:

Neste caso, há 93 hidrantes no sub setor e a idade média é de 20,64 anos.
Isto é divertido, mas podemos também mostrar os nomes dos sub setores que estão contidos por um setor hidráulico usando essas novas funções Arcade? A resposta é sim. Vamos adicionar a seguinte expressão aos setores hidráulicos:
<span class='keyword token'>var </Span> fs = FeatureSetByName($datastore, "Sub Sector");
<span class='keyword token'>var </Span> subsectores = Intersects(fs, $feature);
<span class='keyword token'>var </Span> cnt = Count(subsectores);
<span class='keyword token'>var </Span> resultado = "Listado de los " + cnt + " Subsectores:";
<span class="keyword token">for<\/SPAN> <SPAN class="punctuation token">(<\/SPAN><SPAN class="keyword token">var<\/SPAN> subsector <SPAN class="keyword token">in<\/SPAN> subsectores<SPAN class="punctuation token">)<\/SPAN> <SPAN class="punctuation token">{<\/SPAN>
resultado <SPAN class="operator token">+<\/SPAN><SPAN class="operator token">=<\/SPAN> TextFormatting<SPAN class="punctuation token">.<\/SPAN>NewLine <SPAN class="operator token">+<\/SPAN> subsector<SPAN class="punctuation token">.<\/SPAN>IDSAP<SPAN class="punctuation token">;<\/SPAN>
<SPAN class="punctuation token">}<\/SPAN>
<SPAN class="keyword token">return<\/SPAN> resultado<SPAN class="punctuation token">;<\/SPAN>
<SPAN class="line-numbers-rows"><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><\/SPAN><\/CODE><\/PRE><P><\/P><P>Apenas acesse a camada de sub setores e Intersect com o setor hidráulico atual e voilà3, certo? Ne3o, ne3o te3o certo assim. Quando vocea usa um Intersect entre duas camadas de poledgonos, provavelmente retornare1 muitas feie7f5es devido ao fato de que quando dois poledgonos team uma fronteira correspondente eles provavelmente sere3o inclueddos no resultado, levando a mais sub setores do que queremos.<\/P><P><\/P><P>Uma maneira de evitar isso e9 usar um buffer negativo pequeno no setor hidre1ulico e fazer o Intersect com essa geometria bufferizada assim:<\/P><PRE class="lia-code-sample line-numbers language-none"><CODE><SPAN class="keyword token">var<\/SPAN> fs <SPAN class="operator token">=<\/SPAN> <SPAN class="token function">FeatureSetByName<\/SPAN><SPAN class="punctuation token">(<\/SPAN>$datastore<SPAN class="punctuation token">,<\/SPAN><SPAN class="string token">"Sub Sector"<\/SPAN><SPAN class="punctuation token">)<\/SPAN><SPAN class="punctuation token">;<\/SPAN>
<SPAN class="keyword token">var<\/SPAN> feature_buf <SPAN class="operator token">=<\/SPAN> <SPAN class="token function">Buffer<\/Span>(<$feature>, -100, 'meters');
var subsectores = Intersects(fs, feature_buf);
var cnt = Count(subsectores);
var resultado = "Listado de los " + cnt + " Subsectores:";
for (var subsector in subsectores) {
resultado += TextFormatting.NewLine + subsector.IDSAP;
}
return resultado;
<span class="line-numbers-rows"><span><<EMOJI_10>></span><span><<EMOJI_11>></span><span><<EMOJI_12>></span><span><<EMOJI_13>></span><span><<EMOJI_14>></span><span><<EMOJI_15>></span><span><<EMOJI_16>></span><span><<EMOJI_17>></span><span><<EMOJI_18>></span><span><<EMOJI_19>></span></span>
Note o Buffer com uma diste2ncia negativa que e9 criado na linha 2 e usado na linha 3 para obter os poledgonos corretos.
A janela pop-up resultante aparecere1 assim:

Sendo honesto, ne3o gosto da lista ne3o ordenada de sub setores, ent0e3o vamos ordenar essa lista usando OrderBy:
var fs = FeatureSetByName($datastore,"Sub Sector");
var feature_buf = Buffer($feature, -100, 'meters');
var subsectores = OrderBy(Intersects(fs, feature_buf), 'IDSAP ASC');
var cnt = Count(subsectores);
var resultado = "Listado de los " + cnt + " Subsectores:";
for (var subsector in subsectores) {
resultado += TextFormatting.NewLine + subsector.IDSAP;
}
return resultado;
<span class="line-numbers-rows"><span><<EMOJI_21>></span><span><<EMOJI_22>></span></span>
Que resultare1 em uma lista ordenada de sub setores:

Espero que esses exemplos ajudem voca a entender o que 9 possdvel usando Arcade com a altima atualiza73o no ArcGIS Online, mas antes de voca mergulhar e comece a criar expresses fabulosas Arcade quero citar o Tio Ben (Spider-Man) por um momento:
Com grande poder vem grande responsabilidade...
Como Paul Barker menciona em seu blog, tenha cuidado e sempre valide se o desempenho das suas expressões resulta em um tempo de resposta aceitável para seu usu1rio final.