<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>Hendesson</title>
<link>https://hendesson.github.io/artigos/</link>
<atom:link href="https://hendesson.github.io/artigos/index.xml" rel="self" type="application/rss+xml"/>
<description>Artigos práticos com dados públicos do INPE, MMA, IBAMA e SICAR. Cada artigo traz a versão para cada programa, com o código testado.</description>
<image>
<url>https://hendesson.github.io/../imagens/artigos/capa_artigos.png</url>
<title>Hendesson</title>
<link>https://hendesson.github.io/artigos/</link>
</image>
<generator>quarto-1.10.19</generator>
<lastBuildDate>Thu, 29 Oct 2026 00:00:00 GMT</lastBuildDate>
<item>
  <title>Do ArcMap ao QGIS: a mesma ferramenta em cada programa</title>
  <dc:creator>Hendesson Alves</dc:creator>
  <link>https://hendesson.github.io/artigos/01-equivalencias.html</link>
  <description><![CDATA[ 





<div class="ficha">
<p><span class="rotulo">Nível</span> Iniciante <span class="rotulo">Leitura</span> 6 min <span class="rotulo">Dados</span> outubro de 2026 <span class="rotulo">Programas</span> <span class="selo-texto">ArcGIS</span> <img src="https://hendesson.github.io/imagens/ferramentas/qgis.svg" class="img-fluid" alt="QGIS"> <img src="https://hendesson.github.io/imagens/ferramentas/postgis.svg" class="img-fluid" alt="PostGIS"> <img src="https://hendesson.github.io/imagens/ferramentas/python.svg" class="img-fluid" alt="Python"></p>
</div>
<p>Muitos scripts de monitoramento foram escritos para o <strong>ArcMap</strong> (Python 2 e <code>arcpy.mapping</code>), depois migrados às pressas para o <strong>ArcGIS Pro</strong>. Quem sai de um órgão público, ou quer rodar a mesma análise sem licença, precisa saber <strong>qual ferramenta faz a mesma coisa</strong> em outro programa.</p>
<p>Este artigo é a referência dos outros artigos: uma tabela de equivalências e as mudanças mais comuns ao atualizar um script antigo.</p>
<div class="faixa-icones">
<p><span class="selo-texto">ArcGIS</span> <img src="https://hendesson.github.io/imagens/ferramentas/qgis.svg" class="img-fluid" alt="QGIS"> <img src="https://hendesson.github.io/imagens/ferramentas/postgis.svg" class="img-fluid" alt="PostGIS"> <img src="https://hendesson.github.io/imagens/ferramentas/python.svg" class="img-fluid" alt="Python"> <img src="https://hendesson.github.io/imagens/ferramentas/pandas.svg" class="img-fluid" alt="pandas"></p>
</div>
<section id="as-ferramentas-lado-a-lado" class="level2">
<h2 class="anchored" data-anchor-id="as-ferramentas-lado-a-lado">As ferramentas lado a lado</h2>
<p>As colunas mostram o nome da ferramenta (ArcGIS), o identificador do algoritmo no QGIS (o mesmo usado em <code>processing.run</code>), a função do PostGIS e o método do geopandas.</p>
<table class="caption-top table">
<colgroup>
<col style="width: 16%">
<col style="width: 16%">
<col style="width: 16%">
<col style="width: 16%">
<col style="width: 16%">
<col style="width: 16%">
</colgroup>
<thead>
<tr class="header">
<th>Operação</th>
<th>ArcMap 10.x</th>
<th>ArcGIS Pro (<code>arcpy</code>)</th>
<th>QGIS (Processamento)</th>
<th>PostGIS</th>
<th>Python (geopandas)</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Selecionar por atributo</td>
<td><code>Select_analysis</code></td>
<td><code>analysis.Select</code></td>
<td><code>native:extractbyexpression</code></td>
<td><code>WHERE</code></td>
<td><code>gdf[gdf.ano == 2025]</code></td>
</tr>
<tr class="even">
<td>Selecionar por localização</td>
<td><code>SelectLayerByLocation_management</code></td>
<td><code>management.SelectLayerByLocation</code></td>
<td><code>native:extractbylocation</code></td>
<td><code>WHERE EXISTS (… ST_Intersects …)</code></td>
<td><code>gpd.sjoin(…, predicate="intersects")</code></td>
</tr>
<tr class="odd">
<td>Recortar</td>
<td><code>Clip_analysis</code></td>
<td><code>analysis.PairwiseClip</code></td>
<td><code>native:clip</code></td>
<td><code>ST_Intersection</code></td>
<td><code>gpd.clip</code></td>
</tr>
<tr class="even">
<td>Interseção (com atributos das duas camadas)</td>
<td><code>Intersect_analysis</code></td>
<td><code>analysis.PairwiseIntersect</code></td>
<td><code>native:intersection</code></td>
<td><code>ST_Intersection</code> + <code>JOIN</code></td>
<td><code>gpd.overlay(how="intersection")</code></td>
</tr>
<tr class="odd">
<td>Apagar (o que fica fora)</td>
<td><code>Erase_analysis</code> (só licença Advanced)</td>
<td><code>analysis.PairwiseErase</code></td>
<td><code>native:difference</code></td>
<td><code>ST_Difference</code></td>
<td><code>gpd.overlay(how="difference")</code></td>
</tr>
<tr class="even">
<td>Buffer</td>
<td><code>Buffer_analysis</code></td>
<td><code>analysis.PairwiseBuffer</code></td>
<td><code>native:buffer</code></td>
<td><code>ST_Buffer(geom::geography, m)</code></td>
<td><code>gdf.to_crs(5880).buffer(m)</code></td>
</tr>
<tr class="odd">
<td>Dissolver</td>
<td><code>Dissolve_management</code></td>
<td><code>analysis.PairwiseDissolve</code></td>
<td><code>native:dissolve</code></td>
<td><code>ST_Union</code> + <code>GROUP BY</code></td>
<td><code>gdf.dissolve(by=…)</code></td>
</tr>
<tr class="even">
<td>Agrupar polígonos próximos</td>
<td><code>AggregatePolygons_cartography</code></td>
<td><code>cartography.AggregatePolygons</code></td>
<td><code>native:buffer</code> + <code>native:dissolve</code></td>
<td><code>ST_ClusterDBSCAN</code>, <code>ST_ClusterWithin</code></td>
<td>buffer + <code>unary_union</code></td>
</tr>
<tr class="odd">
<td>Juntar tabela por campo</td>
<td><code>JoinField_management</code></td>
<td><code>management.JoinField</code></td>
<td><code>native:joinattributestable</code></td>
<td><code>JOIN … USING (cnuc)</code></td>
<td><code>df.merge(…)</code></td>
</tr>
<tr class="even">
<td>Juntar por localização</td>
<td><code>SpatialJoin_analysis</code></td>
<td><code>analysis.SpatialJoin</code></td>
<td><code>native:joinattributesbylocation</code></td>
<td><code>JOIN … ON ST_Intersects(…)</code></td>
<td><code>gpd.sjoin</code></td>
</tr>
<tr class="odd">
<td>Tabela resumo</td>
<td><code>Frequency_analysis</code></td>
<td><code>analysis.Statistics</code></td>
<td><code>qgis:statisticsbycategories</code></td>
<td><code>GROUP BY</code></td>
<td><code>groupby().agg()</code></td>
</tr>
<tr class="even">
<td>Área em hectares</td>
<td><code>!shape.geodesicArea@hectares!</code></td>
<td><code>CalculateGeometryAttributes</code> (<code>AREA_GEODESIC</code>)</td>
<td><code>$area / 10000</code> (elipsoidal)</td>
<td><code>ST_Area(geom::geography) / 10000</code></td>
<td><code>to_crs("ESRI:102033").area / 10000</code></td>
</tr>
<tr class="odd">
<td>Polígono → ponto</td>
<td><code>FeatureToPoint_management</code></td>
<td><code>management.FeatureToPoint</code> (<code>INSIDE</code>)</td>
<td><code>native:pointonsurface</code></td>
<td><code>ST_PointOnSurface</code></td>
<td><code>representative_point()</code></td>
</tr>
<tr class="even">
<td>Corrigir geometria</td>
<td><code>RepairGeometry_management</code></td>
<td><code>management.RepairGeometry</code></td>
<td><code>native:fixgeometries</code></td>
<td><code>ST_MakeValid</code></td>
<td><code>make_valid()</code></td>
</tr>
<tr class="odd">
<td>Densidade Kernel</td>
<td><code>sa.KernelDensity</code></td>
<td><code>sa.KernelDensity</code></td>
<td><code>native:heatmapkerneldensityestimation</code></td>
<td>grade + soma ponderada</td>
<td><code>numpy</code></td>
</tr>
<tr class="even">
<td>Estatística zonal</td>
<td><code>sa.ZonalStatisticsAsTable</code></td>
<td><code>sa.ZonalStatisticsAsTable</code></td>
<td><code>native:zonalstatisticsfb</code></td>
<td><code>ST_SummaryStats</code> (<code>postgis_raster</code>)</td>
<td><code>rasterstats.zonal_stats</code></td>
</tr>
<tr class="odd">
<td>Apagar e anexar registros</td>
<td><code>DeleteFeatures</code> + <code>Append</code></td>
<td><code>DeleteFeatures</code> + <code>Append</code></td>
<td>salvar por cima da camada</td>
<td><code>DELETE</code> + <code>INSERT</code>, <code>ON CONFLICT</code></td>
<td><code>to_postgis(if_exists=…)</code></td>
</tr>
<tr class="even">
<td>Mapas em série</td>
<td><code>arcpy.mapping</code> (<code>.mxd</code>)</td>
<td><code>arcpy.mp</code> (<code>.aprx</code>), série de mapas</td>
<td>Atlas</td>
<td>não se aplica</td>
<td>laço com <code>matplotlib</code></td>
</tr>
</tbody>
</table>
<div class="callout callout-style-default callout-tip callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Dica</span>Por que “Pairwise”?
</div>
</div>
<div class="callout-body-container callout-body">
<p>No ArcGIS Pro, as ferramentas <code>Pairwise…</code> (Clip, Intersect, Erase, Dissolve, Buffer) usam processamento paralelo e costumam ser bem mais rápidas que as clássicas. Para os cruzamentos destes artigos, o resultado é o mesmo.</p>
</div>
</div>
</section>
<section id="cada-programa-em-uma-frase" class="level2">
<h2 class="anchored" data-anchor-id="cada-programa-em-uma-frase">Cada programa em uma frase</h2>
<dl>
<dt><span class="selo-texto">ArcGIS Pro</span></dt>
<dd>
Pago. O <code>arcpy</code> vem junto e roda no Python do próprio ArcGIS. Bom quando a instituição já tem licença e publica no ArcGIS Online.
</dd>
<dt>QGIS</dt>
<dd>
Gratuito. Tudo o que se faz nos menus vira um algoritmo de <strong>Processamento</strong>, que pode ser chamado no console Python (<code>processing.run</code>), em modelos gráficos ou pelo terminal (<code>qgis_process</code>).
</dd>
<dt>PostGIS</dt>
<dd>
Gratuito. Melhor quando os dados são muitos, ficam guardados num banco e a análise se repete toda semana. O resultado já fica pronto para o Power BI.
</dd>
<dt>Python (geopandas)</dt>
<dd>
Gratuito. Bom para automatizar sem abrir programa nenhum e para gerar gráficos e mapas. Para dados muito grandes, deixe o cruzamento pesado no PostGIS.
</dd>
</dl>
</section>
<section id="atualizando-um-script-antigo-do-arcmap" class="level2">
<h2 class="anchored" data-anchor-id="atualizando-um-script-antigo-do-arcmap">Atualizando um script antigo do ArcMap</h2>
<p>Os scripts do ArcMap usam <strong>Python 2.7</strong>. O ArcGIS Pro usa <strong>Python 3</strong>. As mudanças que mais aparecem:</p>
<table class="caption-top table">
<colgroup>
<col style="width: 33%">
<col style="width: 33%">
<col style="width: 33%">
</colgroup>
<thead>
<tr class="header">
<th>No script antigo</th>
<th>No ArcGIS Pro</th>
<th>Por quê</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><code>print "texto"</code></td>
<td><code>print("texto")</code></td>
<td>Python 3</td>
</tr>
<tr class="even">
<td><code>arcpy.SearchCursor(fc)</code> e <code>row.getValue("campo")</code></td>
<td><code>arcpy.da.SearchCursor(fc, ["campo"])</code></td>
<td>os cursores <code>da</code> são muito mais rápidos</td>
</tr>
<tr class="odd">
<td><code>arcpy.mapping.MapDocument("x.mxd")</code></td>
<td><code>arcpy.mp.ArcGISProject("x.aprx")</code></td>
<td>o <code>.mxd</code> não existe no Pro (importe-o com <strong>Inserir → Importar mapa</strong>)</td>
</tr>
<tr class="even">
<td><code>arcpy.mapping.ExportToJPEG(mxd, …)</code></td>
<td><code>layout.exportToJPEG(…)</code></td>
<td>a exportação passa a ser feita pelo layout</td>
</tr>
<tr class="odd">
<td><code>"PYTHON_9.3"</code> em <code>CalculateField</code></td>
<td><code>"PYTHON3"</code></td>
<td>o tipo de expressão mudou</td>
</tr>
<tr class="even">
<td><code>"in_memory\\x"</code></td>
<td><code>"memory\\x"</code></td>
<td>o espaço de trabalho em memória do Pro</td>
</tr>
<tr class="odd">
<td>caixa de ferramentas <code>.tbx</code></td>
<td><code>.atbx</code></td>
<td>o Pro ainda abre <code>.tbx</code>, mas salva em <code>.atbx</code></td>
</tr>
<tr class="even">
<td>arquivos com acentos em ISO-8859-1</td>
<td>salve em UTF-8</td>
<td>o Python 3 lê UTF-8 por padrão</td>
</tr>
</tbody>
</table>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Aviso</span>Três armadilhas que encontrei em scripts antigos
</div>
</div>
<div class="callout-body-container callout-body">
<ol type="1">
<li><strong>Funções chamadas <code>max</code> e <code>min</code></strong> que substituem as do Python e ordenam a lista inteira a cada linha lida. Com 100 mil linhas, isso trava o script. Use o <code>max()</code> do próprio Python sobre o cursor, ou a ferramenta <strong>Estatísticas</strong>.</li>
<li><strong>Vírgula como separador decimal</strong> em parâmetros de texto (<code>"0,0015"</code>) misturada com ponto (<code>"0.0015"</code>) no mesmo script. O resultado muda conforme o idioma do Windows. Passe números como números, não como texto.</li>
<li><strong>Caminhos de rede e senhas escritos no código.</strong> Leia caminhos de parâmetros da ferramenta (<code>GetParameterAsText</code>) e senhas de variáveis de ambiente ou de um arquivo fora do script. O <a href="../guia-espacial/curso/06-python.html">Módulo 6</a> mostra como.</li>
</ol>
</div>
</div>
</section>
<section id="de-ferramenta-de-script-do-arcgis-a-script-do-qgis" class="level2">
<h2 class="anchored" data-anchor-id="de-ferramenta-de-script-do-arcgis-a-script-do-qgis">De ferramenta de script do ArcGIS a script do QGIS</h2>
<p>No ArcGIS, um script vira ferramenta lendo parâmetros com <code>arcpy.GetParameterAsText(0)</code>. No QGIS, o equivalente é um <strong>script de Processamento</strong>, que aparece na Caixa de Ferramentas com formulário próprio:</p>
<div class="tabset-margin-container"></div><div class="panel-tabset" data-group="programa">
<ul class="nav nav-tabs"><li class="nav-item"><a class="nav-link active" id="tabset-1-1-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-1" aria-controls="tabset-1-1" aria-selected="true" href="">ArcGIS Pro</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-2-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-2" aria-controls="tabset-1-2" aria-selected="false" href="">QGIS</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-3-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-3" aria-controls="tabset-1-3" aria-selected="false" href="">PostGIS</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-4-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-4" aria-controls="tabset-1-4" aria-selected="false" href="">Python</a></li></ul>
<div class="tab-content" data-group="programa">
<div id="tabset-1-1" class="tab-pane active" aria-labelledby="tabset-1-1-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> arcpy</span>
<span id="cb1-2"></span>
<span id="cb1-3">entrada <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.GetParameterAsText(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)   <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># camada de alertas</span></span>
<span id="cb1-4">ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.GetParameterAsText(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)       <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># limites das UCs</span></span>
<span id="cb1-5">saida <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.GetParameterAsText(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>)     <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># camada de saída</span></span>
<span id="cb1-6"></span>
<span id="cb1-7">arcpy.analysis.PairwiseIntersect([entrada, ucs], saida)</span>
<span id="cb1-8">arcpy.AddMessage(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Pronto."</span>)</span></code></pre></div></div>
<p>Na caixa de ferramentas: botão direito → <strong>Novo → Ferramenta de script</strong>, e declare os três parâmetros.</p>
</div>
<div id="tabset-1-2" class="tab-pane" aria-labelledby="tabset-1-2-tab">
<p>Salve em <strong>Caixa de Ferramentas → Scripts → Criar novo script</strong>:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb2-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> qgis.processing <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> alg</span>
<span id="cb2-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> processing</span>
<span id="cb2-3"></span>
<span id="cb2-4"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">@alg</span>(name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"alertas_em_ucs"</span>, label<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Alertas em UCs"</span>, group<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"monitoramento"</span>,</span>
<span id="cb2-5">     group_label<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Monitoramento"</span>)</span>
<span id="cb2-6"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">@alg.input</span>(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">type</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alg.SOURCE, name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ENTRADA"</span>, label<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Camada de alertas"</span>)</span>
<span id="cb2-7"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">@alg.input</span>(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">type</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alg.SOURCE, name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"UCS"</span>, label<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Limites das UCs"</span>)</span>
<span id="cb2-8"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">@alg.input</span>(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">type</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alg.SINK, name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SAIDA"</span>, label<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Alertas em UCs"</span>)</span>
<span id="cb2-9"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> alertas_em_ucs(instance, parameters, context, feedback, inputs):</span>
<span id="cb2-10">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""Cruza os alertas com as UCs e mantém os atributos das duas camadas."""</span></span>
<span id="cb2-11">    resultado <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> processing.run(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:intersection"</span>, {</span>
<span id="cb2-12">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"INPUT"</span>: parameters[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ENTRADA"</span>], <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"OVERLAY"</span>: parameters[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"UCS"</span>],</span>
<span id="cb2-13">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"OUTPUT"</span>: parameters[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SAIDA"</span>]}, context<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>context, feedback<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>feedback)</span>
<span id="cb2-14">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> {<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SAIDA"</span>: resultado[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"OUTPUT"</span>]}</span></code></pre></div></div>
</div>
<div id="tabset-1-3" class="tab-pane" aria-labelledby="tabset-1-3-tab">
<p>No banco, a “ferramenta” é uma consulta salva como <strong>view</strong> (ou uma função SQL):</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode sql code-with-copy"><code class="sourceCode sql"><span id="cb3-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">CREATE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">OR</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">REPLACE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">VIEW</span> alertas_em_ucs <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span></span>
<span id="cb3-2"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> a.<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>, u.cnuc, u.nome_uc,</span>
<span id="cb3-3">       ST_Intersection(a.geom, u.geom) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> geom_uc</span>
<span id="cb3-4"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.deter a</span>
<span id="cb3-5"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">JOIN</span> artigos.ucs u <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ON</span> ST_Intersects(a.geom, u.geom);</span></code></pre></div></div>
</div>
<div id="tabset-1-4" class="tab-pane" aria-labelledby="tabset-1-4-tab">
<p>Um script com argumentos de linha de comando:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb4-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> sys</span>
<span id="cb4-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> geopandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> gpd</span>
<span id="cb4-3"></span>
<span id="cb4-4">entrada, ucs, saida <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> sys.argv[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>:<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>]</span>
<span id="cb4-5">alertas <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.read_file(entrada)</span>
<span id="cb4-6">limites <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.read_file(ucs).to_crs(alertas.crs)</span>
<span id="cb4-7">gpd.overlay(alertas, limites, how<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"intersection"</span>).to_file(saida)</span></code></pre></div></div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb5-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">python</span> alertas_em_ucs.py deter.gpkg ucs.gpkg alertas_ucs.gpkg</span></code></pre></div></div>
</div>
</div>
</div>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
Nota
</div>
</div>
<div class="callout-body-container callout-body">
<p>As abas acima ficam <strong>sincronizadas</strong> em todos os artigos: escolha o seu programa uma vez e os outros artigos já abrem nele.</p>
</div>
</div>
</section>
<section id="próximos-artigos" class="level2">
<h2 class="anchored" data-anchor-id="próximos-artigos">Próximos artigos</h2>
<p>Os artigos seguintes usam esta tabela na prática, sempre com as quatro versões. Comece por <a href="../artigos/02-interior-entorno.html">Interior e entorno das UCs</a>.</p>
<div class="navegacao-livro">
<p><a href="../artigos/02-interior-entorno.html" class="proximo"><span class="direcao">Próximo →</span> Interior e entorno das UCs: o cruzamento que todo relatório usa</a></p>
</div>
</section>
<section id="atualizações" class="level2 unnumbered">
<h2 class="unnumbered anchored" data-anchor-id="atualizações">Atualizações</h2>
<ul>
<li><strong>29/10/2026:</strong> publicação, com dados do INPE, do MMA, do IBAMA e do SICAR de outubro de 2026.</li>
</ul>
<p><a href="https://hendesson.github.io/en/articles/01-equivalences.html">English version</a></p>


</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> De volta ao topo</a><div id="quarto-appendix" class="default"><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Licença</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/deed.pt_br">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Como citar</h2><div><div class="quarto-appendix-secondary-label">BibTeX</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@misc{alves2026,
  author = {Alves, Hendesson},
  publisher = {Hendesson Alves},
  title = {Do ArcMap ao QGIS: a mesma ferramenta em cada programa},
  date = {2026-10-29},
  url = {https://hendesson.github.io/artigos/01-equivalencias.html},
  doi = {10.5281/zenodo.23780245},
  langid = {pt-BR},
  abstract = {Ainda usa scripts do ArcMap ou quer sair da licença? Este
    artigo traz a tabela de equivalências entre ArcMap, ArcGIS Pro,
    QGIS, PostGIS e geopandas para as ferramentas de geoprocessamento
    mais comuns, e as mudanças que quase todo script antigo precisa para
    rodar hoje.}
}
</code></pre><div class="quarto-appendix-secondary-label">Por favor, cite este trabalho como:</div><div id="ref-alves2026" class="csl-entry quarto-appendix-citeas">
Alves, Hendesson. 2026. <span>“Do ArcMap ao QGIS: a mesma ferramenta em
cada programa.”</span> In <em>Artigos de geoprocessamento para
monitoramento ambiental</em>. Preprint, Hendesson Alves, October 29. <a href="https://doi.org/10.5281/zenodo.23780245">https://doi.org/10.5281/zenodo.23780245</a>.
</div></div></section></div> ]]></description>
  <category>Fundamentos</category>
  <category>ArcMap</category>
  <guid>https://hendesson.github.io/artigos/01-equivalencias.html</guid>
  <pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate>
  <media:content url="https://hendesson.github.io/imagens/artigos/equivalencias.png" medium="image" type="image/png" height="69" width="144"/>
</item>
<item>
  <title>Interior e entorno das UCs: o cruzamento que todo relatório usa</title>
  <dc:creator>Hendesson Alves</dc:creator>
  <link>https://hendesson.github.io/artigos/02-interior-entorno.html</link>
  <description><![CDATA[ 





<div class="ficha">
<p><span class="rotulo">Nível</span> Iniciante <span class="rotulo">Leitura</span> 9 min <span class="rotulo">Dados</span> outubro de 2026 <span class="rotulo">Programas</span> <span class="selo-texto">ArcGIS</span> <img src="https://hendesson.github.io/imagens/ferramentas/qgis.svg" class="img-fluid" alt="QGIS"> <img src="https://hendesson.github.io/imagens/ferramentas/postgis.svg" class="img-fluid" alt="PostGIS"> <img src="https://hendesson.github.io/imagens/ferramentas/python.svg" class="img-fluid" alt="Python"></p>
</div>
<p>Quase todo relatório de monitoramento responde à mesma pergunta: <strong>quanto do desmatamento (ou do fogo) aconteceu dentro da UC e quanto aconteceu logo ao lado?</strong> O entorno importa porque é por ali que a pressão chega.</p>
<p>Nos scripts que eu usava, isso era feito com uma camada de UCs que já trazia o entorno, um campo <code>0/1</code> e um <code>Intersect</code> do ArcGIS. Aqui você vai montar essa camada do zero e fazer o cruzamento em quatro programas.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://hendesson.github.io/imagens/artigos/interior_entorno_zonas.png" class="img-fluid figure-img" alt="Mapa da região de Novo Progresso com as UCs em verde, uma faixa amarela de 3 km em volta delas e alertas do DETER em azul no interior e em laranja no entorno. Onde duas UCs se encostam, não há faixa amarela."></p>
<figcaption>Interior (verde) e entorno de 3 km (amarelo) das UCs do recorte, com os alertas do DETER desde 2024.</figcaption>
</figure>
</div>
<section id="o-que-você-vai-fazer" class="level2">
<h2 class="anchored" data-anchor-id="o-que-você-vai-fazer">O que você vai fazer</h2>
<div class="cell" data-eval="true" data-layout-align="default">
<div class="cell-output-display">
<div>
<p></p><figure class="figure"><p></p>
<div>
<pre class="mermaid mermaid-js">flowchart LR
    A["UCs"] --&gt; B["Buffer de 3 km&lt;br/&gt;(em metros)"]
    B --&gt; C["Apagar todas&lt;br/&gt;as UCs"]
    C --&gt; D["Entorno"]
    A --&gt; E["Interior"]
    D --&gt; F["Juntar&lt;br/&gt;campo local"]
    E --&gt; F
    F --&gt; G["Interseção&lt;br/&gt;com os alertas"]
    G --&gt; H["Área em ha&lt;br/&gt;e tabela resumo"]
</pre>
</div>
<p></p><figcaption> Etapas do cruzamento</figcaption> </figure><p></p>
</div>
</div>
</div>
<ol start="0" type="1">
<li><strong>Corrigir as geometrias.</strong> 830 dos 7.823 alertas do recorte (11%) têm geometria inválida, e alguns programas param no meio do cruzamento por causa disso.</li>
<li><strong>Entorno:</strong> buffer de 3 km em volta de cada UC, menos a área de <strong>todas</strong> as UCs. Assim, um alerta dentro de uma UC vizinha conta como interior dela, e não como entorno da outra.</li>
<li><strong>Zonas:</strong> juntar interior e entorno numa camada só, com um campo <code>local</code>.</li>
<li><strong>Interseção:</strong> cortar cada alerta pelas zonas. Um alerta que cruza a divisa vira dois pedaços.</li>
<li><strong>Área e resumo:</strong> área em hectares de cada pedaço e soma por UC e local.</li>
</ol>
</section>
<section id="dados" class="level2">
<h2 class="anchored" data-anchor-id="dados">Dados</h2>
<p>Use o GeoPackage dos artigos (camadas <code>ucs</code> e <code>deter</code>). Veja como baixar em <a href="../artigos/sobre.html#dados">Dados dos artigos</a>.</p>
</section>
<section id="o-código" class="level2">
<h2 class="anchored" data-anchor-id="o-código">O código</h2>
<div class="tabset-margin-container"></div><div class="panel-tabset" data-group="programa">
<ul class="nav nav-tabs"><li class="nav-item"><a class="nav-link active" id="tabset-1-1-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-1" aria-controls="tabset-1-1" aria-selected="true" href="">ArcGIS Pro</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-2-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-2" aria-controls="tabset-1-2" aria-selected="false" href="">QGIS</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-3-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-3" aria-controls="tabset-1-3" aria-selected="false" href="">PostGIS</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-4-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-4" aria-controls="tabset-1-4" aria-selected="false" href="">Python</a></li></ul>
<div class="tab-content" data-group="programa">
<div id="tabset-1-1" class="tab-pane active" aria-labelledby="tabset-1-1-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> arcpy</span>
<span id="cb1-2"></span>
<span id="cb1-3">arcpy.env.overwriteOutput <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span></span>
<span id="cb1-4">gpkg <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\a</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">rtigos</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">gpkg"</span></span>
<span id="cb1-5">gdb <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\r</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">esultados</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">gdb"</span>          <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># crie antes com CreateFileGDB</span></span>
<span id="cb1-6"></span>
<span id="cb1-7"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 0. Copiar para a memória e corrigir as geometrias</span></span>
<span id="cb1-8">ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.analysis.Select(gpkg <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\m</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ain</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ucs"</span>, <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"memory</span><span class="er" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ucs"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"regiao = 'Amazonia'"</span>)</span>
<span id="cb1-9">deter <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.management.CopyFeatures(gpkg <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\m</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ain</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">deter"</span>, <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"memory</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">eter"</span>)</span>
<span id="cb1-10">arcpy.management.RepairGeometry(ucs)</span>
<span id="cb1-11">arcpy.management.RepairGeometry(deter)</span>
<span id="cb1-12"></span>
<span id="cb1-13"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1. Entorno: buffer geodésico de 3 km menos todas as UCs</span></span>
<span id="cb1-14">faixa <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.analysis.PairwiseBuffer(ucs, <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"memory</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\f</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">aixa"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"3000 Meters"</span>, method<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"GEODESIC"</span>)</span>
<span id="cb1-15">entorno <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.analysis.PairwiseErase(faixa, ucs, <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"memory</span><span class="er" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">entorno"</span>)</span>
<span id="cb1-16"></span>
<span id="cb1-17"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2. Campo "local" e junção das duas camadas</span></span>
<span id="cb1-18">arcpy.management.CalculateField(ucs, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"local"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"'interior'"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"PYTHON3"</span>, field_type<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"TEXT"</span>)</span>
<span id="cb1-19">arcpy.management.CalculateField(entorno, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"local"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"'entorno'"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"PYTHON3"</span>, field_type<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"TEXT"</span>)</span>
<span id="cb1-20">zonas <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.management.Merge([ucs, entorno], <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"memory</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\z</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">onas"</span>)</span>
<span id="cb1-21"></span>
<span id="cb1-22"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 3. Interseção dos alertas com as zonas</span></span>
<span id="cb1-23">cruzado <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.analysis.PairwiseIntersect([deter, zonas], gdb <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">eter_interior_entorno"</span>)</span>
<span id="cb1-24"></span>
<span id="cb1-25"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 4. Área geodésica em hectares e tabela resumo</span></span>
<span id="cb1-26">arcpy.management.CalculateGeometryAttributes(</span>
<span id="cb1-27">    cruzado, [[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"AREA_GEODESIC"</span>]], area_unit<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"HECTARES"</span>)</span>
<span id="cb1-28">arcpy.analysis.Statistics(cruzado, gdb <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\r</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">esumo_interior_entorno"</span>,</span>
<span id="cb1-29">                          [[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SUM"</span>], [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gid"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"COUNT"</span>]], [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"local"</span>])</span></code></pre></div></div>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
Nota
</div>
</div>
<div class="callout-body-container callout-body">
<p>No <strong>ArcMap</strong>, a ferramenta <code>Erase</code> só existe na licença Advanced. Com licença Basic, faça um <code>Union</code> da faixa com as UCs e apague as partes que têm UC. No ArcGIS Pro, use <code>PairwiseErase</code>.</p>
</div>
</div>
</div>
<div id="tabset-1-2" class="tab-pane" aria-labelledby="tabset-1-2-tab">
<p><strong>Pelos menus</strong> (Caixa de Ferramentas de Processamento, <code>Ctrl+Alt+T</code>):</p>
<ol type="1">
<li><strong>Corrigir geometrias</strong> nas camadas <code>ucs</code> e <code>deter</code>.</li>
<li><strong>Reprojetar camada</strong> <code>ucs</code> para EPSG:5880 (em metros).</li>
<li><strong>Buffer</strong> de 3000 m, sem dissolver.</li>
<li><strong>Diferença</strong>: entrada = buffer, sobreposição = UCs. O resultado é o entorno.</li>
<li><strong>Calculadora de campo</strong> nas duas camadas: novo campo <code>local</code> com <code>'interior'</code> ou <code>'entorno'</code>.</li>
<li><strong>Mesclar camadas vetoriais</strong> e <strong>Corrigir geometrias</strong> de novo.</li>
<li><strong>Interseção</strong>: entrada = alertas, sobreposição = zonas.</li>
<li><strong>Calculadora de campo</strong>: <code>area_ha</code> = <code>area(transform($geometry, 'EPSG:4674', 'ESRI:102033')) / 10000</code>.</li>
<li><strong>Estatísticas por categorias</strong>: campo <code>area_ha</code>, categorias <code>nome_uc</code> e <code>local</code>.</li>
</ol>
<p><strong>No console Python</strong> (<code>Ctrl+Alt+P</code>), os mesmos passos:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb2-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> processing</span>
<span id="cb2-2">G <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"C:/dados/artigos.gpkg"</span></span>
<span id="cb2-3"></span>
<span id="cb2-4"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> rodar(alg, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span>p):</span>
<span id="cb2-5">    p.setdefault(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"OUTPUT"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"memory:"</span>)</span>
<span id="cb2-6">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> processing.run(alg, p)[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"OUTPUT"</span>]</span>
<span id="cb2-7"></span>
<span id="cb2-8"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 0 e 1. UCs da Amazônia em metros, buffer de 3 km e diferença</span></span>
<span id="cb2-9">ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:extractbyexpression"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>G<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">|layername=ucs"</span>,</span>
<span id="cb2-10">            EXPRESSION<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"regiao = 'Amazonia'"</span>)</span>
<span id="cb2-11">ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:fixgeometries"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ucs)</span>
<span id="cb2-12">ucs_m <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:reprojectlayer"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ucs, TARGET_CRS<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"EPSG:5880"</span>)</span>
<span id="cb2-13">faixa <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:buffer"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ucs_m, DISTANCE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3000</span>, SEGMENTS<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">16</span>, DISSOLVE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb2-14">entorno <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:difference"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>faixa, OVERLAY<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ucs_m)</span>
<span id="cb2-15"></span>
<span id="cb2-16"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2. Campo "local" e junção</span></span>
<span id="cb2-17">interior <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:fieldcalculator"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ucs_m, FIELD_NAME<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"local"</span>,</span>
<span id="cb2-18">                 FIELD_TYPE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, FIELD_LENGTH<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, FORMULA<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"'interior'"</span>)</span>
<span id="cb2-19">entorno <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:fieldcalculator"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>entorno, FIELD_NAME<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"local"</span>,</span>
<span id="cb2-20">                FIELD_TYPE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, FIELD_LENGTH<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, FORMULA<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"'entorno'"</span>)</span>
<span id="cb2-21">zonas <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:mergevectorlayers"</span>, LAYERS<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[interior, entorno], CRS<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"EPSG:4674"</span>)</span>
<span id="cb2-22">zonas <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:fixgeometries"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>zonas)</span>
<span id="cb2-23"></span>
<span id="cb2-24"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 3. Alertas corrigidos × zonas</span></span>
<span id="cb2-25">deter <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:fixgeometries"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>G<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">|layername=deter"</span>)</span>
<span id="cb2-26">cruzado <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:intersection"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>deter, OVERLAY<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>zonas,</span>
<span id="cb2-27">                OVERLAY_FIELDS<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cnuc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"local"</span>])</span>
<span id="cb2-28">cruzado <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:deletecolumn"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>cruzado, COLUMN<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"fid"</span>])  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># veja a armadilha 3</span></span>
<span id="cb2-29"></span>
<span id="cb2-30"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 4. Área em hectares e resumo</span></span>
<span id="cb2-31">cruzado <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:fieldcalculator"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>cruzado, FIELD_NAME<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>,</span>
<span id="cb2-32">                FIELD_TYPE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, FIELD_PRECISION<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>,</span>
<span id="cb2-33">                FORMULA<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area(transform($geometry, 'EPSG:4674', 'ESRI:102033')) / 10000"</span>,</span>
<span id="cb2-34">                OUTPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"C:/dados/deter_interior_entorno.gpkg"</span>)</span>
<span id="cb2-35">resumo <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"qgis:statisticsbycategories"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>cruzado, VALUES_FIELD_NAME<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>,</span>
<span id="cb2-36">               CATEGORIES_FIELD_NAME<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"local"</span>])</span>
<span id="cb2-37">QgsProject.instance().addMapLayers([zonas, resumo])</span></code></pre></div></div>
</div>
<div id="tabset-1-3" class="tab-pane" aria-labelledby="tabset-1-3-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode sql code-with-copy"><code class="sourceCode sql"><span id="cb3-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-- 1 e 2. Zonas: interior (a própria UC) e entorno (3 km menos todas as UCs)</span></span>
<span id="cb3-2"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">CREATE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">TABLE</span> artigos.zonas_ucs <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span></span>
<span id="cb3-3"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WITH</span> ucs <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> (</span>
<span id="cb3-4">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> cnuc, nome_uc, ST_MakeValid(geom) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> geom</span>
<span id="cb3-5">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.ucs</span>
<span id="cb3-6">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> regiao <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Amazonia'</span></span>
<span id="cb3-7">),</span>
<span id="cb3-8">todas <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> (</span>
<span id="cb3-9">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> ST_Union(geom) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> geom <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> ucs</span>
<span id="cb3-10">)</span>
<span id="cb3-11"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> cnuc, nome_uc, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'interior'</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">local</span>, geom</span>
<span id="cb3-12"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> ucs</span>
<span id="cb3-13"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">UNION</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ALL</span></span>
<span id="cb3-14"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> u.cnuc, u.nome_uc, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'entorno'</span>,</span>
<span id="cb3-15">       ST_Multi(ST_Difference(ST_Buffer(u.geom:<span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">:geography</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3000</span>):<span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">:geometry</span>, t.geom))</span>
<span id="cb3-16"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> ucs u, todas t;</span>
<span id="cb3-17"></span>
<span id="cb3-18"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">CREATE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">INDEX</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ON</span> artigos.zonas_ucs <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">USING</span> gist (geom);</span>
<span id="cb3-19"></span>
<span id="cb3-20"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-- 0 e 3. Alertas corrigidos × zonas</span></span>
<span id="cb3-21"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">CREATE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">TABLE</span> artigos.deter_interior_entorno <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span></span>
<span id="cb3-22"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WITH</span> deter <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> (</span>
<span id="cb3-23">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> gid, classname, view_date, municipality,</span>
<span id="cb3-24">           ST_CollectionExtract(ST_MakeValid(geom), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> geom   <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-- 3 = só polígonos</span></span>
<span id="cb3-25">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.deter</span>
<span id="cb3-26">)</span>
<span id="cb3-27"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> d.gid, d.classname, d.view_date, d.municipality, z.cnuc, z.nome_uc, z.<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">local</span>,</span>
<span id="cb3-28">       ST_Intersection(d.geom, z.geom) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> geom</span>
<span id="cb3-29"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> deter d</span>
<span id="cb3-30"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">JOIN</span> artigos.zonas_ucs z <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ON</span> ST_Intersects(d.geom, z.geom)</span>
<span id="cb3-31"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">NOT</span> ST_IsEmpty(d.geom);</span>
<span id="cb3-32"></span>
<span id="cb3-33"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-- 4. Área em hectares e resumo</span></span>
<span id="cb3-34"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ALTER</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">TABLE</span> artigos.deter_interior_entorno <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ADD</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">COLUMN</span> area_ha <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">numeric</span>;</span>
<span id="cb3-35"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">UPDATE</span> artigos.deter_interior_entorno <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SET</span> area_ha <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ST_Area(geom:<span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">:geography</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10000</span>;</span>
<span id="cb3-36"></span>
<span id="cb3-37"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> nome_uc, <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">local</span>, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">count</span>(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> alertas, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">round</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sum</span>(area_ha), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> area_ha</span>
<span id="cb3-38"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.deter_interior_entorno</span>
<span id="cb3-39"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">GROUP</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BY</span> nome_uc, <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">local</span></span>
<span id="cb3-40"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ORDER</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BY</span> nome_uc, <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">local</span>;</span></code></pre></div></div>
</div>
<div id="tabset-1-4" class="tab-pane" aria-labelledby="tabset-1-4-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb4-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> geopandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> gpd</span>
<span id="cb4-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> pd</span>
<span id="cb4-3"></span>
<span id="cb4-4">G <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dados/artigos.gpkg"</span></span>
<span id="cb4-5">ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.read_file(G, layer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ucs"</span>).query(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"regiao == 'Amazonia'"</span>)</span>
<span id="cb4-6">deter <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.read_file(G, layer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"deter"</span>)</span>
<span id="cb4-7"></span>
<span id="cb4-8"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 0. Corrigir geometrias, descartando pedaços que viram linha ou ponto</span></span>
<span id="cb4-9"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> corrigir(gdf):</span>
<span id="cb4-10">    gdf[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"geometry"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gdf.make_valid(method<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"structure"</span>, keep_collapsed<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb4-11">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> gdf[<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span>gdf.is_empty]</span>
<span id="cb4-12"></span>
<span id="cb4-13">ucs, deter <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> corrigir(ucs), corrigir(deter)</span>
<span id="cb4-14"></span>
<span id="cb4-15"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1. Entorno: faixa de 3 km (em metros, EPSG:5880) menos todas as UCs</span></span>
<span id="cb4-16">ucs_m <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ucs.to_crs(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5880</span>)</span>
<span id="cb4-17">entorno <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.GeoDataFrame(ucs_m[[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cnuc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>]],</span>
<span id="cb4-18">                           geometry<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ucs_m.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">buffer</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3000</span>).difference(ucs_m.union_all()),</span>
<span id="cb4-19">                           crs<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5880</span>)</span>
<span id="cb4-20"></span>
<span id="cb4-21"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2. Zonas com o campo "local"</span></span>
<span id="cb4-22">zonas <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.concat([ucs_m[[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cnuc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"geometry"</span>]].assign(local<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"interior"</span>),</span>
<span id="cb4-23">                   entorno.assign(local<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"entorno"</span>)])</span>
<span id="cb4-24">zonas <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.GeoDataFrame(zonas, crs<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5880</span>).to_crs(deter.crs)</span>
<span id="cb4-25"></span>
<span id="cb4-26"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 3. Interseção e área em hectares (projeção de área igual)</span></span>
<span id="cb4-27">cruzado <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.overlay(deter, zonas, how<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"intersection"</span>, keep_geom_type<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb4-28">cruzado[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> cruzado.to_crs(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ESRI:102033"</span>).area <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10_000</span></span>
<span id="cb4-29">cruzado.to_file(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dados/deter_interior_entorno.gpkg"</span>)</span>
<span id="cb4-30"></span>
<span id="cb4-31"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 4. Tabela resumo</span></span>
<span id="cb4-32">resumo <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (cruzado.groupby([<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"local"</span>])</span>
<span id="cb4-33">          .agg(alertas<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gid"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"count"</span>), area_ha<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"sum"</span>))</span>
<span id="cb4-34">          .<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">round</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>).reset_index())</span>
<span id="cb4-35"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(resumo)</span></code></pre></div></div>
</div>
</div>
</div>
</section>
<section id="conferindo-o-resultado" class="level2">
<h2 class="anchored" data-anchor-id="conferindo-o-resultado">Conferindo o resultado</h2>
<p>Rodei as versões do QGIS, do PostGIS e do Python com os mesmos dados (alertas do DETER de janeiro de 2024 a outubro de 2026). QGIS e Python deram números <strong>idênticos</strong>. O PostGIS ficou a menos de 0,2%, porque faz o buffer e a área sobre o elipsoide, e não numa projeção.</p>
<table class="table-striped caption-top table">
<caption>Área de alertas do DETER (todas as classes, inclusive cicatrizes de queimada e degradação) por UC e local.</caption>
<thead>
<tr class="header">
<th>UC</th>
<th style="text-align: right;">Interior (ha)</th>
<th style="text-align: right;">Entorno (ha)</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Floresta Nacional do Jamanxim</td>
<td style="text-align: right;">154.419</td>
<td style="text-align: right;">13.165</td>
</tr>
<tr class="even">
<td>Floresta Nacional de Altamira</td>
<td style="text-align: right;">61.256</td>
<td style="text-align: right;">5.055</td>
</tr>
<tr class="odd">
<td>Parque Nacional do Jamanxim</td>
<td style="text-align: right;">28.058</td>
<td style="text-align: right;">5.228</td>
</tr>
<tr class="even">
<td>Área de Proteção Ambiental do Tapajós</td>
<td style="text-align: right;">16.750</td>
<td style="text-align: right;">6.106</td>
</tr>
<tr class="odd">
<td>Parque Nacional do Rio Novo</td>
<td style="text-align: right;">10.924</td>
<td style="text-align: right;">0,1 (veja a armadilha 2)</td>
</tr>
<tr class="even">
<td>Floresta Estadual de Iriri</td>
<td style="text-align: right;">467</td>
<td style="text-align: right;">—</td>
</tr>
</tbody>
</table>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://hendesson.github.io/imagens/artigos/interior_entorno_barras.png" class="img-fluid figure-img" alt="Gráfico de barras horizontais com a área de alertas no interior (verde) e no entorno (laranja) de cada UC. A Floresta Nacional do Jamanxim tem de longe a maior área, com mais de 150 mil hectares no interior."></p>
<figcaption>Área de alertas no interior e no entorno de cada UC.</figcaption>
</figure>
</div>
</section>
<section id="armadilhas" class="level2">
<h2 class="anchored" data-anchor-id="armadilhas">Armadilhas</h2>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Aviso</span>1. Buffer em graus
</div>
</div>
<div class="callout-body-container callout-body">
<p>O SIRGAS 2000 (EPSG:4674) está em <strong>graus</strong>. Um buffer de <code>3000</code> nessa projeção cria uma faixa de 3000 graus, que cobre o planeta inteiro. Reprojete para metros (EPSG:5880), use <code>::geography</code> no PostGIS ou <code>method="GEODESIC"</code> no ArcGIS Pro.</p>
</div>
</div>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Aviso</span>2. UC na borda do recorte (e lascas)
</div>
</div>
<div class="callout-body-container callout-body">
<p>O Parque Nacional do Rio Novo aparece com só <strong>0,1 ha de alertas no entorno</strong>. Conferindo, 58% da faixa de entorno dele fica <strong>fora da área que baixamos</strong>: o parque está na borda do recorte, e os alertas de lá não vieram. Ao baixar dados, amplie o recorte em pelo menos a largura do entorno.</p>
<p>Os 21 pedaços que sobraram são <strong>lascas</strong>: bordas de alertas que estão quase inteiros dentro de uma UC vizinha (o maior tem 0,03 ha). Para um relatório, descarte pedaços menores que 0,01 ha.</p>
</div>
</div>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Aviso</span>3. <code>fid</code> repetido no QGIS
</div>
</div>
<div class="callout-body-container callout-body">
<p>Ao salvar a interseção num GeoPackage, o QGIS dá <code>UNIQUE constraint failed: fid</code>. O alerta cortado em dois pedaços leva o mesmo <code>fid</code> para os dois. Apague o campo <code>fid</code> antes de salvar (<code>native:deletecolumn</code>).</p>
</div>
</div>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Aviso</span>4. UCs sobrepostas
</div>
</div>
<div class="callout-body-container callout-body">
<p>Algumas UCs se sobrepõem (uma APA pode conter uma Floresta Nacional). Nesse caso, o mesmo alerta conta como interior das duas, e a soma de todas as UCs fica maior que a área desmatada. Para um total geral, dissolva as UCs antes ou some a área dos alertas sem cruzar.</p>
</div>
</div>
</section>
<section id="variações" class="level2">
<h2 class="anchored" data-anchor-id="variações">Variações</h2>
<ul>
<li><strong>Fora de qualquer UC, sem limite de distância:</strong> troque o buffer pela camada inteira de alertas e use <strong>Apagar/Diferença</strong> com as UCs. Era assim que eu separava a área queimada “dentro” e “fora” das UCs.</li>
<li><strong>Outras distâncias:</strong> 10 km é comum para zonas de amortecimento sem plano de manejo (Resolução Conama 428/2010).</li>
</ul>
</section>
<section id="veja-também" class="level2">
<h2 class="anchored" data-anchor-id="veja-também">Veja também</h2>
<ul>
<li><a href="../artigos/03-prodes-ucs.html">Desmatamento anual do PRODES nas UCs da Amazônia e do Cerrado</a></li>
<li><a href="../guia-espacial/curso/03-postgis.html">Módulo 3 do curso: PostGIS</a>, com interior e entorno em SQL passo a passo.</li>
</ul>
<div class="navegacao-livro">
<p><a href="../artigos/01-equivalencias.html" class="anterior"><span class="direcao">← Anterior</span> Do ArcMap ao QGIS: a mesma ferramenta em cada programa</a> <a href="../artigos/03-prodes-ucs.html" class="proximo"><span class="direcao">Próximo →</span> Desmatamento anual do PRODES nas UCs da Amazônia e do Cerrado</a></p>
</div>
</section>
<section id="atualizações" class="level2 unnumbered">
<h2 class="unnumbered anchored" data-anchor-id="atualizações">Atualizações</h2>
<ul>
<li><strong>29/10/2026:</strong> publicação, com dados do INPE, do MMA, do IBAMA e do SICAR de outubro de 2026.</li>
</ul>
<p><a href="https://hendesson.github.io/en/articles/02-inside-and-around.html">English version</a></p>


</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> De volta ao topo</a><div id="quarto-appendix" class="default"><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Licença</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/deed.pt_br">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Como citar</h2><div><div class="quarto-appendix-secondary-label">BibTeX</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@misc{alves2026,
  author = {Alves, Hendesson},
  publisher = {Hendesson Alves},
  title = {Interior e entorno das UCs: o cruzamento que todo relatório
    usa},
  date = {2026-10-29},
  url = {https://hendesson.github.io/artigos/02-interior-entorno.html},
  doi = {10.5281/zenodo.23780248},
  langid = {pt-BR},
  abstract = {Como separar o desmatamento que caiu dentro de uma UC do
    que caiu na faixa de 3 km em volta, sem contar duas vezes as UCs
    vizinhas. Com os alertas do DETER de 2024 a 2026, o artigo mostra o
    passo a passo em quatro programas e quatro armadilhas que apareceram
    com os dados reais.}
}
</code></pre><div class="quarto-appendix-secondary-label">Por favor, cite este trabalho como:</div><div id="ref-alves2026" class="csl-entry quarto-appendix-citeas">
Alves, Hendesson. 2026. <span>“Interior e entorno das UCs: o cruzamento
que todo relatório usa.”</span> In <em>Artigos de geoprocessamento para
monitoramento ambiental</em>. Preprint, Hendesson Alves, October 29. <a href="https://doi.org/10.5281/zenodo.23780248">https://doi.org/10.5281/zenodo.23780248</a>.
</div></div></section></div> ]]></description>
  <category>UCs</category>
  <category>DETER</category>
  <guid>https://hendesson.github.io/artigos/02-interior-entorno.html</guid>
  <pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate>
  <media:content url="https://hendesson.github.io/imagens/artigos/interior_entorno_zonas.png" medium="image" type="image/png" height="176" width="144"/>
</item>
<item>
  <title>Desmatamento anual do PRODES nas UCs da Amazônia e do Cerrado</title>
  <dc:creator>Hendesson Alves</dc:creator>
  <link>https://hendesson.github.io/artigos/03-prodes-ucs.html</link>
  <description><![CDATA[ 





<div class="ficha">
<p><span class="rotulo">Nível</span> Iniciante <span class="rotulo">Leitura</span> 9 min <span class="rotulo">Dados</span> outubro de 2026 <span class="rotulo">Programas</span> <span class="selo-texto">ArcGIS</span> <img src="https://hendesson.github.io/imagens/ferramentas/qgis.svg" class="img-fluid" alt="QGIS"> <img src="https://hendesson.github.io/imagens/ferramentas/postgis.svg" class="img-fluid" alt="PostGIS"> <img src="https://hendesson.github.io/imagens/ferramentas/python.svg" class="img-fluid" alt="Python"></p>
</div>
<p>O <strong>PRODES</strong> é a taxa oficial de desmatamento do Brasil. Sai uma vez por ano para cada bioma, e o “ano PRODES” vai de agosto a julho. Quando o INPE publica um ano novo, a pergunta é sempre a mesma: <strong>quanto foi desmatado dentro de cada UC?</strong></p>
<p>Eu tinha um script para a Amazônia e outro, quase idêntico, para o Cerrado. Aqui é <strong>um código só</strong>: a camada do PRODES e o recorte de UCs viram parâmetros.</p>
<section id="o-que-você-vai-fazer" class="level2">
<h2 class="anchored" data-anchor-id="o-que-você-vai-fazer">O que você vai fazer</h2>
<ol type="1">
<li><strong>Filtrar</strong> os polígonos de desmatamento e corrigir as geometrias.</li>
<li><strong>Cruzar</strong> com as UCs de cada bioma (interseção).</li>
<li><strong>Medir</strong> a área em hectares.</li>
<li><strong>Resumir:</strong> tabela do último ano por UC e série histórica.</li>
<li><strong>Atualizar</strong> quando sair um ano novo, sem duplicar.</li>
</ol>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Nota</span>Dados
</div>
</div>
<div class="callout-body-container callout-body">
<p>Camadas <code>prodes_amz</code>, <code>prodes_cerrado</code> e <code>ucs</code> do GeoPackage dos artigos (<a href="../artigos/sobre.html#dados">como baixar</a>). As duas camadas do PRODES têm os mesmos campos (<code>year</code>, <code>main_class</code>, <code>area_km</code>), por isso o mesmo código serve para as duas. Os serviços WFS são:</p>
<ul>
<li>Amazônia: <code>https://terrabrasilis.dpi.inpe.br/geoserver/prodes-legal-amz/ows</code>, camada <code>prodes-legal-amz:yearly_deforestation</code></li>
<li>Cerrado: <code>https://terrabrasilis.dpi.inpe.br/geoserver/prodes-cerrado-nb/ows</code>, camada <code>prodes-cerrado-nb:yearly_deforestation</code></li>
</ul>
</div>
</div>
</section>
<section id="o-código" class="level2">
<h2 class="anchored" data-anchor-id="o-código">O código</h2>
<div class="tabset-margin-container"></div><div class="panel-tabset" data-group="programa">
<ul class="nav nav-tabs"><li class="nav-item"><a class="nav-link active" id="tabset-1-1-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-1" aria-controls="tabset-1-1" aria-selected="true" href="">ArcGIS Pro</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-2-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-2" aria-controls="tabset-1-2" aria-selected="false" href="">QGIS</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-3-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-3" aria-controls="tabset-1-3" aria-selected="false" href="">PostGIS</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-4-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-4" aria-controls="tabset-1-4" aria-selected="false" href="">Python</a></li></ul>
<div class="tab-content" data-group="programa">
<div id="tabset-1-1" class="tab-pane active" aria-labelledby="tabset-1-1-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> arcpy</span>
<span id="cb1-2"></span>
<span id="cb1-3">arcpy.env.overwriteOutput <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span></span>
<span id="cb1-4">gpkg <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\a</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">rtigos</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">gpkg"</span></span>
<span id="cb1-5">gdb <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\r</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">esultados</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">gdb"</span></span>
<span id="cb1-6"></span>
<span id="cb1-7">biomas <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Amazônia"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"main.prodes_amz"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Amazonia"</span>),</span>
<span id="cb1-8">          (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Cerrado"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"main.prodes_cerrado"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Cerrado"</span>)]</span>
<span id="cb1-9">partes <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb1-10"></span>
<span id="cb1-11"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> bioma, camada, regiao <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> biomas:</span>
<span id="cb1-12">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1. Desmatamento (o campo vem em maiúsculas e minúsculas) e geometrias corrigidas</span></span>
<span id="cb1-13">    prodes <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.analysis.Select(gpkg <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\\</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> camada, <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">rf"memory</span><span class="er" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">prodes_</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>regiao<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>,</span>
<span id="cb1-14">                                   <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"UPPER(main_class) = 'DESMATAMENTO'"</span>)</span>
<span id="cb1-15">    arcpy.management.RepairGeometry(prodes)</span>
<span id="cb1-16">    ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.analysis.Select(gpkg <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\m</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ain</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ucs"</span>, <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">rf"memory</span><span class="er" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ucs_</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>regiao<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>,</span>
<span id="cb1-17">                                <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"regiao = '</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>regiao<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">'"</span>)</span>
<span id="cb1-18"></span>
<span id="cb1-19">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2 e 3. Interseção e área geodésica</span></span>
<span id="cb1-20">    cruzado <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.analysis.PairwiseIntersect([prodes, ucs], <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">rf"memory</span><span class="er" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">cruzado_</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>regiao<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb1-21">    arcpy.management.CalculateGeometryAttributes(</span>
<span id="cb1-22">        cruzado, [[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"AREA_GEODESIC"</span>]], area_unit<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"HECTARES"</span>)</span>
<span id="cb1-23">    arcpy.management.CalculateField(cruzado, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bioma"</span>, <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"'</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>bioma<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">'"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"PYTHON3"</span>,</span>
<span id="cb1-24">                                    field_type<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"TEXT"</span>)</span>
<span id="cb1-25">    partes.append(cruzado)</span>
<span id="cb1-26"></span>
<span id="cb1-27">prodes_ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.management.Merge(partes, gdb <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="er" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">prodes_ucs"</span>)</span>
<span id="cb1-28"></span>
<span id="cb1-29"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 4. Série histórica por bioma e ano, e tabela por UC</span></span>
<span id="cb1-30">arcpy.analysis.Statistics(prodes_ucs, gdb <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="er" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">prodes_serie"</span>,</span>
<span id="cb1-31">                          [[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SUM"</span>]], [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bioma"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"year"</span>])</span>
<span id="cb1-32">arcpy.analysis.Statistics(prodes_ucs, gdb <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="er" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">prodes_por_uc"</span>,</span>
<span id="cb1-33">                          [[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SUM"</span>]], [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bioma"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"year"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"grupo"</span>])</span>
<span id="cb1-34"></span>
<span id="cb1-35"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Último ano de cada bioma</span></span>
<span id="cb1-36"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> bioma, _, _ <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> biomas:</span>
<span id="cb1-37">    anos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [r[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>] <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> r <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> arcpy.da.SearchCursor(prodes_ucs, [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"year"</span>], <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"bioma = '</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>bioma<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">'"</span>)]</span>
<span id="cb1-38">    arcpy.AddMessage(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>bioma<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">: último ano = </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">max</span>(anos)<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span></code></pre></div></div>
</div>
<div id="tabset-1-2" class="tab-pane" aria-labelledby="tabset-1-2-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb2-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> processing</span>
<span id="cb2-2">G <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"C:/dados/artigos.gpkg"</span></span>
<span id="cb2-3"></span>
<span id="cb2-4"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> rodar(alg, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span>p):</span>
<span id="cb2-5">    p.setdefault(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"OUTPUT"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"memory:"</span>)</span>
<span id="cb2-6">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> processing.run(alg, p)[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"OUTPUT"</span>]</span>
<span id="cb2-7"></span>
<span id="cb2-8">partes <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb2-9"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> bioma, camada, regiao <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> [(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Amazônia"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"prodes_amz"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Amazonia"</span>),</span>
<span id="cb2-10">                              (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Cerrado"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"prodes_cerrado"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Cerrado"</span>)]:</span>
<span id="cb2-11">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1. Desmatamento e geometrias corrigidas</span></span>
<span id="cb2-12">    prodes <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:extractbyexpression"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>G<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">|layername=</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>camada<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>,</span>
<span id="cb2-13">                   EXPRESSION<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"upper(main_class) = 'DESMATAMENTO'"</span>)</span>
<span id="cb2-14">    prodes <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:fixgeometries"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>prodes)</span>
<span id="cb2-15">    ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:extractbyexpression"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>G<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">|layername=ucs"</span>,</span>
<span id="cb2-16">                EXPRESSION<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"regiao = '</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>regiao<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">'"</span>)</span>
<span id="cb2-17"></span>
<span id="cb2-18">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2 e 3. Interseção, área em hectares e bioma</span></span>
<span id="cb2-19">    cruzado <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:intersection"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>prodes, OVERLAY<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ucs,</span>
<span id="cb2-20">                    INPUT_FIELDS<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"year"</span>], OVERLAY_FIELDS<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cnuc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"grupo"</span>])</span>
<span id="cb2-21">    cruzado <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:fieldcalculator"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>cruzado, FIELD_NAME<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>,</span>
<span id="cb2-22">                    FIELD_TYPE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, FIELD_PRECISION<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>,</span>
<span id="cb2-23">                    FORMULA<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area(transform($geometry, 'EPSG:4674', 'ESRI:102033')) / 10000"</span>)</span>
<span id="cb2-24">    cruzado <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:fieldcalculator"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>cruzado, FIELD_NAME<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bioma"</span>,</span>
<span id="cb2-25">                    FIELD_TYPE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, FIELD_LENGTH<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, FORMULA<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"'</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>bioma<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">'"</span>)</span>
<span id="cb2-26">    partes.append(cruzado)</span>
<span id="cb2-27"></span>
<span id="cb2-28">prodes_ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:mergevectorlayers"</span>, LAYERS<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>partes, CRS<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"EPSG:4674"</span>)</span>
<span id="cb2-29"></span>
<span id="cb2-30"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 4. Soma por bioma, ano e UC; depois, só o último ano de cada bioma</span></span>
<span id="cb2-31">por_uc <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"qgis:statisticsbycategories"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>prodes_ucs, VALUES_FIELD_NAME<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>,</span>
<span id="cb2-32">               CATEGORIES_FIELD_NAME<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bioma"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"year"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>])</span>
<span id="cb2-33">ultimo <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:extractbyexpression"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>por_uc,</span>
<span id="cb2-34">               EXPRESSION<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'"year" = maximum("year", group_by:="bioma")'</span>)</span>
<span id="cb2-35"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> f <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> ultimo.getFeatures():</span>
<span id="cb2-36">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bioma"</span>], f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"year"</span>], f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>], <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">round</span>(f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"sum"</span>], <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>))</span></code></pre></div></div>
<p>O truque está na última expressão: <code>maximum("year", group_by:="bioma")</code> calcula o maior ano <strong>de cada bioma</strong>, e a mesma ideia funciona na Calculadora de campo e em filtros de camada.</p>
</div>
<div id="tabset-1-3" class="tab-pane" aria-labelledby="tabset-1-3-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode sql code-with-copy"><code class="sourceCode sql"><span id="cb3-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-- 1 a 3. Os dois biomas numa tabela só</span></span>
<span id="cb3-2"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">DROP</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">TABLE</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">IF</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">EXISTS</span> artigos.prodes_ucs;</span>
<span id="cb3-3"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">CREATE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">TABLE</span> artigos.prodes_ucs <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span></span>
<span id="cb3-4"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WITH</span> prodes <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> (</span>
<span id="cb3-5">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Amazônia'</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> bioma, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Amazonia'</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> regiao, <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">year</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> ano,</span>
<span id="cb3-6">           ST_CollectionExtract(ST_MakeValid(geom), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> geom</span>
<span id="cb3-7">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.prodes_amz</span>
<span id="cb3-8">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">upper</span>(main_class) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'DESMATAMENTO'</span></span>
<span id="cb3-9">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">UNION</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ALL</span></span>
<span id="cb3-10">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Cerrado'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Cerrado'</span>, <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">year</span>,</span>
<span id="cb3-11">           ST_CollectionExtract(ST_MakeValid(geom), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>)</span>
<span id="cb3-12">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.prodes_cerrado</span>
<span id="cb3-13">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">upper</span>(main_class) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'DESMATAMENTO'</span></span>
<span id="cb3-14">)</span>
<span id="cb3-15"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> p.bioma, p.ano, u.cnuc, u.nome_uc, u.grupo,</span>
<span id="cb3-16">       ST_Intersection(p.geom, u.geom) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> geom</span>
<span id="cb3-17"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> prodes p</span>
<span id="cb3-18"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">JOIN</span> artigos.ucs u <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ON</span> u.regiao <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> p.regiao <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AND</span> ST_Intersects(p.geom, u.geom)</span>
<span id="cb3-19"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">NOT</span> ST_IsEmpty(p.geom);</span>
<span id="cb3-20"></span>
<span id="cb3-21"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ALTER</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">TABLE</span> artigos.prodes_ucs <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ADD</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">COLUMN</span> area_ha <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">numeric</span>;</span>
<span id="cb3-22"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">UPDATE</span> artigos.prodes_ucs <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SET</span> area_ha <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ST_Area(geom:<span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">:geography</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10000</span>;</span>
<span id="cb3-23"></span>
<span id="cb3-24"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-- 4a. Último ano de cada bioma, por UC</span></span>
<span id="cb3-25"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> bioma, ano, nome_uc, grupo, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">count</span>(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> poligonos, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">round</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sum</span>(area_ha), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> area_ha</span>
<span id="cb3-26"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.prodes_ucs p</span>
<span id="cb3-27"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> ano <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">max</span>(ano) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.prodes_ucs q <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> q.bioma <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> p.bioma)</span>
<span id="cb3-28"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">GROUP</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BY</span> bioma, ano, nome_uc, grupo</span>
<span id="cb3-29"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ORDER</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BY</span> bioma, area_ha <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">DESC</span>;</span>
<span id="cb3-30"></span>
<span id="cb3-31"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-- 4b. Série histórica</span></span>
<span id="cb3-32"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> ano,</span>
<span id="cb3-33">       <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">round</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sum</span>(area_ha) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FILTER</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> bioma <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Amazônia'</span>)) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> amazonia_ha,</span>
<span id="cb3-34">       <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">round</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sum</span>(area_ha) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FILTER</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> bioma <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Cerrado'</span>)) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> cerrado_ha</span>
<span id="cb3-35"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.prodes_ucs</span>
<span id="cb3-36"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">GROUP</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BY</span> ano</span>
<span id="cb3-37"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ORDER</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BY</span> ano;</span></code></pre></div></div>
</div>
<div id="tabset-1-4" class="tab-pane" aria-labelledby="tabset-1-4-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb4-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> geopandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> gpd</span>
<span id="cb4-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> pd</span>
<span id="cb4-3"></span>
<span id="cb4-4">G <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dados/artigos.gpkg"</span></span>
<span id="cb4-5">ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.read_file(G, layer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ucs"</span>)</span>
<span id="cb4-6"></span>
<span id="cb4-7"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> corrigir(gdf):</span>
<span id="cb4-8">    gdf[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"geometry"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gdf.make_valid(method<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"structure"</span>, keep_collapsed<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb4-9">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> gdf[<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span>gdf.is_empty]</span>
<span id="cb4-10"></span>
<span id="cb4-11"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> prodes_em_ucs(camada, regiao, bioma):</span>
<span id="cb4-12">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""Cruza uma camada do PRODES com as UCs de uma região e mede em hectares."""</span></span>
<span id="cb4-13">    prodes <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.read_file(G, layer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>camada)</span>
<span id="cb4-14">    prodes <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> corrigir(prodes[prodes[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"main_class"</span>].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>.upper() <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"DESMATAMENTO"</span>])</span>
<span id="cb4-15">    u <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ucs[ucs[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"regiao"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> regiao][[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cnuc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"grupo"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"geometry"</span>]]</span>
<span id="cb4-16">    x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.overlay(prodes[[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"year"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"geometry"</span>]], u, how<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"intersection"</span>, keep_geom_type<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb4-17">    x[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> x.to_crs(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ESRI:102033"</span>).area <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10_000</span></span>
<span id="cb4-18">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> x.assign(bioma<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>bioma).rename(columns<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>{<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"year"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ano"</span>})</span>
<span id="cb4-19"></span>
<span id="cb4-20">prodes_ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.concat([prodes_em_ucs(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"prodes_amz"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Amazonia"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Amazônia"</span>),</span>
<span id="cb4-21">                        prodes_em_ucs(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"prodes_cerrado"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Cerrado"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Cerrado"</span>)])</span>
<span id="cb4-22"></span>
<span id="cb4-23"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 4a. Último ano de cada bioma, por UC</span></span>
<span id="cb4-24">ultimo <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> prodes_ucs[prodes_ucs[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ano"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> prodes_ucs.groupby(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bioma"</span>)[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ano"</span>].transform(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"max"</span>)]</span>
<span id="cb4-25"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(ultimo.groupby([<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bioma"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ano"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"grupo"</span>])</span>
<span id="cb4-26">            .agg(poligonos<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"size"</span>), area_ha<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"sum"</span>))</span>
<span id="cb4-27">            .<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">round</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>).sort_values(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>, ascending<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>))</span>
<span id="cb4-28"></span>
<span id="cb4-29"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 4b. Série histórica</span></span>
<span id="cb4-30"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(prodes_ucs.pivot_table(index<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ano"</span>, columns<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bioma"</span>, values<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>,</span>
<span id="cb4-31">                             aggfunc<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"sum"</span>).<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">round</span>())</span></code></pre></div></div>
</div>
</div>
</div>
</section>
<section id="conferindo-o-resultado" class="level2">
<h2 class="anchored" data-anchor-id="conferindo-o-resultado">Conferindo o resultado</h2>
<p>As três versões testadas (QGIS, PostGIS e Python) deram os mesmos totais, com diferença menor que 0,1%.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://hendesson.github.io/imagens/artigos/prodes_biomas.png" class="img-fluid figure-img" alt="Dois gráficos de barras lado a lado. À esquerda, Amazônia: o desmatamento nas UCs do recorte passa de 20 mil hectares em 2020 e 2021 e cai para menos de 5 mil em 2025. À direita, Cerrado: valores menores, entre 130 e 2.500 hectares por ano, com pico em 2022."></p>
<figcaption>Desmatamento PRODES dentro das UCs dos dois recortes, por ano.</figcaption>
</figure>
</div>
<table class="table-striped caption-top table">
<caption>Último ano PRODES disponível em cada bioma (consulta de outubro de 2026). O PRODES Cerrado 2026 já estava publicado; o da Amazônia, ainda não.</caption>
<colgroup>
<col style="width: 15%">
<col style="width: 15%">
<col style="width: 15%">
<col style="width: 15%">
<col style="width: 20%">
<col style="width: 20%">
</colgroup>
<thead>
<tr class="header">
<th>Bioma</th>
<th>Ano PRODES</th>
<th>UC</th>
<th>Grupo</th>
<th style="text-align: right;">Polígonos</th>
<th style="text-align: right;">Área (ha)</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Amazônia</td>
<td>2025</td>
<td>Floresta Nacional do Jamanxim</td>
<td>Uso Sustentável</td>
<td style="text-align: right;">120</td>
<td style="text-align: right;">1.569,7</td>
</tr>
<tr class="even">
<td>Amazônia</td>
<td>2025</td>
<td>Área de Proteção Ambiental do Tapajós</td>
<td>Uso Sustentável</td>
<td style="text-align: right;">69</td>
<td style="text-align: right;">1.251,6</td>
</tr>
<tr class="odd">
<td>Amazônia</td>
<td>2025</td>
<td>Floresta Nacional de Altamira</td>
<td>Uso Sustentável</td>
<td style="text-align: right;">35</td>
<td style="text-align: right;">269,5</td>
</tr>
<tr class="even">
<td>Amazônia</td>
<td>2025</td>
<td>Floresta Estadual de Iriri</td>
<td>Uso Sustentável</td>
<td style="text-align: right;">9</td>
<td style="text-align: right;">59,4</td>
</tr>
<tr class="odd">
<td>Amazônia</td>
<td>2025</td>
<td>Parque Nacional do Jamanxim</td>
<td>Proteção Integral</td>
<td style="text-align: right;">3</td>
<td style="text-align: right;">27,0</td>
</tr>
<tr class="even">
<td>Amazônia</td>
<td>2025</td>
<td>Parque Nacional do Rio Novo</td>
<td>Proteção Integral</td>
<td style="text-align: right;">4</td>
<td style="text-align: right;">16,7</td>
</tr>
<tr class="odd">
<td>Cerrado</td>
<td>2026</td>
<td>Área de Proteção Ambiental Pouso Alto</td>
<td>Uso Sustentável</td>
<td style="text-align: right;">37</td>
<td style="text-align: right;">129,7</td>
</tr>
</tbody>
</table>
<p>O Parque Nacional da Chapada dos Veadeiros não teve desmatamento PRODES em 2026. Repare também que, nos dois biomas, quase todo o desmatamento em UCs está nas de <strong>Uso Sustentável</strong>, onde há moradores e atividades permitidas.</p>
</section>
<section id="atualizar-quando-sair-um-ano-novo" class="level2">
<h2 class="anchored" data-anchor-id="atualizar-quando-sair-um-ano-novo">Atualizar quando sair um ano novo</h2>
<p>O INPE às vezes <strong>republica</strong> um ano (com correções). Se o seu script só acrescenta linhas, o mesmo ano aparece duas vezes e a área dobra. A regra é: <strong>apague o ano e insira de novo</strong>, numa transação.</p>
<div class="tabset-margin-container"></div><div class="panel-tabset" data-group="programa">
<ul class="nav nav-tabs"><li class="nav-item"><a class="nav-link active" id="tabset-2-1-tab" data-bs-toggle="tab" data-bs-target="#tabset-2-1" aria-controls="tabset-2-1" aria-selected="true" href="">ArcGIS Pro</a></li><li class="nav-item"><a class="nav-link" id="tabset-2-2-tab" data-bs-toggle="tab" data-bs-target="#tabset-2-2" aria-controls="tabset-2-2" aria-selected="false" href="">QGIS</a></li><li class="nav-item"><a class="nav-link" id="tabset-2-3-tab" data-bs-toggle="tab" data-bs-target="#tabset-2-3" aria-controls="tabset-2-3" aria-selected="false" href="">PostGIS</a></li><li class="nav-item"><a class="nav-link" id="tabset-2-4-tab" data-bs-toggle="tab" data-bs-target="#tabset-2-4" aria-controls="tabset-2-4" aria-selected="false" href="">Python</a></li></ul>
<div class="tab-content" data-group="programa">
<div id="tabset-2-1" class="tab-pane active" aria-labelledby="tabset-2-1-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb5-1">ano <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2025</span></span>
<span id="cb5-2">tabela <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gdb <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="er" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">prodes_ucs_historico"</span></span>
<span id="cb5-3"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">with</span> arcpy.da.UpdateCursor(tabela, [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"year"</span>], <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"year = </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>ano<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> AND bioma = 'Amazônia'"</span>) <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> cur:</span>
<span id="cb5-4">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> _ <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> cur:</span>
<span id="cb5-5">        cur.deleteRow()</span>
<span id="cb5-6">novos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.analysis.Select(prodes_ucs, <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"memory</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\n</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ovos"</span>, <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"year = </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>ano<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> AND bioma = 'Amazônia'"</span>)</span>
<span id="cb5-7">arcpy.management.Append(novos, tabela, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"NO_TEST"</span>)</span></code></pre></div></div>
</div>
<div id="tabset-2-2" class="tab-pane" aria-labelledby="tabset-2-2-tab">
<p>No QGIS, o mais seguro é <strong>regravar a camada inteira</strong> a cada atualização (o cruzamento leva segundos). Para editar uma tabela que já existe, selecione o ano com <strong>Selecionar por expressão</strong> (<code>"year" = 2025</code>), apague as feições selecionadas e use <strong>Editar → Colar feições</strong> com os dados novos.</p>
</div>
<div id="tabset-2-3" class="tab-pane" aria-labelledby="tabset-2-3-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode sql code-with-copy"><code class="sourceCode sql"><span id="cb6-1"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BEGIN</span>;</span>
<span id="cb6-2"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">DELETE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.prodes_ucs <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> bioma <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Amazônia'</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AND</span> ano <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2025</span>;</span>
<span id="cb6-3"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">INSERT</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">INTO</span> artigos.prodes_ucs (bioma, ano, cnuc, nome_uc, grupo, geom, area_ha)</span>
<span id="cb6-4"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> bioma, ano, cnuc, nome_uc, grupo, geom, area_ha</span>
<span id="cb6-5"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.prodes_ucs_novo            <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-- o mesmo cruzamento, só com o ano novo</span></span>
<span id="cb6-6"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> bioma <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Amazônia'</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AND</span> ano <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2025</span>;</span>
<span id="cb6-7"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">COMMIT</span>;</span></code></pre></div></div>
<p>Se algo der errado entre o <code>DELETE</code> e o <code>INSERT</code>, o <code>ROLLBACK</code> desfaz tudo e a tabela não fica pela metade.</p>
</div>
<div id="tabset-2-4" class="tab-pane" aria-labelledby="tabset-2-4-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb7" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb7-1">historico <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.read_file(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dados/prodes_ucs_historico.gpkg"</span>)</span>
<span id="cb7-2">ano, bioma <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2025</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Amazônia"</span></span>
<span id="cb7-3">novos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> prodes_ucs[(prodes_ucs[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ano"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> ano) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> (prodes_ucs[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bioma"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> bioma)]</span>
<span id="cb7-4">historico <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.concat([historico[<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span>((historico[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ano"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> ano) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> (historico[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bioma"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> bioma))],</span>
<span id="cb7-5">                       novos])</span>
<span id="cb7-6">historico.to_file(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dados/prodes_ucs_historico.gpkg"</span>)</span></code></pre></div></div>
</div>
</div>
</div>
<p>O artigo <a href="../artigos/13-atualizar-camadas.html">Atualizar camadas sem duplicar</a> detalha esse padrão.</p>
</section>
<section id="armadilhas" class="level2">
<h2 class="anchored" data-anchor-id="armadilhas">Armadilhas</h2>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Aviso</span>Maiúsculas e minúsculas
</div>
</div>
<div class="callout-body-container callout-body">
<p>No recorte da Amazônia, 3 polígonos de 2024 vêm com <code>main_class = 'desmatamento'</code> (minúsculo) e 1.635 com <code>'DESMATAMENTO'</code>. Um filtro <code>main_class = 'DESMATAMENTO'</code> perde os três. Compare sempre com <code>UPPER(...)</code>.</p>
</div>
</div>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Aviso</span>Geometrias inválidas no PRODES
</div>
</div>
<div class="callout-body-container callout-body">
<p>2.263 dos 11.126 polígonos do PRODES Amazônia do recorte (20%) são inválidos. O script antigo tinha a linha <code>RepairGeometry</code> comentada, e funcionava por sorte. Corrija sempre antes do cruzamento.</p>
</div>
</div>
<div class="callout callout-style-default callout-tip callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Dica</span><code>area_km</code> já vem na tabela, por que recalcular?
</div>
</div>
<div class="callout-body-container callout-body">
<p>O <code>area_km</code> do INPE é a área do polígono <strong>inteiro</strong>. Depois da interseção, um polígono que cruza o limite da UC fica só com a parte de dentro, e o <code>area_km</code> original fica errado. Recalcule sempre depois de cortar.</p>
</div>
</div>
</section>
<section id="veja-também" class="level2">
<h2 class="anchored" data-anchor-id="veja-também">Veja também</h2>
<ul>
<li><a href="../artigos/02-interior-entorno.html">Interior e entorno das UCs</a></li>
<li><a href="../artigos/06-tabela-mensal-acumulada.html">Tabela mensal acumulada</a>, para o DETER, que sai todo dia</li>
</ul>
<div class="navegacao-livro">
<p><a href="../artigos/02-interior-entorno.html" class="anterior"><span class="direcao">← Anterior</span> Interior e entorno das UCs: o cruzamento que todo relatório usa</a> <a href="../artigos/04-focos-calor.html" class="proximo"><span class="direcao">Próximo →</span> Focos de calor das últimas 24 e 48 horas nas UCs</a></p>
</div>
</section>
<section id="atualizações" class="level2 unnumbered">
<h2 class="unnumbered anchored" data-anchor-id="atualizações">Atualizações</h2>
<ul>
<li><strong>29/10/2026:</strong> publicação, com dados do INPE, do MMA, do IBAMA e do SICAR de outubro de 2026.</li>
</ul>
<p><a href="https://hendesson.github.io/en/articles/03-prodes-protected-areas.html">English version</a></p>


</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> De volta ao topo</a><div id="quarto-appendix" class="default"><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Licença</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/deed.pt_br">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Como citar</h2><div><div class="quarto-appendix-secondary-label">BibTeX</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@misc{alves2026,
  author = {Alves, Hendesson},
  publisher = {Hendesson Alves},
  title = {Desmatamento anual do PRODES nas UCs da Amazônia e do
    Cerrado},
  date = {2026-10-29},
  url = {https://hendesson.github.io/artigos/03-prodes-ucs.html},
  doi = {10.5281/zenodo.23780250},
  langid = {pt-BR},
  abstract = {Um código só para cruzar o PRODES da Amazônia e do Cerrado
    com as Unidades de Conservação, montar a tabela por UC e a série
    histórica, e atualizar o ano novo sem duplicar. Nos dois biomas,
    quase todo o desmatamento em UCs está nas de Uso Sustentável.}
}
</code></pre><div class="quarto-appendix-secondary-label">Por favor, cite este trabalho como:</div><div id="ref-alves2026" class="csl-entry quarto-appendix-citeas">
Alves, Hendesson. 2026. <span>“Desmatamento anual do PRODES nas UCs da
Amazônia e do Cerrado.”</span> In <em>Artigos de geoprocessamento para
monitoramento ambiental</em>. Preprint, Hendesson Alves, October 29. <a href="https://doi.org/10.5281/zenodo.23780250">https://doi.org/10.5281/zenodo.23780250</a>.
</div></div></section></div> ]]></description>
  <category>UCs</category>
  <category>PRODES</category>
  <guid>https://hendesson.github.io/artigos/03-prodes-ucs.html</guid>
  <pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate>
  <media:content url="https://hendesson.github.io/imagens/artigos/prodes_biomas.png" medium="image" type="image/png" height="56" width="144"/>
</item>
<item>
  <title>Focos de calor das últimas 24 e 48 horas nas UCs</title>
  <dc:creator>Hendesson Alves</dc:creator>
  <link>https://hendesson.github.io/artigos/04-focos-calor.html</link>
  <description><![CDATA[ 





<div class="ficha">
<p><span class="rotulo">Nível</span> Iniciante <span class="rotulo">Leitura</span> 9 min <span class="rotulo">Dados</span> outubro de 2026 <span class="rotulo">Programas</span> <span class="selo-texto">ArcGIS</span> <img src="https://hendesson.github.io/imagens/ferramentas/qgis.svg" class="img-fluid" alt="QGIS"> <img src="https://hendesson.github.io/imagens/ferramentas/postgis.svg" class="img-fluid" alt="PostGIS"> <img src="https://hendesson.github.io/imagens/ferramentas/python.svg" class="img-fluid" alt="Python"></p>
</div>
<p>Na época seca, as equipes de brigada começam o dia com uma pergunta: <strong>onde apareceu fogo nas UCs desde ontem?</strong> O INPE publica os focos de calor detectados por vários satélites várias vezes por hora, em arquivos abertos.</p>
<p>O script que eu usava lia os focos do <em>Living Atlas</em> do ArcGIS Online e só funcionava com uma conta da instituição. Aqui os focos vêm direto do <strong>servidor do INPE</strong>, sem login.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://hendesson.github.io/imagens/artigos/focos_48h.png" class="img-fluid figure-img" alt="Mapa da região de Novo Progresso com as UCs em verde claro, a faixa de entorno em amarelo e focos de calor como pontos: vermelhos nas últimas 24 horas e laranja entre 24 e 48 horas. A maior concentração está na Área de Proteção Ambiental do Tapajós."></p>
<figcaption>Focos de calor das últimas 48 horas no recorte de exemplo (consulta de 29/10/2026).</figcaption>
</figure>
</div>
<section id="de-onde-vêm-os-focos" class="level2">
<h2 class="anchored" data-anchor-id="de-onde-vêm-os-focos">De onde vêm os focos</h2>
<table class="caption-top table">
<colgroup>
<col style="width: 33%">
<col style="width: 33%">
<col style="width: 33%">
</colgroup>
<thead>
<tr class="header">
<th>Fonte</th>
<th>Endereço</th>
<th>Atualização</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><strong>INPE, arquivo diário</strong></td>
<td><code>https://dataserver-coids.inpe.br/queimadas/queimadas/focos/csv/diario/Brasil/focos_diario_br_AAAAMMDD.csv</code></td>
<td>o do dia vai crescendo ao longo do dia</td>
</tr>
<tr class="even">
<td>INPE, a cada 10 minutos</td>
<td><code>https://dataserver-coids.inpe.br/queimadas/queimadas/focos/csv/10min/</code></td>
<td>10 minutos</td>
</tr>
<tr class="odd">
<td>NASA FIRMS (VIIRS e MODIS)</td>
<td><code>https://firms.modaps.eosdis.nasa.gov/data/active_fire/suomi-npp-viirs-c2/csv/SUOMI_VIIRS_C2_South_America_48h.csv</code></td>
<td>algumas horas; também há <code>_24h</code> e <code>_7d</code></td>
</tr>
</tbody>
</table>
<p>O arquivo do INPE tem uma linha por foco, com <code>lat</code>, <code>lon</code>, <code>data_hora_gmt</code>, <code>satelite</code>, <code>municipio</code>, <code>estado</code>, <code>bioma</code> e outros campos.</p>
<div class="callout callout-style-default callout-important callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Importante</span>Foco de calor não é área queimada
</div>
</div>
<div class="callout-body-container callout-body">
<p>Um foco é um <strong>pixel quente</strong> visto por um satélite num instante. O mesmo incêndio aparece como dezenas de focos, e um mesmo foco pode ser visto por vários satélites. Use os focos para <strong>alertar</strong> e para comparar períodos com o <strong>satélite de referência</strong> (<code>AQUA_M-T</code>). Para área queimada, veja as cicatrizes de queimada do DETER ou o MapBiomas Fogo.</p>
</div>
</div>
</section>
<section id="o-que-você-vai-fazer" class="level2">
<h2 class="anchored" data-anchor-id="o-que-você-vai-fazer">O que você vai fazer</h2>
<ol type="1">
<li>Baixar os arquivos de <strong>hoje, ontem e anteontem</strong> (para cobrir 48 horas completas).</li>
<li>Transformar <code>lon</code> e <code>lat</code> em <strong>pontos</strong> (SIRGAS 2000).</li>
<li>Filtrar pela <strong>hora</strong> (em UTC, como vem no arquivo).</li>
<li>Descobrir <strong>em qual UC</strong> (ou entorno) cada foco caiu.</li>
<li>Contar por UC, janela de tempo e satélite.</li>
</ol>
</section>
<section id="o-código" class="level2">
<h2 class="anchored" data-anchor-id="o-código">O código</h2>
<div class="tabset-margin-container"></div><div class="panel-tabset" data-group="programa">
<ul class="nav nav-tabs"><li class="nav-item"><a class="nav-link active" id="tabset-1-1-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-1" aria-controls="tabset-1-1" aria-selected="true" href="">ArcGIS Pro</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-2-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-2" aria-controls="tabset-1-2" aria-selected="false" href="">QGIS</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-3-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-3" aria-controls="tabset-1-3" aria-selected="false" href="">PostGIS</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-4-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-4" aria-controls="tabset-1-4" aria-selected="false" href="">Python</a></li></ul>
<div class="tab-content" data-group="programa">
<div id="tabset-1-1" class="tab-pane active" aria-labelledby="tabset-1-1-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> arcpy</span>
<span id="cb1-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> urllib.request</span>
<span id="cb1-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> datetime <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> datetime, timedelta, timezone</span>
<span id="cb1-4"></span>
<span id="cb1-5">arcpy.env.overwriteOutput <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span></span>
<span id="cb1-6">gpkg <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\a</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">rtigos</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">gpkg"</span></span>
<span id="cb1-7">pasta <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\f</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ocos"</span></span>
<span id="cb1-8">url <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"https://dataserver-coids.inpe.br/queimadas/queimadas/focos/csv/diario/"</span></span>
<span id="cb1-9">       <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Brasil/focos_diario_br_</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">.csv"</span>)</span>
<span id="cb1-10"></span>
<span id="cb1-11"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1 e 2. Baixar os três dias e criar os pontos</span></span>
<span id="cb1-12">agora <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> datetime.now(timezone.utc)</span>
<span id="cb1-13">pontos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb1-14"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> i <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>):</span>
<span id="cb1-15">    dia <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (agora <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> timedelta(days<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>i)).strftime(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"%Y%m</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%d</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb1-16">    csv <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">rf"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>pasta<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\f</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ocos_</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>dia<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">csv"</span></span>
<span id="cb1-17">    urllib.request.urlretrieve(url.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">format</span>(dia), csv)</span>
<span id="cb1-18">    pontos.append(arcpy.management.XYTableToPoint(</span>
<span id="cb1-19">        csv, <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">rf"memory</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\f</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ocos_</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>dia<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"lon"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"lat"</span>,</span>
<span id="cb1-20">        coordinate_system<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>arcpy.SpatialReference(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4674</span>)))</span>
<span id="cb1-21">focos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.management.Merge(pontos, <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"memory</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\f</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ocos"</span>)</span>
<span id="cb1-22"></span>
<span id="cb1-23"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 3 e 4. UC de cada foco e filtro das últimas 48 horas</span></span>
<span id="cb1-24">focos_ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.analysis.PairwiseIntersect([focos, gpkg <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\m</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ain</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ucs"</span>], <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"memory</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\f</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ocos_ucs"</span>)</span>
<span id="cb1-25">corte_48h <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (agora <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> timedelta(hours<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">48</span>)).strftime(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"%Y-%m-</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%d</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;"> %H:%M:%S"</span>)</span>
<span id="cb1-26">ultimos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.analysis.Select(focos_ucs, <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\r</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">esultados</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">gdb</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\f</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ocos_ucs_48h"</span>,</span>
<span id="cb1-27">                                <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"data_hora_gmt &gt;= timestamp '</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>corte_48h<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">'"</span>)</span>
<span id="cb1-28"></span>
<span id="cb1-29"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 5. Contagem por UC e satélite</span></span>
<span id="cb1-30">arcpy.analysis.Statistics(ultimos, <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\r</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">esultados</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">gdb</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\f</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ocos_por_uc"</span>,</span>
<span id="cb1-31">                          [[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"id"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"COUNT"</span>]], [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"satelite"</span>])</span></code></pre></div></div>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
Nota
</div>
</div>
<div class="callout-body-container callout-body">
<p>O <code>XYTableToPoint</code> lê o <code>data_hora_gmt</code> como texto ou como data, conforme a versão do ArcGIS Pro. Se o <code>Select</code> não encontrar nada, confira o tipo do campo e troque o filtro por <code>data_hora_gmt &gt;= '{corte_48h}'</code>, que compara o texto.</p>
</div>
</div>
</div>
<div id="tabset-1-2" class="tab-pane" aria-labelledby="tabset-1-2-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb2-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> os, tempfile, urllib.request</span>
<span id="cb2-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> datetime <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> datetime, timedelta, timezone</span>
<span id="cb2-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> processing</span>
<span id="cb2-4"></span>
<span id="cb2-5">G <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"C:/dados/artigos.gpkg"</span></span>
<span id="cb2-6">url <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"https://dataserver-coids.inpe.br/queimadas/queimadas/focos/csv/diario/"</span></span>
<span id="cb2-7">       <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Brasil/focos_diario_br_</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">.csv"</span>)</span>
<span id="cb2-8"></span>
<span id="cb2-9"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> rodar(alg, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span>p):</span>
<span id="cb2-10">    p.setdefault(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"OUTPUT"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"memory:"</span>)</span>
<span id="cb2-11">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> processing.run(alg, p)[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"OUTPUT"</span>]</span>
<span id="cb2-12"></span>
<span id="cb2-13"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1 e 2. Baixar os três dias e abrir como camada de pontos (texto delimitado)</span></span>
<span id="cb2-14">agora <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> datetime.now(timezone.utc)</span>
<span id="cb2-15">camadas <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb2-16"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> i <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>):</span>
<span id="cb2-17">    dia <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (agora <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> timedelta(days<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>i)).strftime(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"%Y%m</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%d</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb2-18">    csv <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> os.path.join(tempfile.gettempdir(), <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"focos_</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>dia<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">.csv"</span>)</span>
<span id="cb2-19">    urllib.request.urlretrieve(url.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">format</span>(dia), csv)</span>
<span id="cb2-20">    uri <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"file:///</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>csv<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">?delimiter=,&amp;xField=lon&amp;yField=lat&amp;crs=EPSG:4674"</span></span>
<span id="cb2-21">           <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"&amp;field=data_hora_gmt:text"</span>)</span>
<span id="cb2-22">    camadas.append(QgsVectorLayer(uri, <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"focos_</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>dia<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"delimitedtext"</span>))</span>
<span id="cb2-23">focos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:mergevectorlayers"</span>, LAYERS<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>camadas, CRS<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"EPSG:4674"</span>)</span>
<span id="cb2-24"></span>
<span id="cb2-25"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 3. Últimas 48 horas (texto no formato AAAA-MM-DD HH:MM:SS se compara como data)</span></span>
<span id="cb2-26">corte <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (agora <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> timedelta(hours<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">48</span>)).strftime(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"%Y-%m-</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%d</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;"> %H:%M:%S"</span>)</span>
<span id="cb2-27">focos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:extractbyexpression"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>focos,</span>
<span id="cb2-28">              EXPRESSION<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\"</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">data_hora_gmt</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\"</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> &gt;= '</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>corte<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">'"</span>)</span>
<span id="cb2-29"></span>
<span id="cb2-30"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 4. UC de cada foco (predicado 5 = "está dentro")</span></span>
<span id="cb2-31">focos_ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:joinattributesbylocation"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>focos,</span>
<span id="cb2-32">                  JOIN<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>G<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">|layername=ucs"</span>, PREDICATE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>], JOIN_FIELDS<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>],</span>
<span id="cb2-33">                  METHOD<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, DISCARD_NONMATCHING<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb2-34"></span>
<span id="cb2-35"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 5. Contagem por UC e satélite</span></span>
<span id="cb2-36">resumo <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"qgis:statisticsbycategories"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>focos_ucs,</span>
<span id="cb2-37">               CATEGORIES_FIELD_NAME<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"satelite"</span>])</span>
<span id="cb2-38"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> f <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> resumo.getFeatures():</span>
<span id="cb2-39">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>], f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"satelite"</span>], f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"count"</span>])</span>
<span id="cb2-40">QgsProject.instance().addMapLayer(focos_ucs)</span></code></pre></div></div>
<p>O <code>&amp;field=data_hora_gmt:text</code> no endereço da camada obriga o QGIS a ler a data como texto, e assim o filtro funciona igual em qualquer idioma do sistema.</p>
</div>
<div id="tabset-1-3" class="tab-pane" aria-labelledby="tabset-1-3-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode sql code-with-copy"><code class="sourceCode sql"><span id="cb3-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-- 1. Tabela para os focos e carga dos três arquivos (o \copy roda no seu computador)</span></span>
<span id="cb3-2"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">DROP</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">TABLE</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">IF</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">EXISTS</span> artigos.focos;</span>
<span id="cb3-3"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">CREATE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">TABLE</span> artigos.focos (</span>
<span id="cb3-4">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">id</span> text, lat <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">numeric</span>, lon <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">numeric</span>, data_hora_gmt <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">timestamp</span>,</span>
<span id="cb3-5">    satelite text, municipio text, estado text, pais text,</span>
<span id="cb3-6">    municipio_id bigint, estado_id <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">int</span>, pais_id <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">int</span>,</span>
<span id="cb3-7">    numero_dias_sem_chuva <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">numeric</span>, precipitacao <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">numeric</span>, risco_fogo <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">numeric</span>,</span>
<span id="cb3-8">    bioma text, frp <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">numeric</span></span>
<span id="cb3-9">);</span>
<span id="cb3-10">\<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">copy</span> artigos.focos <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> PROGRAM <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'curl -s https://dataserver-coids.inpe.br/queimadas/queimadas/focos/csv/diario/Brasil/focos_diario_br_$(date -u +%Y%m%d).csv'</span> CSV <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">HEADER</span></span>
<span id="cb3-11">\<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">copy</span> artigos.focos <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> PROGRAM <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'curl -s https://dataserver-coids.inpe.br/queimadas/queimadas/focos/csv/diario/Brasil/focos_diario_br_$(date -u -d yesterday +%Y%m%d).csv'</span> CSV <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">HEADER</span></span>
<span id="cb3-12">\<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">copy</span> artigos.focos <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> PROGRAM <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'curl -s https://dataserver-coids.inpe.br/queimadas/queimadas/focos/csv/diario/Brasil/focos_diario_br_$(date -u -d "2 days ago" +%Y%m%d).csv'</span> CSV <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">HEADER</span></span>
<span id="cb3-13"></span>
<span id="cb3-14"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-- 2. Pontos</span></span>
<span id="cb3-15"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ALTER</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">TABLE</span> artigos.focos <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ADD</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">COLUMN</span> geom geometry(Point, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4674</span>);</span>
<span id="cb3-16"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">UPDATE</span> artigos.focos <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SET</span> geom <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ST_SetSRID(ST_MakePoint(lon, lat), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4674</span>);</span>
<span id="cb3-17"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">CREATE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">INDEX</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ON</span> artigos.focos <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">USING</span> gist (geom);</span>
<span id="cb3-18"></span>
<span id="cb3-19"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-- 3 a 5. Focos em UCs nas últimas 24 e 48 horas (hora em UTC)</span></span>
<span id="cb3-20"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> u.nome_uc,</span>
<span id="cb3-21">       <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">count</span>(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FILTER</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> f.data_hora_gmt <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> (now() <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AT</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">TIME</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">ZONE</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'UTC'</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">interval</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'24 hours'</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> focos_24h,</span>
<span id="cb3-22">       <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">count</span>(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> focos_48h,</span>
<span id="cb3-23">       <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">count</span>(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FILTER</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> f.satelite <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'AQUA_M-T'</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> focos_48h_referencia</span>
<span id="cb3-24"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.focos f</span>
<span id="cb3-25"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">JOIN</span> artigos.ucs u <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ON</span> ST_Within(f.geom, u.geom)</span>
<span id="cb3-26"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> f.data_hora_gmt <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> (now() <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AT</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">TIME</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">ZONE</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'UTC'</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">interval</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'48 hours'</span></span>
<span id="cb3-27"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">GROUP</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BY</span> u.nome_uc</span>
<span id="cb3-28"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ORDER</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BY</span> focos_48h <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">DESC</span>;</span></code></pre></div></div>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
Nota
</div>
</div>
<div class="callout-body-container callout-body">
<p>O <code>\copy … FROM PROGRAM</code> precisa do <code>curl</code> e, no Windows, troque o <code>$(date …)</code> pela data escrita à mão. Outra opção é baixar os arquivos antes e usar <code>\copy artigos.focos FROM 'focos.csv' CSV HEADER</code>.</p>
</div>
</div>
</div>
<div id="tabset-1-4" class="tab-pane" aria-labelledby="tabset-1-4-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb4-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> datetime <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> datetime, timedelta, timezone</span>
<span id="cb4-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> pd</span>
<span id="cb4-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> geopandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> gpd</span>
<span id="cb4-4"></span>
<span id="cb4-5">url <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"https://dataserver-coids.inpe.br/queimadas/queimadas/focos/csv/diario/"</span></span>
<span id="cb4-6">       <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Brasil/focos_diario_br_</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">.csv"</span>)</span>
<span id="cb4-7"></span>
<span id="cb4-8"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1. Baixar hoje, ontem e anteontem</span></span>
<span id="cb4-9">agora <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> datetime.now(timezone.utc)</span>
<span id="cb4-10">dias <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [(agora <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> timedelta(days<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>i)).strftime(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"%Y%m</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%d</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>) <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> i <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>)]</span>
<span id="cb4-11">focos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.concat([pd.read_csv(url.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">format</span>(d)) <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> d <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> dias], ignore_index<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb4-12">focos[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"data_hora_gmt"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.to_datetime(focos[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"data_hora_gmt"</span>], utc<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb4-13"></span>
<span id="cb4-14"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2. Pontos e 3. últimas 48 horas</span></span>
<span id="cb4-15">focos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.GeoDataFrame(focos, geometry<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>gpd.points_from_xy(focos.lon, focos.lat), crs<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4674</span>)</span>
<span id="cb4-16">focos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> focos[focos[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"data_hora_gmt"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> agora <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> timedelta(hours<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">48</span>)]</span>
<span id="cb4-17">focos[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"janela"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (focos[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"data_hora_gmt"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> agora <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> timedelta(hours<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">24</span>)).<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">map</span>(</span>
<span id="cb4-18">    {<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"últimas 24 h"</span>, <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"24 a 48 h"</span>})</span>
<span id="cb4-19"></span>
<span id="cb4-20"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 4. Em qual UC (ou entorno) caiu cada foco</span></span>
<span id="cb4-21">G <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dados/artigos.gpkg"</span></span>
<span id="cb4-22">zonas <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.concat([</span>
<span id="cb4-23">    gpd.read_file(G, layer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ucs"</span>)[[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"geometry"</span>]].assign(local<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"interior"</span>),</span>
<span id="cb4-24">    gpd.read_file(G, layer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ucs_entorno"</span>)[[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"geometry"</span>]].assign(local<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"entorno"</span>),</span>
<span id="cb4-25">])</span>
<span id="cb4-26">focos_ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.sjoin(focos, zonas, predicate<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"within"</span>)</span>
<span id="cb4-27"></span>
<span id="cb4-28"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 5. Contagem</span></span>
<span id="cb4-29"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(pd.crosstab([focos_ucs[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>], focos_ucs[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"local"</span>]], focos_ucs[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"janela"</span>],</span>
<span id="cb4-30">                  margins<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>, margins_name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"total"</span>))</span>
<span id="cb4-31"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(focos_ucs[focos_ucs[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"satelite"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"AQUA_M-T"</span>].groupby(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>).size())</span>
<span id="cb4-32">focos_ucs.to_file(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dados/focos_ucs_48h.gpkg"</span>)</span></code></pre></div></div>
</div>
</div>
</div>
</section>
<section id="conferindo-o-resultado" class="level2">
<h2 class="anchored" data-anchor-id="conferindo-o-resultado">Conferindo o resultado</h2>
<p>Os números mudam a cada execução. Na tarde de 29/10/2026, as três versões testadas encontraram os mesmos focos dentro das UCs do recorte:</p>
<table class="table-striped caption-top table">
<caption>Focos de calor no interior e no entorno das UCs, consulta de 29/10/2026 às 16h40 (Brasília).</caption>
<colgroup>
<col style="width: 15%">
<col style="width: 21%">
<col style="width: 21%">
<col style="width: 21%">
<col style="width: 21%">
</colgroup>
<thead>
<tr class="header">
<th>UC</th>
<th style="text-align: right;">Últimas 24 h</th>
<th style="text-align: right;">Últimas 48 h</th>
<th style="text-align: right;">48 h, só <code>AQUA_M-T</code></th>
<th style="text-align: right;">Entorno, 48 h</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Área de Proteção Ambiental do Tapajós</td>
<td style="text-align: right;">17</td>
<td style="text-align: right;">34</td>
<td style="text-align: right;">5</td>
<td style="text-align: right;">41</td>
</tr>
<tr class="even">
<td>Floresta Nacional de Altamira</td>
<td style="text-align: right;">5</td>
<td style="text-align: right;">8</td>
<td style="text-align: right;">4</td>
<td style="text-align: right;">0</td>
</tr>
<tr class="odd">
<td>Floresta Nacional do Jamanxim</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">8</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">3</td>
</tr>
<tr class="even">
<td>Floresta Estadual de Iriri</td>
<td style="text-align: right;">1</td>
<td style="text-align: right;">1</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr class="odd">
<td>Área de Proteção Ambiental Pouso Alto (Cerrado)</td>
<td style="text-align: right;">1</td>
<td style="text-align: right;">1</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
</tbody>
</table>
<p>Os mesmos 52 focos no interior das UCs, nas três versões. A diferença entre a coluna de todos os satélites (34) e a do satélite de referência (5) na APA do Tapajós mostra por que não se deve somar satélites para comparar períodos.</p>
</section>
<section id="rodar-sozinho-todo-dia" class="level2">
<h2 class="anchored" data-anchor-id="rodar-sozinho-todo-dia">Rodar sozinho todo dia</h2>
<p>Este é o tipo de script que vale <strong>agendar</strong>:</p>
<ul>
<li><strong>Windows:</strong> Agendador de Tarefas, chamando <code>propy.bat script.py</code> (ArcGIS Pro) ou <code>python script.py</code>.</li>
<li><strong>ArcGIS Pro 3.x:</strong> botão direito na ferramenta de script → <strong>Agendar</strong>.</li>
<li><strong>Linux/Mac:</strong> <code>crontab -e</code> e uma linha como <code>0 7 * * * cd /dados &amp;&amp; python focos.py</code>.</li>
</ul>
<p>Para não acumular linhas repetidas a cada execução, veja <a href="../artigos/13-atualizar-camadas.html">Atualizar camadas sem duplicar</a>.</p>
</section>
<section id="armadilhas" class="level2">
<h2 class="anchored" data-anchor-id="armadilhas">Armadilhas</h2>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Aviso</span>Hora em UTC
</div>
</div>
<div class="callout-body-container callout-body">
<p>O campo <code>data_hora_gmt</code> está em <strong>UTC</strong> (Brasília = UTC−3). Se você filtrar “últimas 24 horas” com a hora do relógio do computador, perde ou ganha 3 horas de focos. Calcule o corte em UTC, como nos códigos acima.</p>
</div>
</div>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Aviso</span>Contar focos de todos os satélites
</div>
</div>
<div class="callout-body-container callout-body">
<p>No mesmo dia, o recorte teve focos de 7 satélites. Somar todos dá um número maior, que muda conforme os satélites em operação. Para comparar anos ou meses, use só o <code>AQUA_M-T</code> (satélite de referência). Para alertar a brigada, use todos.</p>
</div>
</div>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Aviso</span>O arquivo de hoje está incompleto
</div>
</div>
<div class="callout-body-container callout-body">
<p>O arquivo do dia corrente vai crescendo ao longo do dia. Por isso o código baixa <strong>três</strong> arquivos: só assim as últimas 48 horas ficam completas a qualquer hora.</p>
</div>
</div>
</section>
<section id="veja-também" class="level2">
<h2 class="anchored" data-anchor-id="veja-também">Veja também</h2>
<ul>
<li><a href="../artigos/02-interior-entorno.html">Interior e entorno das UCs</a>, para montar a camada de entorno</li>
<li><a href="../guia-espacial/guia/03-fontes-de-dados.html">Fontes de dados</a>, com o BDQueimadas e o MapBiomas Fogo</li>
</ul>
<div class="navegacao-livro">
<p><a href="../artigos/03-prodes-ucs.html" class="anterior"><span class="direcao">← Anterior</span> Desmatamento anual do PRODES nas UCs da Amazônia e do Cerrado</a> <a href="../artigos/05-campos-de-data.html" class="proximo"><span class="direcao">Próximo →</span> Ano, mês e ano PRODES: campos de data em cada programa</a></p>
</div>
</section>
<section id="atualizações" class="level2 unnumbered">
<h2 class="unnumbered anchored" data-anchor-id="atualizações">Atualizações</h2>
<ul>
<li><strong>29/10/2026:</strong> publicação, com dados do INPE, do MMA, do IBAMA e do SICAR de outubro de 2026.</li>
</ul>
<p><a href="https://hendesson.github.io/en/articles/04-fire-hotspots.html">English version</a></p>


</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> De volta ao topo</a><div id="quarto-appendix" class="default"><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Licença</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/deed.pt_br">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Como citar</h2><div><div class="quarto-appendix-secondary-label">BibTeX</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@misc{alves2026,
  author = {Alves, Hendesson},
  publisher = {Hendesson Alves},
  title = {Focos de calor das últimas 24 e 48 horas nas UCs},
  date = {2026-10-29},
  url = {https://hendesson.github.io/artigos/04-focos-calor.html},
  doi = {10.5281/zenodo.23780252},
  langid = {pt-BR},
  abstract = {Os focos de calor do INPE direto do servidor público, sem
    login: baixar os arquivos do dia, transformar em pontos, filtrar as
    últimas 24 e 48 horas em UTC e contar por UC. E por que somar focos
    de vários satélites engana.}
}
</code></pre><div class="quarto-appendix-secondary-label">Por favor, cite este trabalho como:</div><div id="ref-alves2026" class="csl-entry quarto-appendix-citeas">
Alves, Hendesson. 2026. <span>“Focos de calor das últimas 24 e 48 horas
nas UCs.”</span> In <em>Artigos de geoprocessamento para monitoramento
ambiental</em>. Preprint, Hendesson Alves, October 29. <a href="https://doi.org/10.5281/zenodo.23780252">https://doi.org/10.5281/zenodo.23780252</a>.
</div></div></section></div> ]]></description>
  <category>Fogo</category>
  <category>UCs</category>
  <guid>https://hendesson.github.io/artigos/04-focos-calor.html</guid>
  <pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate>
  <media:content url="https://hendesson.github.io/imagens/artigos/focos_48h.png" medium="image" type="image/png" height="175" width="144"/>
</item>
<item>
  <title>Ano, mês e ano PRODES: campos de data em cada programa</title>
  <dc:creator>Hendesson Alves</dc:creator>
  <link>https://hendesson.github.io/artigos/05-campos-de-data.html</link>
  <description><![CDATA[ 





<div class="ficha">
<p><span class="rotulo">Nível</span> Iniciante <span class="rotulo">Leitura</span> 6 min <span class="rotulo">Dados</span> outubro de 2026 <span class="rotulo">Programas</span> <span class="selo-texto">ArcGIS</span> <img src="https://hendesson.github.io/imagens/ferramentas/qgis.svg" class="img-fluid" alt="QGIS"> <img src="https://hendesson.github.io/imagens/ferramentas/postgis.svg" class="img-fluid" alt="PostGIS"> <img src="https://hendesson.github.io/imagens/ferramentas/python.svg" class="img-fluid" alt="Python"> <img src="https://hendesson.github.io/imagens/ferramentas/powerbi.svg" class="img-fluid" alt="Power BI"></p>
</div>
<p>Todo painel de monitoramento precisa quebrar as datas em pedaços: <strong>ano</strong>, <strong>mês</strong>, <strong>nome do mês</strong> e, no caso do desmatamento, o <strong>ano PRODES</strong>, que vai de <strong>1º de agosto a 31 de julho</strong>. O “PRODES 2025” começa em agosto de 2024.</p>
<p>Nos scripts antigos, cada pedaço era uma função com um <code>UpdateCursor</code>, repetida em vários arquivos. Aqui cada um vira <strong>uma linha</strong> em cada programa.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://hendesson.github.io/imagens/artigos/calendario_prodes.png" class="img-fluid figure-img" alt="Duas réguas de meses. Na de cima, o ano civil de janeiro a dezembro. Na de baixo, o ano PRODES 2025, de agosto de 2024 (mês 1) a julho de 2025 (mês 12), com setas ligando os meses correspondentes."></p>
<figcaption>O ano PRODES começa em agosto: agosto é o mês 1 e julho, o mês 12.</figcaption>
</figure>
</div>
<section id="as-regras" class="level2">
<h2 class="anchored" data-anchor-id="as-regras">As regras</h2>
<table class="caption-top table">
<colgroup>
<col style="width: 25%">
<col style="width: 25%">
<col style="width: 25%">
<col style="width: 25%">
</colgroup>
<thead>
<tr class="header">
<th>Campo</th>
<th>Regra</th>
<th>15/03/2025</th>
<th>20/09/2025</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><code>ano</code></td>
<td>ano da data</td>
<td>2025</td>
<td>2025</td>
</tr>
<tr class="even">
<td><code>mes</code></td>
<td>mês da data</td>
<td>3</td>
<td>9</td>
</tr>
<tr class="odd">
<td><code>mes_nome</code></td>
<td>nome do mês, por uma lista fixa</td>
<td>Março</td>
<td>Setembro</td>
</tr>
<tr class="even">
<td><code>ano_prodes</code></td>
<td>ano + 1 se o mês for agosto ou depois</td>
<td>2025</td>
<td><strong>2026</strong></td>
</tr>
<tr class="odd">
<td><code>mes_prodes</code></td>
<td>agosto = 1 … julho = 12, ou <code>(mes + 4) % 12 + 1</code></td>
<td>8</td>
<td>2</td>
</tr>
</tbody>
</table>
<p>O <code>%</code> é o <strong>resto da divisão</strong>: <code>(9 + 4) % 12 + 1</code> = <code>13 % 12 + 1</code> = <code>1 + 1</code> = 2.</p>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Aviso</span>Nome do mês pelo idioma do computador
</div>
</div>
<div class="callout-body-container callout-body">
<p>O script antigo usava <code>strftime("%B")</code>, que devolve o nome do mês <strong>no idioma do sistema</strong>: “março” num computador em português, “March” num servidor em inglês. Num painel, isso mistura idiomas. Use uma <strong>lista fixa</strong> de nomes, como nos códigos abaixo.</p>
</div>
</div>
</section>
<section id="o-código" class="level2">
<h2 class="anchored" data-anchor-id="o-código">O código</h2>
<p>Os exemplos usam a camada <code>deter</code> (campo <code>view_date</code>) do GeoPackage dos artigos (<a href="../artigos/sobre.html#dados">como baixar</a>).</p>
<div class="tabset-margin-container"></div><div class="panel-tabset" data-group="programa">
<ul class="nav nav-tabs"><li class="nav-item"><a class="nav-link active" id="tabset-1-1-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-1" aria-controls="tabset-1-1" aria-selected="true" href="">ArcGIS Pro</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-2-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-2" aria-controls="tabset-1-2" aria-selected="false" href="">QGIS</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-3-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-3" aria-controls="tabset-1-3" aria-selected="false" href="">PostGIS</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-4-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-4" aria-controls="tabset-1-4" aria-selected="false" href="">Python</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-5-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-5" aria-controls="tabset-1-5" aria-selected="false" href="">Power BI</a></li></ul>
<div class="tab-content" data-group="programa">
<div id="tabset-1-1" class="tab-pane active" aria-labelledby="tabset-1-1-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> arcpy</span>
<span id="cb1-2"></span>
<span id="cb1-3">fc <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\r</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">esultados</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">gdb</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">eter"</span></span>
<span id="cb1-4">arcpy.management.CopyFeatures(<span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\a</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">rtigos</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">gpkg</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\m</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ain</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">deter"</span>, fc)</span>
<span id="cb1-5"></span>
<span id="cb1-6">meses <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"['Janeiro','Fevereiro','Março','Abril','Maio','Junho','Julho',"</span></span>
<span id="cb1-7">         <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"'Agosto','Setembro','Outubro','Novembro','Dezembro']"</span>)</span>
<span id="cb1-8"></span>
<span id="cb1-9">arcpy.management.CalculateFields(fc, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"PYTHON3"</span>, [</span>
<span id="cb1-10">    [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ano"</span>,        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"!view_date!.year"</span>],</span>
<span id="cb1-11">    [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mes"</span>,        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"!view_date!.month"</span>],</span>
<span id="cb1-12">    [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mes_nome"</span>,   <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>meses<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">[!view_date!.month - 1]"</span>],</span>
<span id="cb1-13">    [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ano_prodes"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"!view_date!.year + (1 if !view_date!.month &gt;= 8 else 0)"</span>],</span>
<span id="cb1-14">    [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mes_prodes"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"(!view_date!.month + 4) % 12 + 1"</span>],</span>
<span id="cb1-15">])</span></code></pre></div></div>
<p><code>CalculateFields</code> (no plural) calcula vários campos de uma vez e cria os que não existem. No ArcMap, use um <code>CalculateField_management</code> para cada campo, com <code>"PYTHON_9.3"</code>.</p>
</div>
<div id="tabset-1-2" class="tab-pane" aria-labelledby="tabset-1-2-tab">
<p>Na <strong>Calculadora de campo</strong>, crie cada campo com a expressão:</p>
<table class="caption-top table">
<colgroup>
<col style="width: 33%">
<col style="width: 33%">
<col style="width: 33%">
</colgroup>
<thead>
<tr class="header">
<th>Campo</th>
<th>Tipo</th>
<th>Expressão</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><code>ano</code></td>
<td>inteiro</td>
<td><code>year("view_date")</code></td>
</tr>
<tr class="even">
<td><code>mes</code></td>
<td>inteiro</td>
<td><code>month("view_date")</code></td>
</tr>
<tr class="odd">
<td><code>mes_nome</code></td>
<td>texto</td>
<td><code>array_get(array('Janeiro','Fevereiro','Março','Abril','Maio','Junho','Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'), month("view_date") - 1)</code></td>
</tr>
<tr class="even">
<td><code>ano_prodes</code></td>
<td>inteiro</td>
<td><code>year("view_date") + if(month("view_date") &gt;= 8, 1, 0)</code></td>
</tr>
<tr class="odd">
<td><code>mes_prodes</code></td>
<td>inteiro</td>
<td><code>(month("view_date") + 4) % 12 + 1</code></td>
</tr>
</tbody>
</table>
<p>No console Python, os mesmos cinco campos numa sequência:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb2-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> processing</span>
<span id="cb2-2">G <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"C:/dados/artigos.gpkg"</span></span>
<span id="cb2-3"></span>
<span id="cb2-4">campos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [</span>
<span id="cb2-5">    (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ano"</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'year("view_date")'</span>),</span>
<span id="cb2-6">    (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mes"</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'month("view_date")'</span>),</span>
<span id="cb2-7">    (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mes_nome"</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"array_get(array('Janeiro','Fevereiro','Março','Abril','Maio','Junho',"</span></span>
<span id="cb2-8">                    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'), "</span></span>
<span id="cb2-9">                    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'month("view_date") - 1)'</span>),</span>
<span id="cb2-10">    (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ano_prodes"</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'year("view_date") + if(month("view_date") &gt;= 8, 1, 0)'</span>),</span>
<span id="cb2-11">    (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mes_prodes"</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'(month("view_date") + 4) % 12 + 1'</span>),</span>
<span id="cb2-12">]</span>
<span id="cb2-13">camada <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>G<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">|layername=deter"</span></span>
<span id="cb2-14"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> nome, tipo, formula <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> campos:          <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># tipo: 1 = inteiro, 2 = texto</span></span>
<span id="cb2-15">    camada <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> processing.run(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:fieldcalculator"</span>, {</span>
<span id="cb2-16">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"INPUT"</span>: camada, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"FIELD_NAME"</span>: nome, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"FIELD_TYPE"</span>: tipo, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"FIELD_LENGTH"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span>,</span>
<span id="cb2-17">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"FORMULA"</span>: formula, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"OUTPUT"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"memory:"</span>})[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"OUTPUT"</span>]</span>
<span id="cb2-18"></span>
<span id="cb2-19">resumo <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> processing.run(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"qgis:statisticsbycategories"</span>, {</span>
<span id="cb2-20">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"INPUT"</span>: camada, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"CATEGORIES_FIELD_NAME"</span>: [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ano_prodes"</span>], <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"OUTPUT"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"memory:"</span>})[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"OUTPUT"</span>]</span>
<span id="cb2-21"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> f <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> resumo.getFeatures():</span>
<span id="cb2-22">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ano_prodes"</span>], f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"count"</span>])</span></code></pre></div></div>
</div>
<div id="tabset-1-3" class="tab-pane" aria-labelledby="tabset-1-3-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode sql code-with-copy"><code class="sourceCode sql"><span id="cb3-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> view_date,</span>
<span id="cb3-2">       <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">extract</span>(<span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">year</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> view_date):<span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">:int</span>                                   <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> ano,</span>
<span id="cb3-3">       <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">extract</span>(<span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">month</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> view_date):<span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">:int</span>                                  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> mes,</span>
<span id="cb3-4">       (<span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">ARRAY</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Janeiro'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fevereiro'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Março'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Abril'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Maio'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Junho'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Julho'</span>,</span>
<span id="cb3-5">              <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Agosto'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Setembro'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Outubro'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Novembro'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Dezembro'</span>])</span>
<span id="cb3-6">           [<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">extract</span>(<span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">month</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> view_date):<span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">:int</span>]                            <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> mes_nome,</span>
<span id="cb3-7">       <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">extract</span>(<span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">year</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> view_date <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">interval</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'5 months'</span>):<span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">:int</span>             <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> ano_prodes,</span>
<span id="cb3-8">       (<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">extract</span>(<span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">month</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> view_date):<span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">:int</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>) % <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>                   <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> mes_prodes</span>
<span id="cb3-9"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.deter</span>
<span id="cb3-10"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">LIMIT</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>;</span>
<span id="cb3-11"></span>
<span id="cb3-12"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-- Conferência: alertas por ano PRODES</span></span>
<span id="cb3-13"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">extract</span>(<span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">year</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> view_date <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">interval</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'5 months'</span>):<span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">:int</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> ano_prodes, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">count</span>(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>)</span>
<span id="cb3-14"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.deter</span>
<span id="cb3-15"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">GROUP</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BY</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span></span>
<span id="cb3-16"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ORDER</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BY</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>;</span></code></pre></div></div>
<p>O truque do <code>+ interval '5 months'</code>: somar 5 meses a qualquer data de agosto a dezembro empurra a data para o ano seguinte, e as de janeiro a julho continuam no mesmo ano. É exatamente a regra do ano PRODES.</p>
</div>
<div id="tabset-1-4" class="tab-pane" aria-labelledby="tabset-1-4-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb4-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> geopandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> gpd</span>
<span id="cb4-2"></span>
<span id="cb4-3">deter <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.read_file(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dados/artigos.gpkg"</span>, layer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"deter"</span>)</span>
<span id="cb4-4">data <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> deter[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>].astype(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"datetime64[ns]"</span>)</span>
<span id="cb4-5"></span>
<span id="cb4-6">MESES <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Janeiro"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Fevereiro"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Março"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Abril"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Maio"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Junho"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Julho"</span>,</span>
<span id="cb4-7">         <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Agosto"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Setembro"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Outubro"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Novembro"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Dezembro"</span>]</span>
<span id="cb4-8"></span>
<span id="cb4-9">deter[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ano"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> data.dt.year</span>
<span id="cb4-10">deter[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mes"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> data.dt.month</span>
<span id="cb4-11">deter[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mes_nome"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> deter[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mes"</span>].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">map</span>(<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> m: MESES[m <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>])</span>
<span id="cb4-12">deter[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ano_prodes"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> deter[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ano"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> (deter[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mes"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>).astype(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>)</span>
<span id="cb4-13">deter[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mes_prodes"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (deter[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mes"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span></span>
<span id="cb4-14"></span>
<span id="cb4-15"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(deter[[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ano"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mes"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mes_nome"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ano_prodes"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mes_prodes"</span>]].head())</span>
<span id="cb4-16"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(deter.groupby(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ano_prodes"</span>).size())</span></code></pre></div></div>
</div>
<div id="tabset-1-5" class="tab-pane" aria-labelledby="tabset-1-5-tab">
<p>No <strong>Power Query</strong> (Página Inicial → Transformar dados), em <strong>Adicionar Coluna → Coluna Personalizada</strong>:</p>
<pre><code>// ano_prodes
Date.Year([view_date]) + (if Date.Month([view_date]) &gt;= 8 then 1 else 0)

// mes_prodes
Number.Mod(Date.Month([view_date]) + 4, 12) + 1

// mes_nome (lista fixa, não depende do idioma)
{"Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho",
 "Agosto","Setembro","Outubro","Novembro","Dezembro"}{Date.Month([view_date]) - 1}</code></pre>
<p>Ou em <strong>DAX</strong>, como coluna calculada da tabela de calendário:</p>
<pre><code>Ano PRODES = YEAR ( dim_calendario[data] ) + IF ( MONTH ( dim_calendario[data] ) &gt;= 8, 1, 0 )
Mês PRODES = MOD ( MONTH ( dim_calendario[data] ) + 4, 12 ) + 1</code></pre>
<p>Para ordenar os meses na ordem do ano PRODES nos gráficos, selecione a coluna <code>mes_nome</code> e use <strong>Classificar por coluna → mes_prodes</strong>.</p>
</div>
</div>
</div>
</section>
<section id="conferindo-o-resultado" class="level2">
<h2 class="anchored" data-anchor-id="conferindo-o-resultado">Conferindo o resultado</h2>
<p>As versões do QGIS, do PostGIS e do Python deram a mesma contagem de alertas por ano PRODES:</p>
<table class="table-striped caption-top table">
<caption>Alertas do DETER por ano PRODES, todas as classes.</caption>
<thead>
<tr class="header">
<th>Ano PRODES</th>
<th>Período</th>
<th style="text-align: right;">Alertas DETER no recorte</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>2024</td>
<td>jan. a jul. 2024 (o download começa em 2024)</td>
<td style="text-align: right;">639</td>
</tr>
<tr class="even">
<td>2025</td>
<td>ago. 2024 a jul. 2025</td>
<td style="text-align: right;">5.787</td>
</tr>
<tr class="odd">
<td>2026</td>
<td>ago. 2025 a jul. 2026</td>
<td style="text-align: right;">595</td>
</tr>
<tr class="even">
<td>2027</td>
<td>ago. a out. 2026 (em andamento)</td>
<td style="text-align: right;">802</td>
</tr>
</tbody>
</table>
<p>O pico de 2025 são <strong>5.127 cicatrizes de queimada</strong> da seca de 2024. Separando por classe, os alertas de desmatamento por corte raso (<code>DESMATAMENTO_CR</code>) foram 431 em 2025 e 300 em 2026. Por isso os painéis quase sempre separam <strong>desmatamento</strong> de <strong>queimada</strong>.</p>
</section>
<section id="primeiro-e-último-dia-do-período" class="level2">
<h2 class="anchored" data-anchor-id="primeiro-e-último-dia-do-período">Primeiro e último dia do período</h2>
<p>Duas perguntas que também aparecem muito: “qual o primeiro e o último alerta da camada?” (para o título do relatório) e “qual o último dia do mês?” (para saber se o mês já fechou).</p>
<table class="caption-top table">
<colgroup>
<col style="width: 33%">
<col style="width: 33%">
<col style="width: 33%">
</colgroup>
<thead>
<tr class="header">
<th></th>
<th>Primeira e última data</th>
<th>Último dia do mês</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>ArcGIS Pro</td>
<td><code>min()</code>/<code>max()</code> sobre <code>arcpy.da.SearchCursor(fc, ["view_date"])</code></td>
<td><code>calendar.monthrange(ano, mes)[1]</code></td>
</tr>
<tr class="even">
<td>QGIS</td>
<td><code>minimum("view_date")</code>, <code>maximum("view_date")</code></td>
<td><code>make_date(year(d), month(d), 1) + '1 month' - '1 day'</code></td>
</tr>
<tr class="odd">
<td>PostGIS</td>
<td><code>min(view_date)</code>, <code>max(view_date)</code></td>
<td><code>(date_trunc('month', d) + interval '1 month - 1 day')::date</code></td>
</tr>
<tr class="even">
<td>Python</td>
<td><code>deter["view_date"].min()</code></td>
<td><code>data + pd.offsets.MonthEnd(0)</code></td>
</tr>
<tr class="odd">
<td>Power BI (DAX)</td>
<td><code>MIN()</code>, <code>MAX()</code></td>
<td><code>EOMONTH ( data, 0 )</code></td>
</tr>
</tbody>
</table>
</section>
<section id="veja-também" class="level2">
<h2 class="anchored" data-anchor-id="veja-também">Veja também</h2>
<ul>
<li><a href="../artigos/06-tabela-mensal-acumulada.html">Tabela mensal acumulada</a>, que usa esses campos</li>
<li><a href="../guia-espacial/curso/07-power-bi.html">Módulo 7 do curso: Power BI</a>, com a tabela de calendário</li>
</ul>
<div class="navegacao-livro">
<p><a href="../artigos/04-focos-calor.html" class="anterior"><span class="direcao">← Anterior</span> Focos de calor das últimas 24 e 48 horas nas UCs</a> <a href="../artigos/06-tabela-mensal-acumulada.html" class="proximo"><span class="direcao">Próximo →</span> Tabela mensal acumulada do DETER, com os meses zerados</a></p>
</div>
</section>
<section id="atualizações" class="level2 unnumbered">
<h2 class="unnumbered anchored" data-anchor-id="atualizações">Atualizações</h2>
<ul>
<li><strong>29/10/2026:</strong> publicação, com dados do INPE, do MMA, do IBAMA e do SICAR de outubro de 2026.</li>
</ul>
<p><a href="https://hendesson.github.io/en/articles/05-date-fields.html">English version</a></p>


</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> De volta ao topo</a><div id="quarto-appendix" class="default"><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Licença</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/deed.pt_br">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Como citar</h2><div><div class="quarto-appendix-secondary-label">BibTeX</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@misc{alves2026,
  author = {Alves, Hendesson},
  publisher = {Hendesson Alves},
  title = {Ano, mês e ano PRODES: campos de data em cada programa},
  date = {2026-10-29},
  url = {https://hendesson.github.io/artigos/05-campos-de-data.html},
  doi = {10.5281/zenodo.23780254},
  langid = {pt-BR},
  abstract = {Ano, mês, nome do mês, ano PRODES (agosto a julho) e mês
    PRODES em uma linha por programa, sem depender do idioma do
    computador. Inclui Power Query e DAX para quem publica no Power BI.}
}
</code></pre><div class="quarto-appendix-secondary-label">Por favor, cite este trabalho como:</div><div id="ref-alves2026" class="csl-entry quarto-appendix-citeas">
Alves, Hendesson. 2026. <span>“Ano, mês e ano PRODES: campos de data em
cada programa.”</span> In <em>Artigos de geoprocessamento para
monitoramento ambiental</em>. Preprint, Hendesson Alves, October 29. <a href="https://doi.org/10.5281/zenodo.23780254">https://doi.org/10.5281/zenodo.23780254</a>.
</div></div></section></div> ]]></description>
  <category>Datas</category>
  <category>Power BI</category>
  <guid>https://hendesson.github.io/artigos/05-campos-de-data.html</guid>
  <pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate>
  <media:content url="https://hendesson.github.io/imagens/artigos/calendario_prodes.png" medium="image" type="image/png" height="43" width="144"/>
</item>
<item>
  <title>Tabela mensal acumulada do DETER, com os meses zerados</title>
  <dc:creator>Hendesson Alves</dc:creator>
  <link>https://hendesson.github.io/artigos/06-tabela-mensal-acumulada.html</link>
  <description><![CDATA[ 





<div class="ficha">
<p><span class="rotulo">Nível</span> Intermediário <span class="rotulo">Leitura</span> 9 min <span class="rotulo">Dados</span> outubro de 2026 <span class="rotulo">Programas</span> <span class="selo-texto">ArcGIS</span> <img src="https://hendesson.github.io/imagens/ferramentas/qgis.svg" class="img-fluid" alt="QGIS"> <img src="https://hendesson.github.io/imagens/ferramentas/postgis.svg" class="img-fluid" alt="PostGIS"> <img src="https://hendesson.github.io/imagens/ferramentas/python.svg" class="img-fluid" alt="Python"> <img src="https://hendesson.github.io/imagens/ferramentas/powerbi.svg" class="img-fluid" alt="Power BI"></p>
</div>
<p>O gráfico mais pedido num painel de desmatamento é a <strong>curva acumulada</strong>: quanto já foi desmatado desde o começo do ano PRODES, mês a mês, comparando com os anos anteriores.</p>
<p>Para desenhar essa curva, a tabela precisa de <strong>uma linha para cada UC, ano e mês</strong>, inclusive os meses <strong>sem nenhum alerta</strong> (com zero). Sem eles, a linha do gráfico pula meses e o acumulado fica errado. O script que eu usava fazia isso com <code>itertools.product</code>, <code>merge</code> e <code>cumsum</code> do pandas, depois de várias etapas no <code>arcpy</code>.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://hendesson.github.io/imagens/artigos/acumulado_mensal.png" class="img-fluid figure-img" alt="Gráfico de linhas com três anos PRODES. O eixo horizontal vai de agosto a julho. A linha de 2025 termina em 757 hectares e a de 2026, em 821. A de 2027 só vai até outubro, com 587 hectares, porque os meses seguintes ainda não aconteceram."></p>
<figcaption>Área acumulada de alertas de desmatamento no interior da Floresta Nacional do Jamanxim, por ano PRODES.</figcaption>
</figure>
</div>
<section id="o-que-você-vai-fazer" class="level2">
<h2 class="anchored" data-anchor-id="o-que-você-vai-fazer">O que você vai fazer</h2>
<ol type="1">
<li><strong>Filtrar</strong> os alertas de desmatamento (corte raso, com vegetação e mineração), no interior, com pelo menos 6,25 ha.</li>
<li>Calcular <strong>ano PRODES</strong> e <strong>mês PRODES</strong> (veja <a href="../artigos/05-campos-de-data.html">Campos de data</a>).</li>
<li>Montar a <strong>grade completa</strong>: todas as UCs × todos os anos × 12 meses.</li>
<li><strong>Somar</strong> a área de cada mês e preencher os vazios com <strong>zero</strong>.</li>
<li><strong>Acumular</strong> dentro de cada UC e ano.</li>
<li>Marcar como <strong>não válidos</strong> os meses depois do último dado (para o gráfico não desenhar uma linha reta até julho).</li>
</ol>
<div class="cell" data-eval="true" data-layout-align="default">
<div class="cell-output-display">
<div>
<p></p><figure class="figure"><p></p>
<div>
<pre class="mermaid mermaid-js">flowchart LR
    A["Alertas&lt;br/&gt;filtrados"] --&gt; B["Soma por&lt;br/&gt;UC, ano, mês"]
    G["Grade:&lt;br/&gt;UC × ano × 12 meses"] --&gt; C["Junção&lt;br/&gt;(vazios = 0)"]
    B --&gt; C
    C --&gt; D["Acumulado&lt;br/&gt;no ano"]
    D --&gt; E["valido = falso&lt;br/&gt;depois do último mês"]
</pre>
</div>
<p></p><figcaption> Da soma por mês à tabela completa</figcaption> </figure><p></p>
</div>
</div>
</div>
</section>
<section id="dados" class="level2">
<h2 class="anchored" data-anchor-id="dados">Dados</h2>
<p>Use a camada <strong><code>deter_interior_entorno</code></strong> criada no artigo <a href="../artigos/02-interior-entorno.html">Interior e entorno das UCs</a> (ela já tem <code>nome_uc</code>, <code>local</code> e <code>area_ha</code>).</p>
</section>
<section id="o-código" class="level2">
<h2 class="anchored" data-anchor-id="o-código">O código</h2>
<div class="tabset-margin-container"></div><div class="panel-tabset" data-group="programa">
<ul class="nav nav-tabs"><li class="nav-item"><a class="nav-link active" id="tabset-1-1-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-1" aria-controls="tabset-1-1" aria-selected="true" href="">ArcGIS Pro</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-2-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-2" aria-controls="tabset-1-2" aria-selected="false" href="">QGIS</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-3-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-3" aria-controls="tabset-1-3" aria-selected="false" href="">PostGIS</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-4-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-4" aria-controls="tabset-1-4" aria-selected="false" href="">Python</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-5-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-5" aria-controls="tabset-1-5" aria-selected="false" href="">Power BI</a></li></ul>
<div class="tab-content" data-group="programa">
<div id="tabset-1-1" class="tab-pane active" aria-labelledby="tabset-1-1-tab">
<p>O <code>arcpy</code> não tem uma ferramenta para “completar a grade”. A saída é a mesma do script original: somar com o <code>arcpy</code> e completar com o pandas, que já vem no Python do ArcGIS Pro.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> arcpy</span>
<span id="cb1-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> numpy <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> np</span>
<span id="cb1-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> pd</span>
<span id="cb1-4"></span>
<span id="cb1-5">gdb <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\r</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">esultados</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">gdb"</span></span>
<span id="cb1-6">fc <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gdb <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">eter_interior_entorno"</span></span>
<span id="cb1-7">filtro <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"classname IN ('DESMATAMENTO_CR', 'DESMATAMENTO_VEG', 'MINERACAO') "</span></span>
<span id="cb1-8">          <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"AND local = 'interior' AND area_ha &gt;= 6.25"</span>)</span>
<span id="cb1-9"></span>
<span id="cb1-10"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1 e 2. Ler a tabela filtrada para o pandas</span></span>
<span id="cb1-11">linhas <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.da.SearchCursor(fc, [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>], filtro)</span>
<span id="cb1-12">d <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.DataFrame(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">list</span>(linhas), columns<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>])</span>
<span id="cb1-13">data <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.to_datetime(d[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>])</span>
<span id="cb1-14">d[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ano_prodes"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> data.dt.year <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> (data.dt.month <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>)</span>
<span id="cb1-15">d[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mes_prodes"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (data.dt.month <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span></span>
<span id="cb1-16"></span>
<span id="cb1-17"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 3 e 4. Grade completa e soma por mês (vazios = 0)</span></span>
<span id="cb1-18">soma <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> d.groupby([<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ano_prodes"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mes_prodes"</span>])[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sum</span>()</span>
<span id="cb1-19">grade <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.MultiIndex.from_product(</span>
<span id="cb1-20">    [<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sorted</span>(d[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>].unique()), <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sorted</span>(d[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ano_prodes"</span>].unique()), <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">13</span>)],</span>
<span id="cb1-21">    names<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>soma.index.names)</span>
<span id="cb1-22">tabela <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> soma.reindex(grade, fill_value<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>).reset_index()</span>
<span id="cb1-23"></span>
<span id="cb1-24"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 5. Acumulado</span></span>
<span id="cb1-25">tabela[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"acumulado_ha"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> tabela.groupby([<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ano_prodes"</span>])[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>].cumsum()</span>
<span id="cb1-26"></span>
<span id="cb1-27"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 6. Meses depois do último dado</span></span>
<span id="cb1-28">ultimo <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">max</span>(r[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>] <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> r <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> arcpy.da.SearchCursor(fc, [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>]))</span>
<span id="cb1-29">ano_u, mes_u <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ultimo.year <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> (ultimo.month <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>), (ultimo.month <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span></span>
<span id="cb1-30">tabela[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"valido"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span>((tabela[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ano_prodes"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> ano_u) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> (tabela[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mes_prodes"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> mes_u))</span>
<span id="cb1-31"></span>
<span id="cb1-32"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Gravar como tabela do geodatabase</span></span>
<span id="cb1-33">arr <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.rec.fromrecords(tabela.astype({<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"U120"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"valido"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"int16"</span>}).values,</span>
<span id="cb1-34">                         names<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">list</span>(tabela.columns))</span>
<span id="cb1-35">arcpy.da.NumPyArrayToTable(arr, gdb <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">eter_mensal_acumulado"</span>)</span></code></pre></div></div>
</div>
<div id="tabset-1-2" class="tab-pane" aria-labelledby="tabset-1-2-tab">
<p>No QGIS, o caminho mais direto é uma <strong>camada virtual</strong>: uma consulta SQL (SQLite) sobre as camadas abertas, sem banco de dados. Abra <strong>Camada → Adicionar camada → Adicionar/Editar camada virtual</strong>, importe a camada <code>deter_interior_entorno</code> e cole a consulta. Ou, no console:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb2-1">consulta <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"""</span></span>
<span id="cb2-2"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">WITH alertas AS (</span></span>
<span id="cb2-3"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">    SELECT nome_uc,</span></span>
<span id="cb2-4"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">           CAST(strftime('%Y', view_date) AS INTEGER)</span></span>
<span id="cb2-5"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">             + (CAST(strftime('%m', view_date) AS INTEGER) &gt;= 8)          AS ano_prodes,</span></span>
<span id="cb2-6"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">           (CAST(strftime('%m', view_date) AS INTEGER) + 4) % 12 + 1      AS mes_prodes,</span></span>
<span id="cb2-7"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">           area_ha</span></span>
<span id="cb2-8"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">    FROM deter</span></span>
<span id="cb2-9"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">    WHERE classname IN ('DESMATAMENTO_CR', 'DESMATAMENTO_VEG', 'MINERACAO')</span></span>
<span id="cb2-10"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">      AND local = 'interior' AND area_ha &gt;= 6.25</span></span>
<span id="cb2-11"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">),</span></span>
<span id="cb2-12"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">meses(mes_prodes) AS (SELECT 1 UNION ALL SELECT mes_prodes + 1 FROM meses WHERE mes_prodes &lt; 12),</span></span>
<span id="cb2-13"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">grade AS (</span></span>
<span id="cb2-14"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">    SELECT u.nome_uc, a.ano_prodes, m.mes_prodes</span></span>
<span id="cb2-15"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">    FROM (SELECT DISTINCT nome_uc FROM alertas) u,</span></span>
<span id="cb2-16"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">         (SELECT DISTINCT ano_prodes FROM alertas) a, meses m</span></span>
<span id="cb2-17"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">),</span></span>
<span id="cb2-18"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">mensal AS (</span></span>
<span id="cb2-19"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">    SELECT g.nome_uc, g.ano_prodes, g.mes_prodes, coalesce(sum(a.area_ha), 0) AS area_ha</span></span>
<span id="cb2-20"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">    FROM grade g</span></span>
<span id="cb2-21"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">    LEFT JOIN alertas a USING (nome_uc, ano_prodes, mes_prodes)</span></span>
<span id="cb2-22"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">    GROUP BY g.nome_uc, g.ano_prodes, g.mes_prodes</span></span>
<span id="cb2-23"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">),</span></span>
<span id="cb2-24"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">ultimo AS (</span></span>
<span id="cb2-25"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">    SELECT CAST(strftime('%Y', max(view_date)) AS INTEGER)</span></span>
<span id="cb2-26"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">             + (CAST(strftime('%m', max(view_date)) AS INTEGER) &gt;= 8)      AS ano,</span></span>
<span id="cb2-27"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">           (CAST(strftime('%m', max(view_date)) AS INTEGER) + 4) % 12 + 1 AS mes</span></span>
<span id="cb2-28"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">    FROM deter</span></span>
<span id="cb2-29"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">)</span></span>
<span id="cb2-30"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">SELECT m.*,</span></span>
<span id="cb2-31"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">       sum(m.area_ha) OVER (PARTITION BY m.nome_uc, m.ano_prodes</span></span>
<span id="cb2-32"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">                            ORDER BY m.mes_prodes) AS acumulado_ha,</span></span>
<span id="cb2-33"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">       NOT (m.ano_prodes = u.ano AND m.mes_prodes &gt; u.mes) AS valido</span></span>
<span id="cb2-34"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">FROM mensal m, ultimo u</span></span>
<span id="cb2-35"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">ORDER BY m.nome_uc, m.ano_prodes, m.mes_prodes</span></span>
<span id="cb2-36"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"""</span></span>
<span id="cb2-37">deter <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> QgsVectorLayer(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"C:/dados/deter_interior_entorno.gpkg"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"deter"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ogr"</span>)</span>
<span id="cb2-38">QgsProject.instance().addMapLayer(deter)</span>
<span id="cb2-39">tabela <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> QgsVectorLayer(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"?query=</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>consulta<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"deter_mensal_acumulado"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"virtual"</span>)</span>
<span id="cb2-40">QgsProject.instance().addMapLayer(tabela)</span>
<span id="cb2-41"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(tabela.featureCount(), <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"linhas"</span>)</span></code></pre></div></div>
<p>A camada virtual é recalculada sempre que a camada de origem muda, e pode ser exportada como CSV ou GeoPackage (<strong>botão direito → Exportar</strong>).</p>
</div>
<div id="tabset-1-3" class="tab-pane" aria-labelledby="tabset-1-3-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode sql code-with-copy"><code class="sourceCode sql"><span id="cb3-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">CREATE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">OR</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">REPLACE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">VIEW</span> artigos.deter_mensal_acumulado <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span></span>
<span id="cb3-2"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WITH</span> alertas <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> (</span>
<span id="cb3-3">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> nome_uc,</span>
<span id="cb3-4">           <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">extract</span>(<span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">year</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> view_date <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">interval</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'5 months'</span>):<span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">:int</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> ano_prodes,</span>
<span id="cb3-5">           (<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">extract</span>(<span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">month</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> view_date):<span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">:int</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>) % <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>      <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> mes_prodes,</span>
<span id="cb3-6">           area_ha</span>
<span id="cb3-7">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.deter_interior_entorno</span>
<span id="cb3-8">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> classname <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">IN</span> (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'DESMATAMENTO_CR'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'DESMATAMENTO_VEG'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'MINERACAO'</span>)</span>
<span id="cb3-9">      <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AND</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">local</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'interior'</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AND</span> area_ha <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">6.25</span></span>
<span id="cb3-10">),</span>
<span id="cb3-11">grade <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> (</span>
<span id="cb3-12">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> u.nome_uc, a.ano_prodes, m.mes_prodes</span>
<span id="cb3-13">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">DISTINCT</span> nome_uc <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> alertas) u</span>
<span id="cb3-14">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">CROSS</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">JOIN</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">DISTINCT</span> ano_prodes <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> alertas) a</span>
<span id="cb3-15">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">CROSS</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">JOIN</span> generate_series(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> m(mes_prodes)</span>
<span id="cb3-16">),</span>
<span id="cb3-17">mensal <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> (</span>
<span id="cb3-18">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> g.nome_uc, g.ano_prodes, g.mes_prodes, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">coalesce</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sum</span>(a.area_ha), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> area_ha</span>
<span id="cb3-19">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> grade g</span>
<span id="cb3-20">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">LEFT</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">JOIN</span> alertas a <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">USING</span> (nome_uc, ano_prodes, mes_prodes)</span>
<span id="cb3-21">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">GROUP</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BY</span> g.nome_uc, g.ano_prodes, g.mes_prodes</span>
<span id="cb3-22">),</span>
<span id="cb3-23">ultimo <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> (</span>
<span id="cb3-24">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">extract</span>(<span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">year</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">max</span>(view_date) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">interval</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'5 months'</span>):<span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">:int</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> ano,</span>
<span id="cb3-25">           (<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">extract</span>(<span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">month</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">max</span>(view_date)):<span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">:int</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>) % <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>      <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> mes</span>
<span id="cb3-26">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.deter_interior_entorno</span>
<span id="cb3-27">)</span>
<span id="cb3-28"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> m.nome_uc, m.ano_prodes, m.mes_prodes, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">round</span>(m.area_ha, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> area_ha,</span>
<span id="cb3-29">       <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">round</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sum</span>(m.area_ha) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">OVER</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">PARTITION</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BY</span> m.nome_uc, m.ano_prodes</span>
<span id="cb3-30">                                  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ORDER</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BY</span> m.mes_prodes), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> acumulado_ha,</span>
<span id="cb3-31">       <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">NOT</span> (m.ano_prodes <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> u.ano <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AND</span> m.mes_prodes <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> u.mes) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> valido</span>
<span id="cb3-32"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> mensal m, ultimo u;</span>
<span id="cb3-33"></span>
<span id="cb3-34"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.deter_mensal_acumulado</span>
<span id="cb3-35"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> nome_uc <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'FLORESTA NACIONAL DO JAMANXIM'</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AND</span> ano_prodes <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2027</span></span>
<span id="cb3-36"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ORDER</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BY</span> mes_prodes;</span></code></pre></div></div>
</div>
<div id="tabset-1-4" class="tab-pane" aria-labelledby="tabset-1-4-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb4-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> geopandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> gpd</span>
<span id="cb4-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> pd</span>
<span id="cb4-3"></span>
<span id="cb4-4">todos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.read_file(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dados/deter_interior_entorno.gpkg"</span>)</span>
<span id="cb4-5">d <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> todos[todos[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"classname"</span>].isin([<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"DESMATAMENTO_CR"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"DESMATAMENTO_VEG"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MINERACAO"</span>])</span>
<span id="cb4-6">          <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> (todos[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"local"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"interior"</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> (todos[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">6.25</span>)].copy()</span>
<span id="cb4-7"></span>
<span id="cb4-8"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2. Ano e mês PRODES</span></span>
<span id="cb4-9">data <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.to_datetime(d[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>])</span>
<span id="cb4-10">d[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ano_prodes"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> data.dt.year <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> (data.dt.month <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>)</span>
<span id="cb4-11">d[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mes_prodes"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (data.dt.month <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span></span>
<span id="cb4-12"></span>
<span id="cb4-13"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 3 e 4. Grade completa e soma por mês (vazios = 0)</span></span>
<span id="cb4-14">soma <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> d.groupby([<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ano_prodes"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mes_prodes"</span>])[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sum</span>()</span>
<span id="cb4-15">grade <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.MultiIndex.from_product(</span>
<span id="cb4-16">    [<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sorted</span>(d[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>].unique()), <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sorted</span>(d[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ano_prodes"</span>].unique()), <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">13</span>)],</span>
<span id="cb4-17">    names<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>soma.index.names)</span>
<span id="cb4-18">tabela <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> soma.reindex(grade, fill_value<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>).reset_index()</span>
<span id="cb4-19"></span>
<span id="cb4-20"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 5. Acumulado no ano PRODES</span></span>
<span id="cb4-21">tabela[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"acumulado_ha"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> tabela.groupby([<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ano_prodes"</span>])[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>].cumsum()</span>
<span id="cb4-22"></span>
<span id="cb4-23"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 6. Meses depois do último dado</span></span>
<span id="cb4-24">ultimo <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.to_datetime(todos[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>]).<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">max</span>()</span>
<span id="cb4-25">ano_u, mes_u <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ultimo.year <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> (ultimo.month <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>), (ultimo.month <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span></span>
<span id="cb4-26">tabela[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"valido"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span>((tabela[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ano_prodes"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> ano_u) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> (tabela[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mes_prodes"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> mes_u))</span>
<span id="cb4-27"></span>
<span id="cb4-28">tabela.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">round</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>).to_csv(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dados/deter_mensal_acumulado.csv"</span>, index<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb4-29"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(tabela.query(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc == 'FLORESTA NACIONAL DO JAMANXIM' and ano_prodes == 2027"</span>).<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">round</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>))</span></code></pre></div></div>
</div>
<div id="tabset-1-5" class="tab-pane" aria-labelledby="tabset-1-5-tab">
<p>No Power BI, a grade completa e o acumulado saem do <strong>modelo</strong>, sem tabela pronta: basta uma tabela de calendário (<code>dim_calendario</code>) ligada aos alertas pela data.</p>
<pre><code>Área (ha) = SUM ( fato_deter[area_ha] ) + 0

Área acumulada no ano PRODES (ha) =
CALCULATE ( [Área (ha)], DATESYTD ( dim_calendario[data], "07-31" ) )

Área acumulada (só meses com dado) =
IF ( MAX ( dim_calendario[data] ) &lt;= MAX ( fato_deter[view_date] ),
     [Área acumulada no ano PRODES (ha)] )</code></pre>
<ul>
<li>O <code>+ 0</code> faz os meses sem alerta aparecerem como zero.</li>
<li>O <code>"07-31"</code> diz ao <code>DATESYTD</code> que o ano termina em <strong>31 de julho</strong>: é o ano PRODES.</li>
<li>A terceira medida devolve vazio depois do último alerta, o equivalente à coluna <code>valido</code>.</li>
</ul>
</div>
</div>
</div>
</section>
<section id="conferindo-o-resultado" class="level2">
<h2 class="anchored" data-anchor-id="conferindo-o-resultado">Conferindo o resultado</h2>
<p>As versões do QGIS (camada virtual), do PostGIS e do Python deram a mesma tabela: 288 linhas, e os mesmos valores. O ano PRODES 2027 na Floresta Nacional do Jamanxim ficou assim:</p>
<table class="table-striped caption-top table">
<caption>Floresta Nacional do Jamanxim, ano PRODES 2027 (agosto de 2026 a julho de 2027).</caption>
<thead>
<tr class="header">
<th style="text-align: right;">Mês PRODES</th>
<th>Mês</th>
<th style="text-align: right;">Área no mês (ha)</th>
<th style="text-align: right;">Acumulado (ha)</th>
<th><code>valido</code></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: right;">1</td>
<td>agosto</td>
<td style="text-align: right;">57,7</td>
<td style="text-align: right;">57,7</td>
<td>sim</td>
</tr>
<tr class="even">
<td style="text-align: right;">2</td>
<td>setembro</td>
<td style="text-align: right;">414,4</td>
<td style="text-align: right;">472,1</td>
<td>sim</td>
</tr>
<tr class="odd">
<td style="text-align: right;">3</td>
<td>outubro</td>
<td style="text-align: right;">115,3</td>
<td style="text-align: right;">587,4</td>
<td>sim</td>
</tr>
<tr class="even">
<td style="text-align: right;">4</td>
<td>novembro</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">587,4</td>
<td>não</td>
</tr>
<tr class="odd">
<td style="text-align: right;">…</td>
<td>…</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">587,4</td>
<td>não</td>
</tr>
<tr class="even">
<td style="text-align: right;">12</td>
<td>julho</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">587,4</td>
<td>não</td>
</tr>
</tbody>
</table>
<p>Em três meses, o acumulado já chegou a 587 ha, contra 757 ha no ano PRODES 2025 inteiro e 821 ha no 2026. O ano PRODES 2024 aparece incompleto na tabela, porque os dados baixados começam em janeiro de 2024.</p>
</section>
<section id="de-onde-veio-o-625-ha" class="level2">
<h2 class="anchored" data-anchor-id="de-onde-veio-o-625-ha">De onde veio o “6,25 ha”</h2>
<p>O filtro de área mínima vem do script original e acompanha a área mínima mapeada pelo PRODES. O DETER tem alertas menores, de até 3 ha. Ao mudar esse corte, a curva muda, então deixe-o escrito no painel.</p>
</section>
<section id="classes-em-colunas" class="level2">
<h2 class="anchored" data-anchor-id="classes-em-colunas">Classes em colunas</h2>
<p>Outro script da pasta transformava as classes do DETER em colunas (<code>DCR_AREA</code>, <code>MIN_AREA</code>, …) e trocava os vazios por zero. É a mesma ideia com outra cara: uma <strong>tabela dinâmica</strong>.</p>
<table class="caption-top table">
<colgroup>
<col style="width: 50%">
<col style="width: 50%">
</colgroup>
<thead>
<tr class="header">
<th>Programa</th>
<th>Como</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>ArcGIS Pro</td>
<td><code>arcpy.management.PivotTable(tabela, ["nome_uc"], "classname", "area_ha", saida)</code></td>
</tr>
<tr class="even">
<td>QGIS</td>
<td>camada virtual com <code>sum(CASE WHEN classname = 'MINERACAO' THEN area_ha ELSE 0 END) AS min_area</code></td>
</tr>
<tr class="odd">
<td>PostGIS</td>
<td><code>sum(area_ha) FILTER (WHERE classname = 'MINERACAO') AS min_area</code></td>
</tr>
<tr class="even">
<td>Python</td>
<td><code>d.pivot_table(index="nome_uc", columns="classname", values="area_ha", aggfunc="sum", fill_value=0)</code></td>
</tr>
<tr class="odd">
<td>Power BI</td>
<td>matriz com <code>classname</code> nas colunas; não precisa pivotar</td>
</tr>
</tbody>
</table>
</section>
<section id="veja-também" class="level2">
<h2 class="anchored" data-anchor-id="veja-também">Veja também</h2>
<ul>
<li><a href="../artigos/05-campos-de-data.html">Campos de data</a></li>
<li><a href="../guia-espacial/curso/07-power-bi.html">Módulo 7 do curso: Power BI</a></li>
</ul>
<div class="navegacao-livro">
<p><a href="../artigos/05-campos-de-data.html" class="anterior"><span class="direcao">← Anterior</span> Ano, mês e ano PRODES: campos de data em cada programa</a> <a href="../artigos/07-juntar-atributos.html" class="proximo"><span class="direcao">Próximo →</span> Trazer informações de outra tabela: junções e listas de valores</a></p>
</div>
</section>
<section id="atualizações" class="level2 unnumbered">
<h2 class="unnumbered anchored" data-anchor-id="atualizações">Atualizações</h2>
<ul>
<li><strong>29/10/2026:</strong> publicação, com dados do INPE, do MMA, do IBAMA e do SICAR de outubro de 2026.</li>
</ul>
<p><a href="https://hendesson.github.io/en/articles/06-monthly-cumulative-table.html">English version</a></p>


</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> De volta ao topo</a><div id="quarto-appendix" class="default"><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Licença</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/deed.pt_br">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Como citar</h2><div><div class="quarto-appendix-secondary-label">BibTeX</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@misc{alves2026,
  author = {Alves, Hendesson},
  publisher = {Hendesson Alves},
  title = {Tabela mensal acumulada do DETER, com os meses zerados},
  date = {2026-10-29},
  url = {https://hendesson.github.io/artigos/06-tabela-mensal-acumulada.html},
  doi = {10.5281/zenodo.23780256},
  langid = {pt-BR},
  abstract = {A tabela por trás do gráfico de curva acumulada de um
    painel de desmatamento: uma linha para cada UC, ano e mês, com zero
    nos meses sem alerta, acumulado no ano PRODES e marca dos meses que
    ainda não aconteceram. Também em DAX, com DATESYTD.}
}
</code></pre><div class="quarto-appendix-secondary-label">Por favor, cite este trabalho como:</div><div id="ref-alves2026" class="csl-entry quarto-appendix-citeas">
Alves, Hendesson. 2026. <span>“Tabela mensal acumulada do DETER, com os
meses zerados.”</span> In <em>Artigos de geoprocessamento para
monitoramento ambiental</em>. Preprint, Hendesson Alves, October 29. <a href="https://doi.org/10.5281/zenodo.23780256">https://doi.org/10.5281/zenodo.23780256</a>.
</div></div></section></div> ]]></description>
  <category>DETER</category>
  <category>Painéis</category>
  <category>Power BI</category>
  <guid>https://hendesson.github.io/artigos/06-tabela-mensal-acumulada.html</guid>
  <pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate>
  <media:content url="https://hendesson.github.io/imagens/artigos/acumulado_mensal.png" medium="image" type="image/png" height="75" width="144"/>
</item>
<item>
  <title>Trazer informações de outra tabela: junções e listas de valores</title>
  <dc:creator>Hendesson Alves</dc:creator>
  <link>https://hendesson.github.io/artigos/07-juntar-atributos.html</link>
  <description><![CDATA[ 





<div class="ficha">
<p><span class="rotulo">Nível</span> Iniciante <span class="rotulo">Leitura</span> 6 min <span class="rotulo">Dados</span> outubro de 2026 <span class="rotulo">Programas</span> <span class="selo-texto">ArcGIS</span> <img src="https://hendesson.github.io/imagens/ferramentas/qgis.svg" class="img-fluid" alt="QGIS"> <img src="https://hendesson.github.io/imagens/ferramentas/postgis.svg" class="img-fluid" alt="PostGIS"> <img src="https://hendesson.github.io/imagens/ferramentas/python.svg" class="img-fluid" alt="Python"></p>
</div>
<p>Duas tarefas aparecem em quase todo script de monitoramento:</p>
<ol type="1">
<li><strong>Junção por campo:</strong> a camada de alertas tem o código da UC (<code>cnuc</code>), e você quer trazer a categoria, o grupo e a esfera, que estão na camada de UCs.</li>
<li><strong>Lista de valores:</strong> uma linha por UC com <strong>todos</strong> os municípios onde houve alerta, separados por vírgula. No meu script, era a lista de e-mails dos responsáveis por cada alerta.</li>
</ol>
<p>Nos scripts antigos, a junção era feita com um dicionário e dois cursores, <strong>repetidos para cada campo</strong>, e a lista de valores com uma função de 80 linhas. Em cada programa, as duas tarefas cabem em poucas linhas.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://hendesson.github.io/imagens/artigos/juncao.png" class="img-fluid figure-img" alt="Duas tabelas. À esquerda, alertas com as colunas gid, cnuc e area_ha. À direita, UCs com cnuc, categoria e grupo. Setas ligam os cnuc iguais, e o resultado embaixo tem as colunas das duas tabelas."></p>
<figcaption>A junção usa o campo em comum (cnuc) para copiar colunas de uma tabela para a outra.</figcaption>
</figure>
</div>
<section id="dados" class="level2">
<h2 class="anchored" data-anchor-id="dados">Dados</h2>
<p>Camada <code>deter_interior_entorno</code> (do artigo <a href="../artigos/02-interior-entorno.html">Interior e entorno</a>) e camada <code>ucs</code> do GeoPackage dos artigos. Os municípios vêm do campo <code>municipality</code> do DETER.</p>
</section>
<section id="o-código" class="level2">
<h2 class="anchored" data-anchor-id="o-código">O código</h2>
<div class="tabset-margin-container"></div><div class="panel-tabset" data-group="programa">
<ul class="nav nav-tabs"><li class="nav-item"><a class="nav-link active" id="tabset-1-1-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-1" aria-controls="tabset-1-1" aria-selected="true" href="">ArcGIS Pro</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-2-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-2" aria-controls="tabset-1-2" aria-selected="false" href="">QGIS</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-3-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-3" aria-controls="tabset-1-3" aria-selected="false" href="">PostGIS</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-4-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-4" aria-controls="tabset-1-4" aria-selected="false" href="">Python</a></li></ul>
<div class="tab-content" data-group="programa">
<div id="tabset-1-1" class="tab-pane active" aria-labelledby="tabset-1-1-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> arcpy</span>
<span id="cb1-2"></span>
<span id="cb1-3">gpkg <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\a</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">rtigos</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">gpkg"</span></span>
<span id="cb1-4">gdb <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\r</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">esultados</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">gdb"</span></span>
<span id="cb1-5">alertas <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gdb <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">eter_interior_entorno"</span></span>
<span id="cb1-6"></span>
<span id="cb1-7"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1. Junção por campo: uma linha resolve</span></span>
<span id="cb1-8">arcpy.management.JoinField(alertas, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cnuc"</span>, gpkg <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\m</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ain</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ucs"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cnuc"</span>,</span>
<span id="cb1-9">                           [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"categoria"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"grupo"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"esfera"</span>])</span>
<span id="cb1-10"></span>
<span id="cb1-11"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2. Lista de municípios por UC: estatística CONCATENATE (ArcGIS Pro 3.2 ou mais novo)</span></span>
<span id="cb1-12">arcpy.analysis.Statistics(alertas, gdb <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\m</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">unicipios_por_uc"</span>,</span>
<span id="cb1-13">                          [[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"municipality"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"UNIQUE"</span>], [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"municipality"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"CONCATENATE"</span>]],</span>
<span id="cb1-14">                          [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>], concatenation_separator<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">", "</span>)</span></code></pre></div></div>
<p>Se o <code>JoinField</code> ficar lento em tabelas grandes, o padrão dos scripts antigos (dicionário + cursor) é mais rápido, mas escreva <strong>um dicionário para todos os campos</strong>, não um por campo:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb2-1">campos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"categoria"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"grupo"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"esfera"</span>]</span>
<span id="cb2-2">ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> {linha[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]: linha[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>:] <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> linha <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span></span>
<span id="cb2-3">       arcpy.da.SearchCursor(gpkg <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\m</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ain</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ucs"</span>, [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cnuc"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> campos)}</span>
<span id="cb2-4"></span>
<span id="cb2-5"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> c <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> campos:</span>
<span id="cb2-6">    arcpy.management.AddField(alertas, c, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"TEXT"</span>)</span>
<span id="cb2-7"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">with</span> arcpy.da.UpdateCursor(alertas, [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cnuc"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> campos) <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> cursor:</span>
<span id="cb2-8">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> linha <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> cursor:</span>
<span id="cb2-9">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> linha[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>] <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> ucs:</span>
<span id="cb2-10">            cursor.updateRow([linha[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>], <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>ucs[linha[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]]])</span></code></pre></div></div>
<p>Nas versões antigas do Pro (sem <code>CONCATENATE</code>), monte a lista com um dicionário de conjuntos:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb3-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> collections <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> defaultdict</span>
<span id="cb3-2">lista <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> defaultdict(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">set</span>)</span>
<span id="cb3-3"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> uc, mun <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> arcpy.da.SearchCursor(alertas, [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"municipality"</span>]):</span>
<span id="cb3-4">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> mun:</span>
<span id="cb3-5">        lista[uc].add(mun)</span>
<span id="cb3-6">municipios <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> {uc: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">", "</span>.join(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sorted</span>(m)) <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> uc, m <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> lista.items()}</span></code></pre></div></div>
</div>
<div id="tabset-1-2" class="tab-pane" aria-labelledby="tabset-1-2-tab">
<p><strong>Pelos menus:</strong> propriedades da camada de alertas → <strong>Uniões</strong> → <code>+</code>, camada <code>ucs</code>, campo <code>cnuc</code> nos dois lados. Para gravar a união de vez, use <strong>Unir atributos pelo valor do campo</strong> na Caixa de Ferramentas. Para a lista, <strong>Agregar</strong> com a função <code>concatenate_unique</code>.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb4-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> processing</span>
<span id="cb4-2">G <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"C:/dados/artigos.gpkg"</span></span>
<span id="cb4-3"></span>
<span id="cb4-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1. Junção por campo</span></span>
<span id="cb4-5">alertas <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> processing.run(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:joinattributestable"</span>, {</span>
<span id="cb4-6">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"INPUT"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"C:/dados/deter_interior_entorno.gpkg"</span>,</span>
<span id="cb4-7">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"FIELD"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cnuc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"INPUT_2"</span>: <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>G<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">|layername=ucs"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"FIELD_2"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cnuc"</span>,</span>
<span id="cb4-8">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"FIELDS_TO_COPY"</span>: [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"categoria"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"grupo"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"esfera"</span>], <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"METHOD"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,   <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1 = só a primeira</span></span>
<span id="cb4-9">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"OUTPUT"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"memory:"</span>})[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"OUTPUT"</span>]</span>
<span id="cb4-10"></span>
<span id="cb4-11"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2. Uma linha por UC, com a lista de municípios e o total de área</span></span>
<span id="cb4-12">municipios <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> processing.run(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:aggregate"</span>, {</span>
<span id="cb4-13">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"INPUT"</span>: alertas, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"GROUP_BY"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>,</span>
<span id="cb4-14">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"AGGREGATES"</span>: [</span>
<span id="cb4-15">        {<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"aggregate"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"first_value"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"input"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'"nome_uc"'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"name"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>,</span>
<span id="cb4-16">         <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"type"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"length"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">120</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"precision"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"delimiter"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">""</span>},</span>
<span id="cb4-17">        {<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"aggregate"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"first_value"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"input"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'"categoria"'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"name"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"categoria"</span>,</span>
<span id="cb4-18">         <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"type"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"length"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">80</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"precision"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"delimiter"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">""</span>},</span>
<span id="cb4-19">        {<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"aggregate"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"concatenate_unique"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"input"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'"municipality"'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"name"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"municipios"</span>,</span>
<span id="cb4-20">         <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"type"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"length"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">500</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"precision"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"delimiter"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">", "</span>},</span>
<span id="cb4-21">        {<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"aggregate"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"sum"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"input"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'"area_ha"'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"name"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>,</span>
<span id="cb4-22">         <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"type"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"length"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"precision"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"delimiter"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">""</span>},</span>
<span id="cb4-23">    ],</span>
<span id="cb4-24">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"OUTPUT"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"memory:"</span>})[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"OUTPUT"</span>]</span>
<span id="cb4-25"></span>
<span id="cb4-26"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> f <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> municipios.getFeatures():</span>
<span id="cb4-27">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>], <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"|"</span>, f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"categoria"</span>], <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"|"</span>, f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"municipios"</span>], <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"|"</span>, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">round</span>(f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>]))</span></code></pre></div></div>
<p>Na Calculadora de campo <strong>da camada de UCs</strong>, a mesma lista sai com uma expressão (as UCs sem alerta ficam vazias): <code>aggregate('deter_interior_entorno', 'concatenate_unique', "municipality", filter:="nome_uc" = attribute(@parent, 'nome_uc'), concatenator:=', ')</code>.</p>
</div>
<div id="tabset-1-3" class="tab-pane" aria-labelledby="tabset-1-3-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode sql code-with-copy"><code class="sourceCode sql"><span id="cb5-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-- 1. Junção por campo</span></span>
<span id="cb5-2"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> a.gid, a.nome_uc, a.<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">local</span>, a.area_ha, u.categoria, u.grupo, u.esfera</span>
<span id="cb5-3"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.deter_interior_entorno a</span>
<span id="cb5-4"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">JOIN</span> artigos.ucs u <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">USING</span> (cnuc)</span>
<span id="cb5-5"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">LIMIT</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>;</span>
<span id="cb5-6"></span>
<span id="cb5-7"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-- 2. Uma linha por UC, com a lista de municípios</span></span>
<span id="cb5-8"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> a.nome_uc, u.categoria,</span>
<span id="cb5-9">       string_agg(<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">DISTINCT</span> a.municipality, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">', '</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ORDER</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BY</span> a.municipality) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> municipios,</span>
<span id="cb5-10">       <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">round</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sum</span>(a.area_ha)) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> area_ha</span>
<span id="cb5-11"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.deter_interior_entorno a</span>
<span id="cb5-12"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">JOIN</span> artigos.ucs u <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">USING</span> (cnuc)</span>
<span id="cb5-13"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">GROUP</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BY</span> a.nome_uc, u.categoria</span>
<span id="cb5-14"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ORDER</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BY</span> area_ha <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">DESC</span>;</span></code></pre></div></div>
</div>
<div id="tabset-1-4" class="tab-pane" aria-labelledby="tabset-1-4-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb6-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> geopandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> gpd</span>
<span id="cb6-2"></span>
<span id="cb6-3">alertas <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.read_file(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dados/deter_interior_entorno.gpkg"</span>)</span>
<span id="cb6-4">ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.read_file(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dados/artigos.gpkg"</span>, layer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ucs"</span>)</span>
<span id="cb6-5"></span>
<span id="cb6-6"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1. Junção por campo (validate confere que cada cnuc aparece uma vez só nas UCs)</span></span>
<span id="cb6-7">alertas <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> alertas.merge(ucs[[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cnuc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"categoria"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"grupo"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"esfera"</span>]],</span>
<span id="cb6-8">                        on<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cnuc"</span>, how<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"left"</span>, validate<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"many_to_one"</span>)</span>
<span id="cb6-9"></span>
<span id="cb6-10"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2. Uma linha por UC, com a lista de municípios</span></span>
<span id="cb6-11">lista <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> s: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">", "</span>.join(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sorted</span>(s.dropna().unique()))</span>
<span id="cb6-12">municipios <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (alertas.groupby(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>)</span>
<span id="cb6-13">              .agg(categoria<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"categoria"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"first"</span>), municipios<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"municipality"</span>, lista),</span>
<span id="cb6-14">                   area_ha<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"sum"</span>))</span>
<span id="cb6-15">              .<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">round</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>).sort_values(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>, ascending<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>))</span>
<span id="cb6-16"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(municipios.to_string())</span></code></pre></div></div>
</div>
</div>
</div>
</section>
<section id="conferindo-o-resultado" class="level2">
<h2 class="anchored" data-anchor-id="conferindo-o-resultado">Conferindo o resultado</h2>
<p>As três versões testadas deram as mesmas listas e a mesma área (o PostGIS difere em menos de 0,1%, pela forma de medir, como no artigo 2):</p>
<table class="table-striped caption-top table">
<caption>Interior e entorno somados, todas as classes do DETER.</caption>
<colgroup>
<col style="width: 23%">
<col style="width: 23%">
<col style="width: 23%">
<col style="width: 30%">
</colgroup>
<thead>
<tr class="header">
<th>UC</th>
<th>Categoria</th>
<th>Municípios com alertas</th>
<th style="text-align: right;">Área de alertas (ha)</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Floresta Nacional do Jamanxim</td>
<td>Floresta</td>
<td>Itaituba, Novo Progresso</td>
<td style="text-align: right;">167.584</td>
</tr>
<tr class="even">
<td>Floresta Nacional de Altamira</td>
<td>Floresta</td>
<td>Altamira, Itaituba</td>
<td style="text-align: right;">66.310</td>
</tr>
<tr class="odd">
<td>Parque Nacional do Jamanxim</td>
<td>Parque</td>
<td>Itaituba, Trairao</td>
<td style="text-align: right;">33.286</td>
</tr>
<tr class="even">
<td>Área de Proteção Ambiental do Tapajós</td>
<td>Área de Proteção Ambiental</td>
<td>Itaituba, Novo Progresso</td>
<td style="text-align: right;">22.855</td>
</tr>
<tr class="odd">
<td>Parque Nacional do Rio Novo</td>
<td>Parque</td>
<td>Itaituba, Novo Progresso</td>
<td style="text-align: right;">10.924</td>
</tr>
<tr class="even">
<td>Floresta Estadual de Iriri</td>
<td>Floresta</td>
<td>Altamira</td>
<td style="text-align: right;">467</td>
</tr>
</tbody>
</table>
<p>Repare em “Trairao”, sem til: é assim que o nome vem no DETER. Mais um motivo para juntar tabelas por <strong>código</strong>, e não por nome. O <code>concatenate_unique</code> do QGIS lista os nomes na ordem em que aparecem; para ordem alfabética, use na Calculadora de campo <code>array_to_string(array_sort(array_distinct(array_agg("municipality", group_by:="nome_uc"))), ', ')</code>.</p>
</section>
<section id="armadilhas" class="level2">
<h2 class="anchored" data-anchor-id="armadilhas">Armadilhas</h2>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Aviso</span>Chave repetida multiplica linhas
</div>
</div>
<div class="callout-body-container callout-body">
<p>Se o <code>cnuc</code> aparecer duas vezes na camada de UCs (por exemplo, uma UC partida em dois polígonos), cada alerta é copiado duas vezes e a área dobra. O <code>validate="many_to_one"</code> do pandas acusa o erro; no PostGIS, confira com <code>SELECT cnuc, count(*) FROM artigos.ucs GROUP BY cnuc HAVING count(*) &gt; 1</code>; no QGIS, use <code>METHOD = 1</code> (só a primeira correspondência).</p>
</div>
</div>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Aviso</span>Juntar pelo nome em vez do código
</div>
</div>
<div class="callout-body-container callout-body">
<p>Os scripts antigos às vezes ligavam as tabelas pelo <strong>nome da UC</strong>. Um acento ou uma letra maiúscula diferente (<code>Floresta Nacional</code> × <code>FLORESTA NACIONAL</code>) e a junção falha sem avisar. Use sempre um código (<code>cnuc</code>, código do IBGE, número do embargo).</p>
</div>
</div>
<div class="callout callout-style-default callout-tip callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Dica</span>Excluir linhas repetidas
</div>
</div>
<div class="callout-body-container callout-body">
<p>Para manter <strong>uma linha por alerta</strong> depois de concatenar (o <code>DeleteIdentical</code> do ArcGIS), use <code>native:removeduplicatesbyattribute</code> no QGIS, <code>DISTINCT ON (gid)</code> no PostGIS e <code>drop_duplicates("gid")</code> no pandas.</p>
</div>
</div>
</section>
<section id="veja-também" class="level2">
<h2 class="anchored" data-anchor-id="veja-também">Veja também</h2>
<ul>
<li><a href="../artigos/01-equivalencias.html">Do ArcMap ao QGIS: a tabela de equivalências</a></li>
<li><a href="../guia-espacial/curso/02-joins-e-agregacoes.html">Módulo 2 do curso: JOINs e agregações</a></li>
</ul>
<div class="navegacao-livro">
<p><a href="../artigos/06-tabela-mensal-acumulada.html" class="anterior"><span class="direcao">← Anterior</span> Tabela mensal acumulada do DETER, com os meses zerados</a> <a href="../artigos/08-car-ucs.html" class="proximo"><span class="direcao">Próximo →</span> Imóveis do CAR dentro das UCs: selecionar e medir a sobreposição</a></p>
</div>
</section>
<section id="atualizações" class="level2 unnumbered">
<h2 class="unnumbered anchored" data-anchor-id="atualizações">Atualizações</h2>
<ul>
<li><strong>29/10/2026:</strong> publicação, com dados do INPE, do MMA, do IBAMA e do SICAR de outubro de 2026.</li>
</ul>
<p><a href="https://hendesson.github.io/en/articles/07-joining-attributes.html">English version</a></p>


</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> De volta ao topo</a><div id="quarto-appendix" class="default"><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Licença</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/deed.pt_br">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Como citar</h2><div><div class="quarto-appendix-secondary-label">BibTeX</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@misc{alves2026,
  author = {Alves, Hendesson},
  publisher = {Hendesson Alves},
  title = {Trazer informações de outra tabela: junções e listas de
    valores},
  date = {2026-10-29},
  url = {https://hendesson.github.io/artigos/07-juntar-atributos.html},
  doi = {10.5281/zenodo.23780258},
  langid = {pt-BR},
  abstract = {Levar a categoria e o grupo da UC para cada alerta pelo
    código CNUC e juntar vários valores numa lista, como os municípios
    de cada UC. Os scripts antigos usavam dezenas de linhas de cursores;
    aqui são poucas linhas em cada programa.}
}
</code></pre><div class="quarto-appendix-secondary-label">Por favor, cite este trabalho como:</div><div id="ref-alves2026" class="csl-entry quarto-appendix-citeas">
Alves, Hendesson. 2026. <span>“Trazer informações de outra tabela:
junções e listas de valores.”</span> In <em>Artigos de geoprocessamento
para monitoramento ambiental</em>. Preprint, Hendesson Alves, October
29. <a href="https://doi.org/10.5281/zenodo.23780258">https://doi.org/10.5281/zenodo.23780258</a>.
</div></div></section></div> ]]></description>
  <category>Tabelas</category>
  <guid>https://hendesson.github.io/artigos/07-juntar-atributos.html</guid>
  <pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate>
  <media:content url="https://hendesson.github.io/imagens/artigos/juncao.png" medium="image" type="image/png" height="66" width="144"/>
</item>
<item>
  <title>Imóveis do CAR dentro das UCs: selecionar e medir a sobreposição</title>
  <dc:creator>Hendesson Alves</dc:creator>
  <link>https://hendesson.github.io/artigos/08-car-ucs.html</link>
  <description><![CDATA[ 





<div class="ficha">
<p><span class="rotulo">Nível</span> Intermediário <span class="rotulo">Leitura</span> 8 min <span class="rotulo">Dados</span> outubro de 2026 <span class="rotulo">Programas</span> <span class="selo-texto">ArcGIS</span> <img src="https://hendesson.github.io/imagens/ferramentas/qgis.svg" class="img-fluid" alt="QGIS"> <img src="https://hendesson.github.io/imagens/ferramentas/postgis.svg" class="img-fluid" alt="PostGIS"> <img src="https://hendesson.github.io/imagens/ferramentas/python.svg" class="img-fluid" alt="Python"></p>
</div>
<p>O <strong>Cadastro Ambiental Rural (CAR)</strong> é autodeclarado: o próprio dono desenha o imóvel. Por isso aparecem imóveis <strong>dentro</strong> de Unidades de Conservação, inclusive de Proteção Integral, onde não poderia haver propriedade privada. Saber onde isso acontece ajuda a priorizar a regularização fundiária e a fiscalização.</p>
<p>O script que eu usava só <strong>selecionava</strong> os imóveis que tocavam as UCs. Aqui você também vai medir <strong>quanto</strong> de cada imóvel e de cada UC está sobreposto, o que separa o imóvel que só encosta no limite do que está inteiro lá dentro.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://hendesson.github.io/imagens/artigos/car_ucs.png" class="img-fluid figure-img" alt="Mapa da região de Novo Progresso. As UCs aparecem com contorno verde e os imóveis do CAR como polígonos coloridos: ativos em azul, pendentes em laranja, suspensos em roxo e cancelados em cinza. Há muitos imóveis dentro da Floresta Nacional do Jamanxim e da APA do Tapajós."></p>
<figcaption>Imóveis do CAR que se sobrepõem às UCs do recorte, coloridos pela situação do cadastro.</figcaption>
</figure>
</div>
<section id="de-onde-vem-o-car" class="level2">
<h2 class="anchored" data-anchor-id="de-onde-vem-o-car">De onde vem o CAR</h2>
<p>O SICAR publica os imóveis de cada estado num serviço <strong>WFS</strong> aberto:</p>
<ul>
<li>Endereço: <code>https://geoserver.car.gov.br/geoserver/sicar/wfs</code></li>
<li>Camadas: <code>sicar:sicar_imoveis_pa</code>, <code>sicar:sicar_imoveis_mt</code> etc. (uma por UF)</li>
</ul>
<p>Os campos mais úteis são <code>cod_imovel</code>, <code>status_imovel</code> (<code>AT</code> ativo, <code>PE</code> pendente, <code>SU</code> suspenso, <code>CA</code> cancelado), <code>tipo_imovel</code> (<code>IRU</code> imóvel rural, <code>AST</code> assentamento, <code>PCT</code> povos e comunidades tradicionais), <code>condicao</code> e <code>area</code> (área declarada, em hectares). O script dos artigos baixa os imóveis do recorte para a camada <code>car</code> (<a href="../artigos/sobre.html#dados">como baixar</a>).</p>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
Nota
</div>
</div>
<div class="callout-body-container callout-body">
<p>O <strong>SIGEF</strong> (imóveis certificados pelo INCRA) tem a mesma estrutura de uso: troque a camada <code>car</code> pela do SIGEF e o código abaixo funciona igual. Os arquivos ficam no Acervo Fundiário do INCRA (<code>https://acervofundiario.incra.gov.br</code>).</p>
</div>
</div>
</section>
<section id="o-que-você-vai-fazer" class="level2">
<h2 class="anchored" data-anchor-id="o-que-você-vai-fazer">O que você vai fazer</h2>
<ol type="1">
<li><strong>Selecionar</strong> os imóveis que tocam as UCs (o que o script antigo fazia).</li>
<li><strong>Cortar</strong> cada imóvel pelas UCs e medir a área sobreposta.</li>
<li>Calcular a <strong>porcentagem</strong> do imóvel que está dentro da UC e descartar quem só encosta.</li>
<li>Resumir por UC: número de imóveis por situação e <strong>área da UC coberta por CAR</strong>, sem contar duas vezes os imóveis que se sobrepõem entre si.</li>
</ol>
</section>
<section id="o-código" class="level2">
<h2 class="anchored" data-anchor-id="o-código">O código</h2>
<div class="tabset-margin-container"></div><div class="panel-tabset" data-group="programa">
<ul class="nav nav-tabs"><li class="nav-item"><a class="nav-link active" id="tabset-1-1-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-1" aria-controls="tabset-1-1" aria-selected="true" href="">ArcGIS Pro</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-2-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-2" aria-controls="tabset-1-2" aria-selected="false" href="">QGIS</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-3-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-3" aria-controls="tabset-1-3" aria-selected="false" href="">PostGIS</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-4-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-4" aria-controls="tabset-1-4" aria-selected="false" href="">Python</a></li></ul>
<div class="tab-content" data-group="programa">
<div id="tabset-1-1" class="tab-pane active" aria-labelledby="tabset-1-1-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> arcpy</span>
<span id="cb1-2"></span>
<span id="cb1-3">arcpy.env.overwriteOutput <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span></span>
<span id="cb1-4">gpkg <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\a</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">rtigos</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">gpkg"</span></span>
<span id="cb1-5">gdb <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\r</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">esultados</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">gdb"</span></span>
<span id="cb1-6">ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.analysis.Select(gpkg <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\m</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ain</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ucs"</span>, <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"memory</span><span class="er" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ucs"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"regiao = 'Amazonia'"</span>)</span>
<span id="cb1-7"></span>
<span id="cb1-8"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1. Seleção por localização (o que o script antigo fazia)</span></span>
<span id="cb1-9">car <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.management.MakeFeatureLayer(gpkg <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\m</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ain</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">car"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"car"</span>)</span>
<span id="cb1-10">arcpy.management.SelectLayerByLocation(car, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"INTERSECT"</span>, ucs)</span>
<span id="cb1-11">arcpy.management.CopyFeatures(car, gdb <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="er" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">car_toca_ucs"</span>)</span>
<span id="cb1-12"></span>
<span id="cb1-13"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2 e 3. Interseção, área sobreposta e porcentagem do imóvel</span></span>
<span id="cb1-14">arcpy.management.CalculateGeometryAttributes(</span>
<span id="cb1-15">    gdb <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="er" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">car_toca_ucs"</span>, [[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_imovel_ha"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"AREA_GEODESIC"</span>]], area_unit<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"HECTARES"</span>)</span>
<span id="cb1-16">car_ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.analysis.PairwiseIntersect([gdb <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="er" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">car_toca_ucs"</span>, ucs], gdb <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="er" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">car_ucs"</span>)</span>
<span id="cb1-17">arcpy.management.CalculateGeometryAttributes(</span>
<span id="cb1-18">    car_ucs, [[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"sobreposicao_ha"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"AREA_GEODESIC"</span>]], area_unit<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"HECTARES"</span>)</span>
<span id="cb1-19">arcpy.management.CalculateField(car_ucs, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"pct_imovel"</span>,</span>
<span id="cb1-20">                                <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"100 * !sobreposicao_ha! / !area_imovel_ha!"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"PYTHON3"</span>,</span>
<span id="cb1-21">                                field_type<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"DOUBLE"</span>)</span>
<span id="cb1-22"></span>
<span id="cb1-23"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 4. Resumo por UC e situação (só quem tem pelo menos 1% dentro)</span></span>
<span id="cb1-24">dentro <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.analysis.Select(car_ucs, <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"memory</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">entro"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"pct_imovel &gt;= 1"</span>)</span>
<span id="cb1-25">arcpy.analysis.Statistics(dentro, gdb <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="er" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">car_por_uc"</span>,</span>
<span id="cb1-26">                          [[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cod_imovel"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"COUNT"</span>], [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"sobreposicao_ha"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SUM"</span>]],</span>
<span id="cb1-27">                          [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"status_imovel"</span>])</span>
<span id="cb1-28"></span>
<span id="cb1-29"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Área da UC coberta por CAR, sem contar sobreposições entre imóveis</span></span>
<span id="cb1-30">coberta <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.analysis.PairwiseDissolve(dentro, <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"memory</span><span class="er" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">coberta"</span>, [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>])</span>
<span id="cb1-31">arcpy.management.CalculateGeometryAttributes(</span>
<span id="cb1-32">    coberta, [[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"coberta_ha"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"AREA_GEODESIC"</span>]], area_unit<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"HECTARES"</span>)</span></code></pre></div></div>
</div>
<div id="tabset-1-2" class="tab-pane" aria-labelledby="tabset-1-2-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb2-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> processing</span>
<span id="cb2-2">G <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"C:/dados/artigos.gpkg"</span></span>
<span id="cb2-3">AREA <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area(transform($geometry, 'EPSG:4674', 'ESRI:102033')) / 10000"</span></span>
<span id="cb2-4"></span>
<span id="cb2-5"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> rodar(alg, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span>p):</span>
<span id="cb2-6">    p.setdefault(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"OUTPUT"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"memory:"</span>)</span>
<span id="cb2-7">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> processing.run(alg, p)[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"OUTPUT"</span>]</span>
<span id="cb2-8"></span>
<span id="cb2-9">ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:extractbyexpression"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>G<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">|layername=ucs"</span>,</span>
<span id="cb2-10">            EXPRESSION<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"regiao = 'Amazonia'"</span>)</span>
<span id="cb2-11"></span>
<span id="cb2-12"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1. Seleção por localização (predicado 0 = intersecta)</span></span>
<span id="cb2-13">car <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:extractbylocation"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>G<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">|layername=car"</span>, INTERSECT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ucs,</span>
<span id="cb2-14">            PREDICATE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>])</span>
<span id="cb2-15"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"imóveis que tocam as UCs:"</span>, car.featureCount())</span>
<span id="cb2-16"></span>
<span id="cb2-17"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2 e 3. Área do imóvel, interseção, área sobreposta e porcentagem</span></span>
<span id="cb2-18">car <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:fieldcalculator"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>car, FIELD_NAME<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_imovel_ha"</span>,</span>
<span id="cb2-19">            FIELD_TYPE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, FIELD_PRECISION<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>, FORMULA<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>AREA)</span>
<span id="cb2-20">car_ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:intersection"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>car, OVERLAY<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ucs,</span>
<span id="cb2-21">                OVERLAY_FIELDS<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cnuc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"grupo"</span>])</span>
<span id="cb2-22">car_ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:fieldcalculator"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>car_ucs, FIELD_NAME<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"sobreposicao_ha"</span>,</span>
<span id="cb2-23">                FIELD_TYPE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, FIELD_PRECISION<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>, FORMULA<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>AREA)</span>
<span id="cb2-24">car_ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:fieldcalculator"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>car_ucs, FIELD_NAME<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"pct_imovel"</span>,</span>
<span id="cb2-25">                FIELD_TYPE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, FIELD_PRECISION<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>,</span>
<span id="cb2-26">                FORMULA<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'100 * "sobreposicao_ha" / "area_imovel_ha"'</span>)</span>
<span id="cb2-27"></span>
<span id="cb2-28"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 4. Resumo por UC e situação (pelo menos 1% dentro)</span></span>
<span id="cb2-29">dentro <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:extractbyexpression"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>car_ucs, EXPRESSION<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'"pct_imovel" &gt;= 1'</span>)</span>
<span id="cb2-30">resumo <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"qgis:statisticsbycategories"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>dentro, VALUES_FIELD_NAME<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"sobreposicao_ha"</span>,</span>
<span id="cb2-31">               CATEGORIES_FIELD_NAME<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"status_imovel"</span>])</span>
<span id="cb2-32"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> f <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> resumo.getFeatures():</span>
<span id="cb2-33">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>], f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"status_imovel"</span>], f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"count"</span>], <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">round</span>(f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"sum"</span>]))</span>
<span id="cb2-34"></span>
<span id="cb2-35"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Área da UC coberta por CAR, sem contar sobreposições entre imóveis</span></span>
<span id="cb2-36">coberta <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:dissolve"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>dentro, FIELD<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>])</span>
<span id="cb2-37">coberta <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:fieldcalculator"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>coberta, FIELD_NAME<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"coberta_ha"</span>,</span>
<span id="cb2-38">                FIELD_TYPE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, FIELD_PRECISION<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, FORMULA<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>AREA)</span>
<span id="cb2-39"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> f <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> coberta.getFeatures():</span>
<span id="cb2-40">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>], <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"coberta por CAR:"</span>, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">round</span>(f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"coberta_ha"</span>]), <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ha"</span>)</span></code></pre></div></div>
</div>
<div id="tabset-1-3" class="tab-pane" aria-labelledby="tabset-1-3-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode sql code-with-copy"><code class="sourceCode sql"><span id="cb3-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-- 1 a 3. Imóveis que tocam as UCs, área sobreposta e porcentagem do imóvel</span></span>
<span id="cb3-2"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">DROP</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">TABLE</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">IF</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">EXISTS</span> artigos.car_ucs;</span>
<span id="cb3-3"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">CREATE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">TABLE</span> artigos.car_ucs <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span></span>
<span id="cb3-4"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> c.cod_imovel, c.status_imovel, c.tipo_imovel, u.cnuc, u.nome_uc, u.grupo,</span>
<span id="cb3-5">       ST_Area(c.geom:<span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">:geography</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10000</span>                         <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> area_imovel_ha,</span>
<span id="cb3-6">       ST_Area(ST_Intersection(c.geom, u.geom):<span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">:geography</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10000</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> sobreposicao_ha,</span>
<span id="cb3-7">       ST_Intersection(c.geom, u.geom)                            <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> geom</span>
<span id="cb3-8"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.car c</span>
<span id="cb3-9"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">JOIN</span> artigos.ucs u <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ON</span> u.regiao <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Amazonia'</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AND</span> ST_Intersects(c.geom, u.geom);</span>
<span id="cb3-10"></span>
<span id="cb3-11"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ALTER</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">TABLE</span> artigos.car_ucs <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ADD</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">COLUMN</span> pct_imovel <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">numeric</span>;</span>
<span id="cb3-12"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">UPDATE</span> artigos.car_ucs <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SET</span> pct_imovel <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> sobreposicao_ha <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> area_imovel_ha;</span>
<span id="cb3-13"></span>
<span id="cb3-14"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-- 4. Resumo por UC (só quem tem pelo menos 1% dentro)</span></span>
<span id="cb3-15"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> nome_uc, grupo,</span>
<span id="cb3-16">       <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">count</span>(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>)                                         <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> imoveis,</span>
<span id="cb3-17">       <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">count</span>(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FILTER</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> status_imovel <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'AT'</span>)     <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> ativos,</span>
<span id="cb3-18">       <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">count</span>(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FILTER</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> status_imovel <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'PE'</span>)     <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> pendentes,</span>
<span id="cb3-19">       <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">count</span>(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FILTER</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> status_imovel <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'SU'</span>)     <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> suspensos,</span>
<span id="cb3-20">       <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">count</span>(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FILTER</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> status_imovel <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'CA'</span>)     <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> cancelados,</span>
<span id="cb3-21">       <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">round</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sum</span>(sobreposicao_ha))                      <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> soma_sobreposicao_ha,</span>
<span id="cb3-22">       <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">round</span>((ST_Area(ST_Union(geom):<span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">:geography</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10000</span>):<span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">:numeric</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> coberta_ha</span>
<span id="cb3-23"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.car_ucs</span>
<span id="cb3-24"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> pct_imovel <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span></span>
<span id="cb3-25"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">GROUP</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BY</span> nome_uc, grupo</span>
<span id="cb3-26"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ORDER</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BY</span> coberta_ha <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">DESC</span>;</span></code></pre></div></div>
</div>
<div id="tabset-1-4" class="tab-pane" aria-labelledby="tabset-1-4-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb4-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> geopandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> gpd</span>
<span id="cb4-2"></span>
<span id="cb4-3">G <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dados/artigos.gpkg"</span></span>
<span id="cb4-4">ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.read_file(G, layer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ucs"</span>).query(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"regiao == 'Amazonia'"</span>)</span>
<span id="cb4-5">car <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.read_file(G, layer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"car"</span>)</span>
<span id="cb4-6">ALBERS <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ESRI:102033"</span>                       <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># projeção de área igual</span></span>
<span id="cb4-7"></span>
<span id="cb4-8"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1. Seleção por localização</span></span>
<span id="cb4-9">toca <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> car[car.intersects(ucs.union_all())].copy()</span>
<span id="cb4-10"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"imóveis que tocam as UCs:"</span>, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(toca))</span>
<span id="cb4-11"></span>
<span id="cb4-12"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2 e 3. Interseção, área sobreposta e porcentagem do imóvel</span></span>
<span id="cb4-13">toca[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_imovel_ha"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> toca.to_crs(ALBERS).area <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10_000</span></span>
<span id="cb4-14">car_ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.overlay(toca, ucs[[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cnuc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"grupo"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"geometry"</span>]],</span>
<span id="cb4-15">                      how<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"intersection"</span>, keep_geom_type<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb4-16">car_ucs[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"sobreposicao_ha"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> car_ucs.to_crs(ALBERS).area <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10_000</span></span>
<span id="cb4-17">car_ucs[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"pct_imovel"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> car_ucs[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"sobreposicao_ha"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> car_ucs[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_imovel_ha"</span>]</span>
<span id="cb4-18"></span>
<span id="cb4-19"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 4. Resumo por UC (pelo menos 1% dentro)</span></span>
<span id="cb4-20">dentro <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> car_ucs[car_ucs[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"pct_imovel"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]</span>
<span id="cb4-21">resumo <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> dentro.pivot_table(index<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>, columns<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"status_imovel"</span>, values<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cod_imovel"</span>,</span>
<span id="cb4-22">                            aggfunc<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"count"</span>, fill_value<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb4-23">resumo[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"soma_sobreposicao_ha"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> dentro.groupby(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>)[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"sobreposicao_ha"</span>].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sum</span>().<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">round</span>()</span>
<span id="cb4-24">resumo[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"coberta_ha"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (dentro.dissolve(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>).to_crs(ALBERS).area <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10_000</span>).<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">round</span>()</span>
<span id="cb4-25"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(resumo.sort_values(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"coberta_ha"</span>, ascending<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>))</span></code></pre></div></div>
</div>
</div>
</div>
</section>
<section id="conferindo-o-resultado" class="level2">
<h2 class="anchored" data-anchor-id="conferindo-o-resultado">Conferindo o resultado</h2>
<p>As versões do QGIS, do PostGIS e do Python deram os mesmos números de imóveis e as mesmas áreas (o PostGIS difere em menos de 0,01%). Como o CAR só foi baixado dentro do recorte, as porcentagens são sobre a parte de cada UC que fica no recorte:</p>
<table class="table-striped caption-top table">
<caption>Imóveis do CAR sobrepostos às UCs do recorte (SICAR, consulta de outubro de 2026).</caption>
<colgroup>
<col style="width: 11%">
<col style="width: 11%">
<col style="width: 15%">
<col style="width: 15%">
<col style="width: 15%">
<col style="width: 15%">
<col style="width: 15%">
</colgroup>
<thead>
<tr class="header">
<th>UC</th>
<th>Grupo</th>
<th style="text-align: right;">Imóveis (≥ 1% dentro)</th>
<th style="text-align: right;">Cancelados</th>
<th style="text-align: right;">Área coberta por CAR (ha)</th>
<th style="text-align: right;">% da UC no recorte</th>
<th style="text-align: right;">% sem os cancelados</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Floresta Nacional do Jamanxim</td>
<td>Uso Sustentável</td>
<td style="text-align: right;">415</td>
<td style="text-align: right;">119</td>
<td style="text-align: right;">631.419</td>
<td style="text-align: right;">49%</td>
<td style="text-align: right;">37%</td>
</tr>
<tr class="even">
<td>Área de Proteção Ambiental do Tapajós</td>
<td>Uso Sustentável</td>
<td style="text-align: right;">517</td>
<td style="text-align: right;">171</td>
<td style="text-align: right;">511.783</td>
<td style="text-align: right;">72%</td>
<td style="text-align: right;">48%</td>
</tr>
<tr class="odd">
<td>Floresta Estadual de Iriri</td>
<td>Uso Sustentável</td>
<td style="text-align: right;">70</td>
<td style="text-align: right;">63</td>
<td style="text-align: right;">146.701</td>
<td style="text-align: right;">80%</td>
<td style="text-align: right;">4%</td>
</tr>
<tr class="even">
<td>Parque Nacional do Jamanxim</td>
<td>Proteção Integral</td>
<td style="text-align: right;">89</td>
<td style="text-align: right;">80</td>
<td style="text-align: right;">124.953</td>
<td style="text-align: right;">19%</td>
<td style="text-align: right;">2%</td>
</tr>
<tr class="odd">
<td>Parque Nacional do Rio Novo</td>
<td>Proteção Integral</td>
<td style="text-align: right;">20</td>
<td style="text-align: right;">17</td>
<td style="text-align: right;">51.462</td>
<td style="text-align: right;">17%</td>
<td style="text-align: right;">2%</td>
</tr>
<tr class="even">
<td>Floresta Nacional de Altamira</td>
<td>Uso Sustentável</td>
<td style="text-align: right;">40</td>
<td style="text-align: right;">29</td>
<td style="text-align: right;">29.644</td>
<td style="text-align: right;">5%</td>
<td style="text-align: right;">1%</td>
</tr>
</tbody>
</table>
<p>A coluna “sem os cancelados” muda a história: na Floresta Estadual de Iriri, 63 dos 70 cadastros já foram cancelados, e a cobertura cai de 80% para 4%. Nos dois Parques Nacionais (Proteção Integral), ainda restam <strong>12 cadastros ativos, pendentes ou suspensos</strong>.</p>
</section>
<section id="armadilhas" class="level2">
<h2 class="anchored" data-anchor-id="armadilhas">Armadilhas</h2>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Aviso</span>“Intersecta” inclui quem só encosta
</div>
</div>
<div class="callout-body-container callout-body">
<p>A seleção por localização com <strong>intersecta</strong> pega também o imóvel desenhado em cima do limite da UC, com 0,01% de área dentro. No recorte, 1.196 imóveis tocam as UCs, mas só 1.135 têm pelo menos 1% da área lá dentro. Meça a sobreposição antes de concluir que “há N imóveis na UC”.</p>
</div>
</div>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Aviso</span>Imóveis sobrepostos entre si
</div>
</div>
<div class="callout-body-container callout-body">
<p>Como o CAR é autodeclarado, vários imóveis cobrem o mesmo pedaço de terra. Somar a sobreposição de cada um dá mais área do que existe: compare a coluna de soma com a de área coberta (dissolvida) na tabela acima.</p>
</div>
</div>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Aviso</span>Cadastros cancelados
</div>
</div>
<div class="callout-body-container callout-body">
<p>Os imóveis com <code>status_imovel = 'CA'</code> (cancelados) continuam no serviço. Decida se entram na análise e escreva isso no relatório. Neste artigo, eles aparecem numa coluna separada.</p>
</div>
</div>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Nota</span>Dados pessoais
</div>
</div>
<div class="callout-body-container callout-body">
<p>O serviço público do SICAR não traz nome nem CPF do proprietário, só o código do imóvel. Mesmo assim, evite publicar listas de códigos de imóveis com acusações: o CAR sobreposto a uma UC é um indício para análise, não uma infração comprovada.</p>
</div>
</div>
</section>
<section id="veja-também" class="level2">
<h2 class="anchored" data-anchor-id="veja-também">Veja também</h2>
<ul>
<li><a href="../artigos/02-interior-entorno.html">Interior e entorno das UCs</a></li>
<li><a href="../guia-espacial/guia/03-fontes-de-dados.html">Fontes de dados</a>, com o CAR, o SIGEF e as Terras Indígenas</li>
</ul>
<div class="navegacao-livro">
<p><a href="../artigos/07-juntar-atributos.html" class="anterior"><span class="direcao">← Anterior</span> Trazer informações de outra tabela: junções e listas de valores</a> <a href="../artigos/09-densidade-kernel.html" class="proximo"><span class="direcao">Próximo →</span> Densidade Kernel do desmatamento: onde a pressão está concentrada</a></p>
</div>
</section>
<section id="atualizações" class="level2 unnumbered">
<h2 class="unnumbered anchored" data-anchor-id="atualizações">Atualizações</h2>
<ul>
<li><strong>29/10/2026:</strong> publicação, com dados do INPE, do MMA, do IBAMA e do SICAR de outubro de 2026.</li>
</ul>
<p><a href="https://hendesson.github.io/en/articles/08-car-protected-areas.html">English version</a></p>


</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> De volta ao topo</a><div id="quarto-appendix" class="default"><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Licença</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/deed.pt_br">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Como citar</h2><div><div class="quarto-appendix-secondary-label">BibTeX</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@misc{alves2026,
  author = {Alves, Hendesson},
  publisher = {Hendesson Alves},
  title = {Imóveis do CAR dentro das UCs: selecionar e medir a
    sobreposição},
  date = {2026-10-29},
  url = {https://hendesson.github.io/artigos/08-car-ucs.html},
  doi = {10.5281/zenodo.23780260},
  langid = {pt-BR},
  abstract = {Imóveis do CAR baixados do serviço público do SICAR e
    cruzados com as UCs: quem só encosta no limite, quem está lá dentro
    e quanto de cada UC está declarado como imóvel rural. Tirar os
    cadastros cancelados muda a conclusão.}
}
</code></pre><div class="quarto-appendix-secondary-label">Por favor, cite este trabalho como:</div><div id="ref-alves2026" class="csl-entry quarto-appendix-citeas">
Alves, Hendesson. 2026. <span>“Imóveis do CAR dentro das UCs: selecionar
e medir a sobreposição.”</span> In <em>Artigos de geoprocessamento para
monitoramento ambiental</em>. Preprint, Hendesson Alves, October 29. <a href="https://doi.org/10.5281/zenodo.23780260">https://doi.org/10.5281/zenodo.23780260</a>.
</div></div></section></div> ]]></description>
  <category>CAR</category>
  <category>UCs</category>
  <guid>https://hendesson.github.io/artigos/08-car-ucs.html</guid>
  <pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate>
  <media:content url="https://hendesson.github.io/imagens/artigos/car_ucs.png" medium="image" type="image/png" height="192" width="144"/>
</item>
<item>
  <title>Densidade Kernel do desmatamento: onde a pressão está concentrada</title>
  <dc:creator>Hendesson Alves</dc:creator>
  <link>https://hendesson.github.io/artigos/09-densidade-kernel.html</link>
  <description><![CDATA[ 





<div class="ficha">
<p><span class="rotulo">Nível</span> Intermediário <span class="rotulo">Leitura</span> 11 min <span class="rotulo">Dados</span> outubro de 2026 <span class="rotulo">Programas</span> <span class="selo-texto">ArcGIS</span> <img src="https://hendesson.github.io/imagens/ferramentas/qgis.svg" class="img-fluid" alt="QGIS"> <img src="https://hendesson.github.io/imagens/ferramentas/postgis.svg" class="img-fluid" alt="PostGIS"> <img src="https://hendesson.github.io/imagens/ferramentas/python.svg" class="img-fluid" alt="Python"></p>
</div>
<p>Um mapa com 1.600 polígonos pequenos de desmatamento é difícil de ler. A <strong>densidade Kernel</strong> espalha cada polígono numa vizinhança e soma tudo numa superfície contínua: o resultado é um <strong>mapa de calor</strong> que mostra onde o desmatamento está concentrado.</p>
<p>O script que eu usava fazia duas densidades, uma pesada pela <strong>área</strong> dos polígonos e outra só pela <strong>quantidade</strong>, normalizava cada uma entre 0 e 1 e tirava a média. Assim, tanto uma grande derrubada quanto muitas pequenas aparecem como “quentes”. Depois, calculava a média do índice dentro de cada UC.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://hendesson.github.io/imagens/artigos/kernel.png" class="img-fluid figure-img" alt="Mapa de calor sobre a região de Novo Progresso, de amarelo-claro a vermelho. A maior parte do calor fica fora das UCs, numa faixa a leste da Floresta Nacional do Jamanxim. O ponto mais quente, marcado com um X, fica na divisa entre a APA do Tapajós e a Floresta Nacional do Jamanxim, a oeste. Os limites das UCs aparecem em preto."></p>
<figcaption>Índice de densidade do desmatamento PRODES 2025 (média das densidades de área e de quantidade, de 0 a 1).</figcaption>
</figure>
</div>
<section id="como-funciona" class="level2">
<h2 class="anchored" data-anchor-id="como-funciona">Como funciona</h2>
<div class="cell" data-eval="true" data-layout-align="default">
<div class="cell-output-display">
<div>
<p></p><figure class="figure"><p></p>
<div>
<pre class="mermaid mermaid-js">flowchart LR
    A["Polígonos&lt;br/&gt;PRODES 2025"] --&gt; B["Ponto dentro&lt;br/&gt;de cada polígono"]
    B --&gt; C["Kernel pesado&lt;br/&gt;pela área"]
    B --&gt; D["Kernel sem peso&lt;br/&gt;(quantidade)"]
    C --&gt; E["Normalizar&lt;br/&gt;0 a 1"]
    D --&gt; F["Normalizar&lt;br/&gt;0 a 1"]
    E --&gt; G["Média"]
    F --&gt; G
    G --&gt; H["Média por UC"]
</pre>
</div>
<p></p><figcaption> Do polígono ao índice por UC</figcaption> </figure><p></p>
</div>
</div>
</div>
<ul>
<li><strong>Raio de busca:</strong> até onde cada ponto “espalha” sua influência. Aqui, <strong>10 km</strong>.</li>
<li><strong>Tamanho da célula:</strong> a resolução do mapa. Aqui, <strong>1 km</strong>.</li>
<li><strong>Núcleo quártico:</strong> o peso cai suavemente do centro (peso máximo) até a borda do raio (zero). É o padrão do ArcGIS e do QGIS.</li>
<li><strong>Recorte:</strong> só baixamos desmatamento dentro de um retângulo. Fora dele, a densidade daria zero sem ser zero, então o mapa e as médias por UC ficam <strong>dentro do recorte</strong>.</li>
<li><strong>Normalizar:</strong> <code>(valor − mínimo) / (máximo − mínimo)</code>. Cada programa calcula a densidade numa escala diferente, mas, depois de normalizar, os resultados ficam comparáveis.</li>
</ul>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Aviso</span>Trabalhe em metros
</div>
</div>
<div class="callout-body-container callout-body">
<p>O script antigo usava raio de <code>0,777</code> e célula de <code>0,0015</code>, em <strong>graus</strong>. Um grau de longitude mede cerca de 111 km no Equador e menos ao sul, então o “círculo” de busca vira uma elipse. Reprojete para uma projeção em metros (aqui, EPSG:5880) e escreva raio e célula em metros.</p>
</div>
</div>
</section>
<section id="o-código" class="level2">
<h2 class="anchored" data-anchor-id="o-código">O código</h2>
<p>Dados: camada <code>prodes_amz</code> (ano 2025) e <code>ucs</code> do GeoPackage dos artigos (<a href="../artigos/sobre.html#dados">como baixar</a>).</p>
<div class="tabset-margin-container"></div><div class="panel-tabset" data-group="programa">
<ul class="nav nav-tabs"><li class="nav-item"><a class="nav-link active" id="tabset-1-1-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-1" aria-controls="tabset-1-1" aria-selected="true" href="">ArcGIS Pro</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-2-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-2" aria-controls="tabset-1-2" aria-selected="false" href="">QGIS</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-3-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-3" aria-controls="tabset-1-3" aria-selected="false" href="">PostGIS</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-4-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-4" aria-controls="tabset-1-4" aria-selected="false" href="">Python</a></li></ul>
<div class="tab-content" data-group="programa">
<div id="tabset-1-1" class="tab-pane active" aria-labelledby="tabset-1-1-tab">
<p>Precisa da extensão <strong>Spatial Analyst</strong>.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> arcpy</span>
<span id="cb1-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> arcpy.sa <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> KernelDensity</span>
<span id="cb1-3"></span>
<span id="cb1-4">arcpy.CheckOutExtension(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Spatial"</span>)</span>
<span id="cb1-5">arcpy.env.overwriteOutput <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span></span>
<span id="cb1-6">arcpy.env.outputCoordinateSystem <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.SpatialReference(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5880</span>)   <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># metros</span></span>
<span id="cb1-7">gpkg <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\a</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">rtigos</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">gpkg"</span></span>
<span id="cb1-8">gdb <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\r</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">esultados</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">gdb"</span></span>
<span id="cb1-9"></span>
<span id="cb1-10"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Área baixada (o recorte): o mapa e as médias por UC ficam só dentro dela</span></span>
<span id="cb1-11">recorte <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.Extent(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">56.5</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">8.5</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">54.5</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">5.5</span>, spatial_reference<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>arcpy.SpatialReference(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4674</span>))</span>
<span id="cb1-12">arcpy.env.extent <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> recorte.projectAs(arcpy.SpatialReference(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5880</span>))</span>
<span id="cb1-13"></span>
<span id="cb1-14"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1. Polígonos de 2025, área em hectares e um ponto dentro de cada um</span></span>
<span id="cb1-15">prodes <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.analysis.Select(gpkg <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\m</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ain</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">prodes_amz"</span>, <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"memory</span><span class="er" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">prodes"</span>,</span>
<span id="cb1-16">                               <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"year = 2025 AND UPPER(main_class) = 'DESMATAMENTO'"</span>)</span>
<span id="cb1-17">arcpy.management.RepairGeometry(prodes)</span>
<span id="cb1-18">arcpy.management.CalculateGeometryAttributes(</span>
<span id="cb1-19">    prodes, [[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"AREA_GEODESIC"</span>]], area_unit<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"HECTARES"</span>)</span>
<span id="cb1-20">pontos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.management.FeatureToPoint(prodes, <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"memory</span><span class="er" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">pontos"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"INSIDE"</span>)</span>
<span id="cb1-21"></span>
<span id="cb1-22"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2. Duas densidades: pesada pela área e sem peso (célula 1 km, raio 10 km)</span></span>
<span id="cb1-23">kd_area <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> KernelDensity(pontos, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1000</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10000</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SQUARE_KILOMETERS"</span>)</span>
<span id="cb1-24">kd_qtde <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> KernelDensity(pontos, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"NONE"</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1000</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10000</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SQUARE_KILOMETERS"</span>)</span>
<span id="cb1-25"></span>
<span id="cb1-26"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 3. Normalizar cada uma entre 0 e 1 e tirar a média</span></span>
<span id="cb1-27"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> normalizar(r):</span>
<span id="cb1-28">    arcpy.management.CalculateStatistics(r)</span>
<span id="cb1-29">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> (r <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> r.minimum) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> (r.maximum <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> r.minimum)</span>
<span id="cb1-30"></span>
<span id="cb1-31">indice <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (normalizar(kd_area) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> normalizar(kd_qtde)) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span></span>
<span id="cb1-32">indice.save(gdb <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="er" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">kernel_indice"</span>)</span>
<span id="cb1-33"></span>
<span id="cb1-34"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 4. Média e máximo do índice em cada UC, só na parte dentro do recorte</span></span>
<span id="cb1-35">ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.analysis.Select(gpkg <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\m</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ain</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ucs"</span>, <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"memory</span><span class="er" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ucs"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"regiao = 'Amazonia'"</span>)</span>
<span id="cb1-36">ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.analysis.Clip(ucs, recorte.polygon, <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"memory</span><span class="er" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ucs_recorte"</span>)</span>
<span id="cb1-37">arcpy.sa.ZonalStatisticsAsTable(ucs, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>, indice, gdb <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="er" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">kernel_por_uc"</span>,</span>
<span id="cb1-38">                                <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"DATA"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MEAN_STD"</span>)</span></code></pre></div></div>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
Nota
</div>
</div>
<div class="callout-body-container callout-body">
<p>O script original normalizava com <code>ZonalStatistics</code> (mínimo e máximo por zona). Com uma zona só, o <code>r.minimum</code> e o <code>r.maximum</code> do raster dão o mesmo resultado em uma linha.</p>
</div>
</div>
</div>
<div id="tabset-1-2" class="tab-pane" aria-labelledby="tabset-1-2-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb2-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> processing</span>
<span id="cb2-2">G <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"C:/dados/artigos.gpkg"</span></span>
<span id="cb2-3">SAIDA <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"C:/dados/"</span></span>
<span id="cb2-4"></span>
<span id="cb2-5"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> rodar(alg, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span>p):</span>
<span id="cb2-6">    p.setdefault(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"OUTPUT"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"memory:"</span>)</span>
<span id="cb2-7">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> processing.run(alg, p)[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"OUTPUT"</span>]</span>
<span id="cb2-8"></span>
<span id="cb2-9"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1. Polígonos de 2025, área em hectares e ponto dentro de cada um (em metros)</span></span>
<span id="cb2-10">prodes <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:extractbyexpression"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>G<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">|layername=prodes_amz"</span>,</span>
<span id="cb2-11">               EXPRESSION<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"year = 2025 AND upper(main_class) = 'DESMATAMENTO'"</span>)</span>
<span id="cb2-12">prodes <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:fixgeometries"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>prodes)</span>
<span id="cb2-13">prodes <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:removenullgeometries"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>prodes, REMOVE_EMPTY<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># lascas</span></span>
<span id="cb2-14">prodes <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:fieldcalculator"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>prodes, FIELD_NAME<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>, FIELD_TYPE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>,</span>
<span id="cb2-15">               FIELD_PRECISION<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>,</span>
<span id="cb2-16">               FORMULA<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area(transform($geometry, 'EPSG:4674', 'ESRI:102033')) / 10000"</span>)</span>
<span id="cb2-17">pontos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:pointonsurface"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>prodes)</span>
<span id="cb2-18">pontos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:reprojectlayer"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>pontos, TARGET_CRS<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"EPSG:5880"</span>)</span>
<span id="cb2-19"></span>
<span id="cb2-20"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2. Mapa de calor (núcleo quártico), com e sem peso</span></span>
<span id="cb2-21">kernel <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>pontos, RADIUS<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10000</span>, PIXEL_SIZE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1000</span>, KERNEL<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, OUTPUT_VALUE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb2-22">kd_area <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:heatmapkerneldensityestimation"</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span>kernel, WEIGHT_FIELD<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>,</span>
<span id="cb2-23">                OUTPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>SAIDA <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"kd_area.tif"</span>)</span>
<span id="cb2-24">kd_qtde <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:heatmapkerneldensityestimation"</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span>kernel,</span>
<span id="cb2-25">                OUTPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>SAIDA <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"kd_qtde.tif"</span>)</span>
<span id="cb2-26"></span>
<span id="cb2-27"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 3. Normalizar (0 a 1) e tirar a média</span></span>
<span id="cb2-28">norm_area <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:rescaleraster"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>kd_area, BAND<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, MINIMUM<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, MAXIMUM<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,</span>
<span id="cb2-29">                  OUTPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>SAIDA <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"kd_area_norm.tif"</span>)</span>
<span id="cb2-30">norm_qtde <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:rescaleraster"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>kd_qtde, BAND<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, MINIMUM<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, MAXIMUM<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,</span>
<span id="cb2-31">                  OUTPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>SAIDA <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"kd_qtde_norm.tif"</span>)</span>
<span id="cb2-32">indice <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gdal:rastercalculator"</span>, INPUT_A<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>norm_area, BAND_A<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, INPUT_B<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>norm_qtde,</span>
<span id="cb2-33">               BAND_B<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, FORMULA<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"(A + B) / 2"</span>, RTYPE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>, OUTPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>SAIDA <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"kernel_media.tif"</span>)</span>
<span id="cb2-34"></span>
<span id="cb2-35"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># O mapa de calor só cobre a área dos pontos mais o raio, e grava "sem dado" onde a</span></span>
<span id="cb2-36"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># densidade é zero: estender até o recorte e trocar "sem dado" por zero</span></span>
<span id="cb2-37">indice <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gdal:warpreproject"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>indice, TARGET_CRS<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"EPSG:5880"</span>,</span>
<span id="cb2-38">               TARGET_RESOLUTION<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1000</span>, TARGET_EXTENT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"-56.5,-54.5,-8.5,-5.5"</span>,</span>
<span id="cb2-39">               TARGET_EXTENT_CRS<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"EPSG:4674"</span>, OUTPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>SAIDA <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"kernel_recorte.tif"</span>)</span>
<span id="cb2-40">indice <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:fillnodata"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>indice, BAND<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, FILL_VALUE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>,</span>
<span id="cb2-41">               OUTPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>SAIDA <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"kernel_indice.tif"</span>)</span>
<span id="cb2-42"></span>
<span id="cb2-43"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 4. Média e máximo do índice em cada UC, só na parte dentro do recorte</span></span>
<span id="cb2-44">ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:extractbyexpression"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>G<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">|layername=ucs"</span>,</span>
<span id="cb2-45">            EXPRESSION<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"regiao = 'Amazonia'"</span>)</span>
<span id="cb2-46">ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:extractbyextent"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ucs, CLIP<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>,</span>
<span id="cb2-47">            EXTENT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"-56.5,-54.5,-8.5,-5.5 [EPSG:4674]"</span>)</span>
<span id="cb2-48">ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:fixgeometries"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ucs)</span>
<span id="cb2-49">ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:reprojectlayer"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ucs, TARGET_CRS<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"EPSG:5880"</span>)</span>
<span id="cb2-50">por_uc <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:zonalstatisticsfb"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ucs, INPUT_RASTER<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>indice, RASTER_BAND<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,</span>
<span id="cb2-51">               STATISTICS<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>], COLUMN_PREFIX<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"idx_"</span>)          <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2 = média, 6 = máximo</span></span>
<span id="cb2-52"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> f <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> por_uc.getFeatures():</span>
<span id="cb2-53">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>], <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">round</span>(f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"idx_mean"</span>], <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>), <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">round</span>(f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"idx_max"</span>], <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>))</span>
<span id="cb2-54">QgsProject.instance().addMapLayer(QgsRasterLayer(indice, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Índice Kernel"</span>))</span></code></pre></div></div>
<p>O <strong>Mapa de calor</strong> fica em Processamento → Interpolação (no QGIS 3, o identificador é <code>qgis:heatmapkerneldensityestimation</code>). Nos menus, o passo 3 é <strong>Reescalar raster</strong> duas vezes e uma <strong>Calculadora raster</strong> com <code>("norm_area@1" + "norm_qtde@1") / 2</code>.</p>
</div>
<div id="tabset-1-3" class="tab-pane" aria-labelledby="tabset-1-3-tab">
<p>O PostGIS faz Kernel sem raster: uma <strong>grade de pontos</strong> a cada 1 km e, para cada ponto da grade, a soma do peso quártico dos desmatamentos a até 10 km.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode sql code-with-copy"><code class="sourceCode sql"><span id="cb3-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-- 1. Um ponto dentro de cada polígono de 2025 (em metros) e a área em hectares</span></span>
<span id="cb3-2"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">DROP</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">TABLE</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">IF</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">EXISTS</span> artigos.kernel_pontos;</span>
<span id="cb3-3"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">CREATE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">TABLE</span> artigos.kernel_pontos <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span></span>
<span id="cb3-4"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> ST_Transform(ST_PointOnSurface(g), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5880</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> geom,</span>
<span id="cb3-5">       ST_Area(g:<span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">:geography</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10000</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> area_ha</span>
<span id="cb3-6"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> ST_CollectionExtract(ST_MakeValid(geom), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> g</span>
<span id="cb3-7">      <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.prodes_amz</span>
<span id="cb3-8">      <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">year</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2025</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AND</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">upper</span>(main_class) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'DESMATAMENTO'</span>) p</span>
<span id="cb3-9"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">NOT</span> ST_IsEmpty(g);</span>
<span id="cb3-10"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">CREATE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">INDEX</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ON</span> artigos.kernel_pontos <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">USING</span> gist (geom);</span>
<span id="cb3-11"></span>
<span id="cb3-12"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-- 2. Grade de 1 km sobre a área dos pontos (mais 10 km de margem) e as duas densidades</span></span>
<span id="cb3-13"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">DROP</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">TABLE</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">IF</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">EXISTS</span> artigos.kernel_grade;</span>
<span id="cb3-14"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">CREATE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">TABLE</span> artigos.kernel_grade <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span></span>
<span id="cb3-15"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WITH</span> grade <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> (</span>
<span id="cb3-16">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> ST_Centroid(c.geom) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> geom</span>
<span id="cb3-17">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> ST_SquareGrid(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1000</span>, (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> ST_SetSRID(ST_Expand(ST_Extent(geom), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10000</span>):<span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">:geometry</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5880</span>)</span>
<span id="cb3-18">                              <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.kernel_pontos)) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> c</span>
<span id="cb3-19">),</span>
<span id="cb3-20">quartico <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> (                       <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-- peso: (1 - (d/r)²)², de 1 no centro a 0 em 10 km</span></span>
<span id="cb3-21">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> g.geom, p.area_ha,</span>
<span id="cb3-22">           <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">power</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">power</span>(ST_Distance(g.geom, p.geom) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10000</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> w</span>
<span id="cb3-23">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> grade g</span>
<span id="cb3-24">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">JOIN</span> artigos.kernel_pontos p <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ON</span> ST_DWithin(g.geom, p.geom, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10000</span>)</span>
<span id="cb3-25">)</span>
<span id="cb3-26"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> geom, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sum</span>(w <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> area_ha) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> kd_area, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sum</span>(w) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> kd_qtde</span>
<span id="cb3-27"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> quartico</span>
<span id="cb3-28"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">GROUP</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BY</span> geom;</span>
<span id="cb3-29"></span>
<span id="cb3-30"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-- 3. Normalizar e tirar a média (células sem desmatamento por perto ficam com 0)</span></span>
<span id="cb3-31"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ALTER</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">TABLE</span> artigos.kernel_grade <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ADD</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">COLUMN</span> indice <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">numeric</span>;</span>
<span id="cb3-32"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WITH</span> lim <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">max</span>(kd_area) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> ma, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">max</span>(kd_qtde) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> mq <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.kernel_grade)</span>
<span id="cb3-33"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">UPDATE</span> artigos.kernel_grade <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SET</span> indice <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ((kd_area <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> ma) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> (kd_qtde <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> mq)) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> lim;</span>
<span id="cb3-34"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">CREATE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">INDEX</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ON</span> artigos.kernel_grade <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">USING</span> gist (geom);</span>
<span id="cb3-35"></span>
<span id="cb3-36"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-- 4. Média e máximo do índice em cada UC, só dentro do recorte (células com zero contam)</span></span>
<span id="cb3-37"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WITH</span> ucs <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> (</span>
<span id="cb3-38">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> nome_uc,</span>
<span id="cb3-39">           ST_Transform(ST_Intersection(geom, ST_MakeEnvelope(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">56.5</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">8.5</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">54.5</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">5.5</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4674</span>)),</span>
<span id="cb3-40">                        <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5880</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> geom</span>
<span id="cb3-41">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.ucs</span>
<span id="cb3-42">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> regiao <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Amazonia'</span></span>
<span id="cb3-43">)</span>
<span id="cb3-44"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> u.nome_uc,</span>
<span id="cb3-45">       <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">round</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">avg</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">coalesce</span>(k.indice, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> idx_media,</span>
<span id="cb3-46">       <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">round</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">max</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">coalesce</span>(k.indice, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> idx_max</span>
<span id="cb3-47"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> ucs u</span>
<span id="cb3-48"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">CROSS</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">JOIN</span> LATERAL ST_SquareGrid(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1000</span>, u.geom) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> c</span>
<span id="cb3-49"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">LEFT</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">JOIN</span> artigos.kernel_grade k <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ON</span> k.geom <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ST_Centroid(c.geom)</span>
<span id="cb3-50"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> ST_Intersects(ST_Centroid(c.geom), u.geom)</span>
<span id="cb3-51"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">GROUP</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BY</span> u.nome_uc</span>
<span id="cb3-52"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ORDER</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BY</span> idx_media <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">DESC</span>;</span></code></pre></div></div>
<p>O mínimo de cada densidade é zero (longe de qualquer desmatamento), por isso a normalização vira só <code>valor / máximo</code>.</p>
</div>
<div id="tabset-1-4" class="tab-pane" aria-labelledby="tabset-1-4-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb4-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> numpy <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> np</span>
<span id="cb4-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> geopandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> gpd</span>
<span id="cb4-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> shapely.geometry <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> box</span>
<span id="cb4-4"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> rasterio.transform <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> from_origin</span>
<span id="cb4-5"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> rasterstats <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> zonal_stats</span>
<span id="cb4-6"></span>
<span id="cb4-7">G <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dados/artigos.gpkg"</span></span>
<span id="cb4-8">RAIO, CEL <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10_000</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1_000</span>                         <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># metros</span></span>
<span id="cb4-9">recorte <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.GeoSeries([box(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">56.5</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">8.5</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">54.5</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">5.5</span>)], crs<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4674</span>)</span>
<span id="cb4-10"></span>
<span id="cb4-11"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1. Polígonos de 2025, área em hectares e ponto dentro de cada um (em metros)</span></span>
<span id="cb4-12">prodes <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.read_file(G, layer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"prodes_amz"</span>)</span>
<span id="cb4-13">prodes <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> prodes[(prodes[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"year"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2025</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> (prodes[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"main_class"</span>].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>.upper() <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"DESMATAMENTO"</span>)]</span>
<span id="cb4-14">prodes[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"geometry"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> prodes.make_valid(method<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"structure"</span>, keep_collapsed<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb4-15">prodes <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> prodes[<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span>prodes.is_empty]</span>
<span id="cb4-16">peso <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> prodes.to_crs(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ESRI:102033"</span>).area.values <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10_000</span></span>
<span id="cb4-17">pontos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> prodes.representative_point().to_crs(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5880</span>)</span>
<span id="cb4-18">x, y <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pontos.x.values, pontos.y.values</span>
<span id="cb4-19"></span>
<span id="cb4-20"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2. Grade de 1 km sobre o recorte e núcleo quártico, ponto a ponto</span></span>
<span id="cb4-21">xmin, ymin, xmax, ymax <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> recorte.to_crs(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5880</span>).total_bounds</span>
<span id="cb4-22">x0, y1 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> xmin, ymax</span>
<span id="cb4-23">ncol <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>((xmax <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> x0) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">//</span> CEL) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span></span>
<span id="cb4-24">nlin <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>((y1 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> ymin) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">//</span> CEL) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span></span>
<span id="cb4-25">cx <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> x0 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> (np.arange(ncol) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> CEL           <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># centro das colunas</span></span>
<span id="cb4-26">cy <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> y1 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> (np.arange(nlin) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> CEL           <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># centro das linhas</span></span>
<span id="cb4-27">kd_area <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.zeros((nlin, ncol))</span>
<span id="cb4-28">kd_qtde <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.zeros((nlin, ncol))</span>
<span id="cb4-29"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> xi, yi, wi <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">zip</span>(x, y, peso):</span>
<span id="cb4-30">    c <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">slice</span>(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">max</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>((xi <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> RAIO <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> x0) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">//</span> CEL)), <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>((xi <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> RAIO <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> x0) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">//</span> CEL) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb4-31">    l <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">slice</span>(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">max</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>((y1 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> yi <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> RAIO) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">//</span> CEL)), <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>((y1 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> yi <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> RAIO) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">//</span> CEL) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb4-32">    d2 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (cx[c][<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span>, :] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> xi) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> (cy[l][:, <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> yi) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span></span>
<span id="cb4-33">    k <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.where(d2 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&lt;</span> RAIO <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, (<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> d2 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> RAIO <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb4-34">    kd_area[l, c] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+=</span> wi <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> k</span>
<span id="cb4-35">    kd_qtde[l, c] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+=</span> k</span>
<span id="cb4-36"></span>
<span id="cb4-37"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 3. Normalizar (o mínimo é zero) e tirar a média</span></span>
<span id="cb4-38">indice <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (kd_area <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> kd_area.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">max</span>() <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> kd_qtde <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> kd_qtde.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">max</span>()) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span></span>
<span id="cb4-39"></span>
<span id="cb4-40"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 4. Média e máximo do índice em cada UC, só dentro do recorte</span></span>
<span id="cb4-41">ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.read_file(G, layer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ucs"</span>).query(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"regiao == 'Amazonia'"</span>)</span>
<span id="cb4-42">ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.clip(ucs, recorte).to_crs(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5880</span>)</span>
<span id="cb4-43">stats <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> zonal_stats(ucs, indice, affine<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>from_origin(x0, y1, CEL, CEL),</span>
<span id="cb4-44">                    stats<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mean"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"max"</span>], nodata<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb4-45">ucs[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"idx_media"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">round</span>(s[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mean"</span>], <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>) <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> s <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> stats]</span>
<span id="cb4-46">ucs[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"idx_max"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">round</span>(s[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"max"</span>], <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>) <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> s <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> stats]</span>
<span id="cb4-47"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(ucs[[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"idx_media"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"idx_max"</span>]].sort_values(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"idx_media"</span>, ascending<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>))</span>
<span id="cb4-48">np.save(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dados/kernel_indice.npy"</span>, indice)</span></code></pre></div></div>
</div>
</div>
</div>
</section>
<section id="conferindo-o-resultado" class="level2">
<h2 class="anchored" data-anchor-id="conferindo-o-resultado">Conferindo o resultado</h2>
<p>As três versões testadas deram as mesmas médias por UC (diferença de até 0,001). O máximo varia um pouco mais (até 0,02), porque cada programa alinha a grade de células de um jeito:</p>
<table class="table-striped caption-top table">
<caption>Índice de densidade Kernel do PRODES 2025 (0 = nenhum desmatamento num raio de 10 km; 1 = o ponto mais quente do recorte).</caption>
<colgroup>
<col style="width: 30%">
<col style="width: 40%">
<col style="width: 30%">
</colgroup>
<thead>
<tr class="header">
<th>UC (parte dentro do recorte)</th>
<th style="text-align: right;">Média do índice</th>
<th>Máximo (QGIS / PostGIS / Python)</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Floresta Nacional do Jamanxim</td>
<td style="text-align: right;">0,014</td>
<td>0,36 / 0,37 / 0,37</td>
</tr>
<tr class="even">
<td>Área de Proteção Ambiental do Tapajós</td>
<td style="text-align: right;">0,013–0,014</td>
<td>0,49 / 0,47 / 0,47</td>
</tr>
<tr class="odd">
<td>Floresta Nacional de Altamira</td>
<td style="text-align: right;">0,008</td>
<td>0,19 / 0,18 / 0,19</td>
</tr>
<tr class="even">
<td>Floresta Estadual de Iriri</td>
<td style="text-align: right;">0,005–0,006</td>
<td>0,06 / 0,06 / 0,06</td>
</tr>
<tr class="odd">
<td>Parque Nacional do Rio Novo</td>
<td style="text-align: right;">0,002</td>
<td>0,03 / 0,03 / 0,03</td>
</tr>
<tr class="even">
<td>Parque Nacional do Jamanxim</td>
<td style="text-align: right;">0,001</td>
<td>0,09 / 0,08 / 0,08</td>
</tr>
<tr class="odd">
<td>Floresta Nacional de Itaituba I</td>
<td style="text-align: right;">0</td>
<td>0 / 0 / 0</td>
</tr>
</tbody>
</table>
<p>As médias são baixas porque as UCs são enormes e a maior parte delas está longe de qualquer desmatamento. O <strong>máximo</strong> diz mais: a APA do Tapajós e a Floresta Nacional do Jamanxim têm pontos com quase metade da intensidade do ponto mais quente do recorte. Esse ponto (o X no mapa) fica <strong>fora</strong> das UCs, na divisa entre a APA do Tapajós e a Floresta Nacional do Jamanxim, e a maior parte do calor está numa faixa a leste da Flona do Jamanxim, também fora das UCs.</p>
</section>
<section id="escolhendo-o-raio" class="level2">
<h2 class="anchored" data-anchor-id="escolhendo-o-raio">Escolhendo o raio</h2>
<p>O raio muda tudo. Com 2 km, cada desmatamento vira uma mancha isolada; com 50 km, o mapa inteiro fica morno. Não existe raio “certo”: escolha pela escala da decisão (o raio de atuação de uma equipe de campo, por exemplo) e <strong>escreva o valor na legenda</strong>. O artigo <a href="../artigos/12-priorizacao-arcgis-qgis.html">Priorização em ArcGIS Pro e QGIS</a> mostra outra forma de olhar a concentração, agrupando os polígonos próximos.</p>
</section>
<section id="veja-também" class="level2">
<h2 class="anchored" data-anchor-id="veja-também">Veja também</h2>
<ul>
<li><a href="../artigos/03-prodes-ucs.html">Desmatamento anual do PRODES nas UCs</a></li>
<li><a href="../guia-espacial/guia/01-conceitos.html">Conceitos de dados espaciais</a>: raster, resolução e projeções</li>
</ul>
<div class="navegacao-livro">
<p><a href="../artigos/08-car-ucs.html" class="anterior"><span class="direcao">← Anterior</span> Imóveis do CAR dentro das UCs: selecionar e medir a sobreposição</a> <a href="../artigos/10-mapas-automaticos.html" class="proximo"><span class="direcao">Próximo →</span> Um mapa por UC, automático: do ArcMap ao QGIS e ao Python</a></p>
</div>
</section>
<section id="atualizações" class="level2 unnumbered">
<h2 class="unnumbered anchored" data-anchor-id="atualizações">Atualizações</h2>
<ul>
<li><strong>29/10/2026:</strong> publicação, com dados do INPE, do MMA, do IBAMA e do SICAR de outubro de 2026.</li>
</ul>
<p><a href="https://hendesson.github.io/en/articles/09-kernel-density.html">English version</a></p>


</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> De volta ao topo</a><div id="quarto-appendix" class="default"><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Licença</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/deed.pt_br">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Como citar</h2><div><div class="quarto-appendix-secondary-label">BibTeX</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@misc{alves2026,
  author = {Alves, Hendesson},
  publisher = {Hendesson Alves},
  title = {Densidade Kernel do desmatamento: onde a pressão está
    concentrada},
  date = {2026-10-29},
  url = {https://hendesson.github.io/artigos/09-densidade-kernel.html},
  doi = {10.5281/zenodo.23780262},
  langid = {pt-BR},
  abstract = {Um mapa de calor do desmatamento PRODES 2025 que combina
    área e quantidade de polígonos num índice de 0 a 1, com raio e
    célula em metros. Mostra também como fazer Kernel no PostGIS sem
    raster e por que normalizar torna os programas comparáveis.}
}
</code></pre><div class="quarto-appendix-secondary-label">Por favor, cite este trabalho como:</div><div id="ref-alves2026" class="csl-entry quarto-appendix-citeas">
Alves, Hendesson. 2026. <span>“Densidade Kernel do desmatamento: onde a
pressão está concentrada.”</span> In <em>Artigos de geoprocessamento
para monitoramento ambiental</em>. Preprint, Hendesson Alves, October
29. <a href="https://doi.org/10.5281/zenodo.23780262">https://doi.org/10.5281/zenodo.23780262</a>.
</div></div></section></div> ]]></description>
  <category>PRODES</category>
  <category>Raster</category>
  <guid>https://hendesson.github.io/artigos/09-densidade-kernel.html</guid>
  <pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate>
  <media:content url="https://hendesson.github.io/imagens/artigos/kernel.png" medium="image" type="image/png" height="180" width="144"/>
</item>
<item>
  <title>Um mapa por UC, automático: do ArcMap ao QGIS e ao Python</title>
  <dc:creator>Hendesson Alves</dc:creator>
  <link>https://hendesson.github.io/artigos/10-mapas-automaticos.html</link>
  <description><![CDATA[ 





<div class="ficha">
<p><span class="rotulo">Nível</span> Intermediário <span class="rotulo">Leitura</span> 10 min <span class="rotulo">Dados</span> outubro de 2026 <span class="rotulo">Programas</span> <span class="selo-texto">ArcGIS</span> <img src="https://hendesson.github.io/imagens/ferramentas/qgis.svg" class="img-fluid" alt="QGIS"> <img src="https://hendesson.github.io/imagens/ferramentas/python.svg" class="img-fluid" alt="Python"></p>
</div>
<p>Toda semana, um mapa para cada UC com os alertas novos: é o tipo de tarefa que <strong>não se faz à mão</strong>. Com 7 UCs já são 7 mapas; com 130, ninguém dá conta.</p>
<p>Os scripts que eu usava faziam isso no <strong>ArcMap</strong>, com <code>arcpy.mapping</code>: abriam um <code>.mxd</code>, trocavam o filtro da camada, davam zoom na UC e exportavam um JPEG. Esse módulo <strong>não existe no ArcGIS Pro</strong>. Aqui está a mesma ideia em cada programa, do script antigo à versão sem licença.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://hendesson.github.io/imagens/artigos/mapa_atlas.png" class="img-fluid figure-img" alt="Mapa em folha A4 deitada com o título Parque Nacional do Jamanxim. A UC aparece em verde com contorno preto grosso, o entorno de 3 km em amarelo, as UCs vizinhas em cinza claro e os alertas do DETER coloridos por classe. À direita, legenda, barra de escala de 0 a 40 km, seta de norte e fonte dos dados."></p>
<figcaption>Mapa gerado pelo Atlas do QGIS para o Parque Nacional do Jamanxim. O mesmo layout foi exportado para as 7 UCs do recorte.</figcaption>
</figure>
</div>
<section id="o-que-todo-mapa-automático-precisa" class="level2">
<h2 class="anchored" data-anchor-id="o-que-todo-mapa-automático-precisa">O que todo mapa automático precisa</h2>
<ol type="1">
<li>Um <strong>modelo</strong> (layout) com mapa, título, legenda, escala, norte e fonte.</li>
<li>Uma <strong>camada que comanda a série</strong> (as UCs): cada feição vira uma página.</li>
<li><strong>Título e filtros que mudam</strong> com a página (o nome da UC, só o entorno dela).</li>
<li><strong>Zoom automático</strong> na feição da página, com uma margem.</li>
<li><strong>Exportação</strong> com um nome de arquivo por UC (o código CNUC é melhor que o nome, que tem acentos e espaços).</li>
</ol>
<table class="caption-top table">
<colgroup>
<col style="width: 25%">
<col style="width: 25%">
<col style="width: 25%">
<col style="width: 25%">
</colgroup>
<thead>
<tr class="header">
<th></th>
<th>Modelo</th>
<th>Série</th>
<th>Texto que muda</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>ArcMap</td>
<td><code>.mxd</code></td>
<td>laço em Python com <code>arcpy.mapping</code></td>
<td><code>ListLayoutElements("TEXT_ELEMENT")</code></td>
</tr>
<tr class="even">
<td>ArcGIS Pro</td>
<td>layout no <code>.aprx</code></td>
<td><strong>Série de mapas</strong> (Map Series)</td>
<td>texto dinâmico <code>&lt;dyn type="page" property="name"/&gt;</code></td>
</tr>
<tr class="odd">
<td>QGIS</td>
<td>layout de impressão</td>
<td><strong>Atlas</strong></td>
<td>expressão <code>[% "nome_uc" %]</code></td>
</tr>
<tr class="even">
<td>Python</td>
<td>figura do matplotlib</td>
<td>laço <code>for</code></td>
<td>f-string</td>
</tr>
</tbody>
</table>
</section>
<section id="o-código" class="level2">
<h2 class="anchored" data-anchor-id="o-código">O código</h2>
<div class="tabset-margin-container"></div><div class="panel-tabset" data-group="programa">
<ul class="nav nav-tabs"><li class="nav-item"><a class="nav-link active" id="tabset-1-1-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-1" aria-controls="tabset-1-1" aria-selected="true" href="">ArcMap</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-2-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-2" aria-controls="tabset-1-2" aria-selected="false" href="">ArcGIS Pro</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-3-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-3" aria-controls="tabset-1-3" aria-selected="false" href="">QGIS</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-4-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-4" aria-controls="tabset-1-4" aria-selected="false" href="">PostGIS</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-5-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-5" aria-controls="tabset-1-5" aria-selected="false" href="">Python</a></li></ul>
<div class="tab-content" data-group="programa">
<div id="tabset-1-1" class="tab-pane active" aria-labelledby="tabset-1-1-tab">
<p>O script antigo, simplificado. Só roda no <strong>ArcMap 10.x</strong> (Python 2.7).</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># -*- coding: utf-8 -*-</span></span>
<span id="cb1-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> arcpy</span>
<span id="cb1-3"></span>
<span id="cb1-4">mxd <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.mapping.MapDocument(<span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\m</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">apa_uc</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">mxd"</span>)</span>
<span id="cb1-5">df <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.mapping.ListDataFrames(mxd, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Layers"</span>)[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]</span>
<span id="cb1-6">ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.mapping.ListLayers(mxd, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"UCs"</span>, df)[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]</span>
<span id="cb1-7">titulo <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.mapping.ListLayoutElements(mxd, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"TEXT_ELEMENT"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"titulo"</span>)[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]</span>
<span id="cb1-8"></span>
<span id="cb1-9"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> cnuc, nome <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> arcpy.da.SearchCursor(ucs, [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cnuc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>]):</span>
<span id="cb1-10">    ucs.definitionQuery <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cnuc = '</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%s</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'"</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%</span> cnuc</span>
<span id="cb1-11">    df.extent <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ucs.getExtent()</span>
<span id="cb1-12">    df.scale <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> df.scale <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.1</span>                      <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 10% de margem</span></span>
<span id="cb1-13">    titulo.text <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> nome</span>
<span id="cb1-14">    arcpy.mapping.ExportToPNG(mxd, <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\m</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">apas</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\m</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">apa_%s</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">png"</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%</span> cnuc, resolution<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">150</span>)</span>
<span id="cb1-15">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Mapa de </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%s</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;"> exportado"</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%</span> nome</span>
<span id="cb1-16">ucs.definitionQuery <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">""</span></span>
<span id="cb1-17"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">del</span> mxd</span></code></pre></div></div>
<p>Para levar esse layout ao ArcGIS Pro, abra um projeto e use <strong>Inserir → Importar mapa</strong> com o <code>.mxd</code>.</p>
</div>
<div id="tabset-1-2" class="tab-pane" aria-labelledby="tabset-1-2-tab">
<p><strong>Sem código:</strong> no layout, <strong>Layout → Série de mapas → Espacial</strong>, camada de índice = UCs, campo de nome = <code>nome_uc</code>. No título, insira <strong>Texto dinâmico → Série de mapas → Nome da página</strong>. Depois, <strong>Compartilhar → Exportar layout</strong> e escolha “Todas as páginas” e “Um arquivo por página”.</p>
<p><strong>Com código</strong> (<code>arcpy.mp</code>), para quem quer controlar cada passo:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb2-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> arcpy</span>
<span id="cb2-2"></span>
<span id="cb2-3">projeto <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.mp.ArcGISProject(<span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\m</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">apas</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">aprx"</span>)</span>
<span id="cb2-4">layout <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> projeto.listLayouts(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Mapa por UC"</span>)[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]</span>
<span id="cb2-5">quadro <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> layout.listElements(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MAPFRAME_ELEMENT"</span>)[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]</span>
<span id="cb2-6">titulo <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> layout.listElements(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"TEXT_ELEMENT"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"titulo"</span>)[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]</span>
<span id="cb2-7">ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> quadro.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">map</span>.listLayers(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"UCs"</span>)[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]</span>
<span id="cb2-8"></span>
<span id="cb2-9"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> cnuc, nome <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> arcpy.da.SearchCursor(ucs, [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cnuc"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>]):</span>
<span id="cb2-10">    ucs.definitionQuery <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"cnuc = '</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>cnuc<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">'"</span></span>
<span id="cb2-11">    quadro.camera.setExtent(quadro.getLayerExtent(ucs, <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>, <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>))</span>
<span id="cb2-12">    quadro.camera.scale <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*=</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.1</span>                     <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 10% de margem</span></span>
<span id="cb2-13">    titulo.text <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> nome</span>
<span id="cb2-14">    layout.exportToPNG(<span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">rf"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\m</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">apas</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\m</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">apa_</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>cnuc<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">png"</span>, resolution<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">150</span>)</span>
<span id="cb2-15">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"Mapa de </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>nome<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> exportado"</span>)</span>
<span id="cb2-16">ucs.definitionQuery <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">""</span></span></code></pre></div></div>
<p>Se o layout já tem uma série de mapas configurada, a exportação é uma linha:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb3-1">layout.mapSeries.exportToPDF(<span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\m</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">apas</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\m</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">apas</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">pdf"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ALL"</span>, multiple_files<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"PDF_SINGLE_FILE"</span>)</span></code></pre></div></div>
</div>
<div id="tabset-1-3" class="tab-pane" aria-labelledby="tabset-1-3-tab">
<p><strong>Sem código:</strong> no layout de impressão, aba <strong>Atlas → Gerar um atlas</strong>, camada de cobertura = UCs, nome do arquivo = <code>'mapa_' || "cnuc"</code>. No item de mapa, marque <strong>Controlado pelo atlas</strong> com margem de 10%. No título, use <strong>Inserir expressão</strong> com <code>[% "nome_uc" %]</code>. Exporte com <strong>Atlas → Exportar atlas como imagens</strong>.</p>
<p><strong>Com código</strong> (console Python), o layout inteiro montado do zero, para rodar em qualquer computador:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb4-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> os</span>
<span id="cb4-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> qgis.core <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> (QgsProject, QgsVectorLayer, QgsPrintLayout, QgsLayoutItemMap,</span>
<span id="cb4-3">                       QgsLayoutItemLabel, QgsLayoutItemLegend, QgsLayoutItemScaleBar,</span>
<span id="cb4-4">                       QgsLayoutItemPicture, QgsLayoutPoint, QgsLayoutSize, QgsUnitTypes,</span>
<span id="cb4-5">                       QgsLayoutExporter, QgsCategorizedSymbolRenderer, QgsRendererCategory,</span>
<span id="cb4-6">                       QgsFillSymbol, QgsSingleSymbolRenderer, QgsCoordinateReferenceSystem,</span>
<span id="cb4-7">                       QgsCoordinateTransform, QgsRuleBasedRenderer)</span>
<span id="cb4-8"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> qgis.PyQt.QtGui <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> QFont</span>
<span id="cb4-9"></span>
<span id="cb4-10">G <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"C:/dados/artigos.gpkg"</span></span>
<span id="cb4-11">PASTA <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"C:/dados/mapas/"</span></span>
<span id="cb4-12">os.makedirs(PASTA, exist_ok<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb4-13">projeto <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> QgsProject.instance()</span>
<span id="cb4-14">MM <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> QgsUnitTypes.LayoutMillimeters</span>
<span id="cb4-15"></span>
<span id="cb4-16"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> poligono(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span>estilo):</span>
<span id="cb4-17">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> QgsFillSymbol.createSimple(estilo)</span>
<span id="cb4-18"></span>
<span id="cb4-19"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1. Camadas e estilos: UCs (comandam o atlas), entorno e alertas desde agosto de 2026</span></span>
<span id="cb4-20">ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> QgsVectorLayer(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>G<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">|layername=ucs"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Unidade de Conservação"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ogr"</span>)</span>
<span id="cb4-21">ucs.setSubsetString(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"regiao = 'Amazonia'"</span>)</span>
<span id="cb4-22">extensao_ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ucs.extent()</span>
<span id="cb4-23"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> regras(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>lista):</span>
<span id="cb4-24">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""Estilo por regras: (rótulo, expressão, símbolo). @atlas_feature é a UC da página."""</span></span>
<span id="cb4-25">    raiz <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> QgsRuleBasedRenderer.Rule(<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span>)</span>
<span id="cb4-26">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> rotulo, expressao, simbolo <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> lista:</span>
<span id="cb4-27">        raiz.appendChild(QgsRuleBasedRenderer.Rule(simbolo, filterExp<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>expressao, label<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>rotulo))</span>
<span id="cb4-28">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> QgsRuleBasedRenderer(raiz)</span>
<span id="cb4-29"></span>
<span id="cb4-30">ucs.setRenderer(regras(</span>
<span id="cb4-31">    (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"UC do mapa"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"@atlas_featureid = $id"</span>,</span>
<span id="cb4-32">     poligono(color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"229,236,220"</span>, outline_color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"0,0,0"</span>, outline_width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"0.8"</span>)),</span>
<span id="cb4-33">    (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Outras UCs"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"@atlas_featureid &lt;&gt; $id"</span>,</span>
<span id="cb4-34">     poligono(color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"242,242,242"</span>, outline_color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"150,150,150"</span>, outline_width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"0.3"</span>))))</span>
<span id="cb4-35">entorno <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> QgsVectorLayer(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>G<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">|layername=ucs_entorno"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Entorno"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ogr"</span>)</span>
<span id="cb4-36">entorno.setRenderer(regras(</span>
<span id="cb4-37">    (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Entorno de 3 km"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\"</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">cnuc</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\"</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;"> = attribute(@atlas_feature, 'cnuc')"</span>,</span>
<span id="cb4-38">     poligono(color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"240,228,66,140"</span>, outline_style<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"no"</span>))))</span>
<span id="cb4-39">alertas <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> QgsVectorLayer(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>G<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">|layername=deter"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Alertas DETER"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ogr"</span>)</span>
<span id="cb4-40">alertas.setSubsetString(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date &gt;= '2026-08-01'"</span>)</span>
<span id="cb4-41">classes <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"DESMATAMENTO_CR"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"213,94,0"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Desmatamento (corte raso)"</span>),</span>
<span id="cb4-42">           (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MINERACAO"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"204,121,167"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Mineração"</span>),</span>
<span id="cb4-43">           (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"DEGRADACAO"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"230,159,0"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Degradação"</span>),</span>
<span id="cb4-44">           (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"CICATRIZ_DE_QUEIMADA"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"86,180,233"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Cicatriz de queimada"</span>)]</span>
<span id="cb4-45">categorias <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [QgsRendererCategory(valor, poligono(color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>cor, outline_color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>cor,</span>
<span id="cb4-46">                                                  outline_width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"0.15"</span>), rotulo)</span>
<span id="cb4-47">              <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> valor, cor, rotulo <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> classes]</span>
<span id="cb4-48">categorias.append(QgsRendererCategory(<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span>, poligono(color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"120,120,120"</span>, outline_style<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"no"</span>),</span>
<span id="cb4-49">                                      <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Outras classes"</span>))</span>
<span id="cb4-50">alertas.setRenderer(QgsCategorizedSymbolRenderer(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"classname"</span>, categorias))</span>
<span id="cb4-51">projeto.addMapLayers([ucs, entorno, alertas])</span>
<span id="cb4-52"></span>
<span id="cb4-53"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2. Layout A4 deitado (cada item é adicionado e depois posicionado, em milímetros)</span></span>
<span id="cb4-54">layout <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> QgsPrintLayout(projeto)</span>
<span id="cb4-55">layout.initializeDefaults()</span>
<span id="cb4-56"></span>
<span id="cb4-57"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> colocar(item, x, y, largura<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span>, altura<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span>):</span>
<span id="cb4-58">    layout.addLayoutItem(item)</span>
<span id="cb4-59">    item.attemptMove(QgsLayoutPoint(x, y, MM))</span>
<span id="cb4-60">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> largura:</span>
<span id="cb4-61">        item.attemptResize(QgsLayoutSize(largura, altura, MM))</span>
<span id="cb4-62">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> item</span>
<span id="cb4-63"></span>
<span id="cb4-64">mapa <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> QgsLayoutItemMap(layout)</span>
<span id="cb4-65">crs_mapa <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> QgsCoordinateReferenceSystem(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"EPSG:5880"</span>)       <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># em metros: escala correta</span></span>
<span id="cb4-66">mapa.setCrs(crs_mapa)</span>
<span id="cb4-67">mapa.setLayers([alertas, entorno, ucs])</span>
<span id="cb4-68">mapa.setFrameEnabled(<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb4-69">colocar(mapa, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">22</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">200</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">180</span>)</span>
<span id="cb4-70"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Extensão inicial: sem ela, o atlas estica o quadro do mapa na primeira página</span></span>
<span id="cb4-71">para_metros <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> QgsCoordinateTransform(ucs.crs(), crs_mapa, projeto)</span>
<span id="cb4-72">mapa.zoomToExtent(para_metros.transformBoundingBox(extensao_ucs))</span>
<span id="cb4-73"></span>
<span id="cb4-74">titulo <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> QgsLayoutItemLabel(layout)</span>
<span id="cb4-75">titulo.setText(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'[% "nome_uc" %]'</span>)                            <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># muda a cada página</span></span>
<span id="cb4-76">titulo.setFont(QFont(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"DejaVu Sans"</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">16</span>, QFont.Weight.Bold))</span>
<span id="cb4-77">colocar(titulo, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">280</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span>)</span>
<span id="cb4-78"></span>
<span id="cb4-79">legenda <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> QgsLayoutItemLegend(layout)</span>
<span id="cb4-80">legenda.setLinkedMap(mapa)</span>
<span id="cb4-81">legenda.setTitle(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Legenda"</span>)</span>
<span id="cb4-82">colocar(legenda, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">214</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">22</span>)</span>
<span id="cb4-83"></span>
<span id="cb4-84">norte <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> QgsLayoutItemPicture(layout)</span>
<span id="cb4-85">norte.setPicturePath(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">":/images/north_arrows/layout_default_north_arrow.svg"</span>)</span>
<span id="cb4-86">colocar(norte, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">270</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">138</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">15</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">15</span>)</span>
<span id="cb4-87">norte.setLinkedMap(mapa)</span>
<span id="cb4-88"></span>
<span id="cb4-89">escala <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> QgsLayoutItemScaleBar(layout)</span>
<span id="cb4-90">escala.setLinkedMap(mapa)</span>
<span id="cb4-91">escala.setStyle(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Single Box"</span>)</span>
<span id="cb4-92">escala.setUnits(QgsUnitTypes.DistanceKilometers)</span>
<span id="cb4-93">escala.setUnitLabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"km"</span>)</span>
<span id="cb4-94">escala.setNumberOfSegments(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>)</span>
<span id="cb4-95">escala.setNumberOfSegmentsLeft(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb4-96">escala.setUnitsPerSegment(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>)</span>
<span id="cb4-97">colocar(escala, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">214</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">165</span>)</span>
<span id="cb4-98"></span>
<span id="cb4-99">fonte <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> QgsLayoutItemLabel(layout)</span>
<span id="cb4-100">fonte.setText(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Alertas DETER desde 01/08/2026.</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\n</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">Fontes: INPE/TerraBrasilis, MMA (CNUC).</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\n</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span></span>
<span id="cb4-101">              <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SIRGAS 2000 / Brazil Polyconic (EPSG:5880)."</span>)</span>
<span id="cb4-102">colocar(fonte, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">214</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">182</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">80</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>)</span>
<span id="cb4-103"></span>
<span id="cb4-104"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 3. Atlas: uma página por UC, mapa centrado na UC com 10% de margem</span></span>
<span id="cb4-105">atlas <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> layout.atlas()</span>
<span id="cb4-106">atlas.setCoverageLayer(ucs)</span>
<span id="cb4-107">atlas.setEnabled(<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb4-108">atlas.setFilenameExpression(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"'mapa_' || </span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\"</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">cnuc</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\"</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb4-109">mapa.setAtlasDriven(<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb4-110">mapa.setAtlasScalingMode(QgsLayoutItemMap.Auto)</span>
<span id="cb4-111">mapa.setAtlasMargin(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.10</span>)</span>
<span id="cb4-112"></span>
<span id="cb4-113"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 4. Uma imagem PNG por UC</span></span>
<span id="cb4-114">config <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> QgsLayoutExporter.ImageExportSettings()</span>
<span id="cb4-115">config.dpi <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">150</span></span>
<span id="cb4-116">config.generateWorldFile <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span></span>
<span id="cb4-117">config.exportMetadata <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span></span>
<span id="cb4-118">resultado, erro <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> QgsLayoutExporter.exportToImage(atlas, PASTA <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mapa.png"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"png"</span>, config)</span>
<span id="cb4-119"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"exportação:"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ok"</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> resultado <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> QgsLayoutExporter.Success <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span> erro)</span>
<span id="cb4-120"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sorted</span>(os.listdir(PASTA)))</span></code></pre></div></div>
<p>Os dois truques que fazem o atlas parecer feito à mão estão no estilo por regras:</p>
<ul>
<li><code>@atlas_featureid = $id</code> destaca <strong>a UC da página</strong> e deixa as vizinhas em cinza;</li>
<li><code>"cnuc" = attribute(@atlas_feature, 'cnuc')</code> mostra <strong>só o entorno</strong> da UC da página.</li>
</ul>
</div>
<div id="tabset-1-4" class="tab-pane" aria-labelledby="tabset-1-4-tab">
<p>O PostGIS <strong>não desenha mapas</strong>, mas pode entregar as camadas prontas para o QGIS ou o ArcGIS Pro. Uma view com os alertas recentes de cada UC deixa o projeto de mapas leve e sempre atualizado:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode sql code-with-copy"><code class="sourceCode sql"><span id="cb5-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">CREATE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">OR</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">REPLACE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">VIEW</span> artigos.mapa_alertas_recentes <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span></span>
<span id="cb5-2"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> d.gid, d.classname, d.view_date, z.cnuc, z.nome_uc, z.<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">local</span>, z.geom</span>
<span id="cb5-3"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.deter_interior_entorno z</span>
<span id="cb5-4"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">JOIN</span> artigos.deter d <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">USING</span> (gid)</span>
<span id="cb5-5"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> d.view_date <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">current_date</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">90</span>;</span></code></pre></div></div>
<p>No QGIS, conecte-se ao banco (<strong>Navegador → PostgreSQL → Nova conexão</strong>), arraste a view para o mapa e use o atlas da aba QGIS. A cada atualização do banco, o atlas já sai com os dados novos.</p>
</div>
<div id="tabset-1-5" class="tab-pane" aria-labelledby="tabset-1-5-tab">
<p>Sem programa de SIG nenhum: um laço que desenha e salva um PNG por UC.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb6-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> os</span>
<span id="cb6-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> geopandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> gpd</span>
<span id="cb6-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> matplotlib</span>
<span id="cb6-4">matplotlib.use(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Agg"</span>)</span>
<span id="cb6-5"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> matplotlib.pyplot <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> plt</span>
<span id="cb6-6"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> matplotlib.patches <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> Patch</span>
<span id="cb6-7"></span>
<span id="cb6-8">G <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dados/artigos.gpkg"</span></span>
<span id="cb6-9">os.makedirs(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dados/mapas_py"</span>, exist_ok<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb6-10">ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.read_file(G, layer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ucs"</span>).query(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"regiao == 'Amazonia'"</span>).to_crs(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5880</span>)</span>
<span id="cb6-11">entorno <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.read_file(G, layer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ucs_entorno"</span>).to_crs(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5880</span>)</span>
<span id="cb6-12">alertas <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.read_file(G, layer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"deter"</span>).to_crs(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5880</span>)</span>
<span id="cb6-13">alertas <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> alertas[alertas[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>].astype(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"2026-08-01"</span>]</span>
<span id="cb6-14"></span>
<span id="cb6-15">CORES <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> {<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"DESMATAMENTO_CR"</span>: (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#D55E00"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Desmatamento (corte raso)"</span>),</span>
<span id="cb6-16">         <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MINERACAO"</span>: (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#CC79A7"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Mineração"</span>), <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"DEGRADACAO"</span>: (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#E69F00"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Degradação"</span>),</span>
<span id="cb6-17">         <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"CICATRIZ_DE_QUEIMADA"</span>: (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#56B4E9"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Cicatriz de queimada"</span>)}</span>
<span id="cb6-18">alertas[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cor"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> alertas[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"classname"</span>].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">map</span>(<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> c: CORES.get(c, (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#787878"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">""</span>))[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>])</span>
<span id="cb6-19"></span>
<span id="cb6-20"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> _, uc <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> ucs.iterrows():</span>
<span id="cb6-21">    fig, ax <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> plt.subplots(figsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">11.7</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">8.3</span>))                    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># A4 deitado</span></span>
<span id="cb6-22">    xmin, ymin, xmax, ymax <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> uc.geometry.bounds</span>
<span id="cb6-23">    m <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.10</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">max</span>(xmax <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> xmin, ymax <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> ymin)                       <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 10% de margem</span></span>
<span id="cb6-24">    ax.set_xlim(xmin <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> m, xmax <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> m)</span>
<span id="cb6-25">    ax.set_ylim(ymin <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> m, ymax <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> m)</span>
<span id="cb6-26"></span>
<span id="cb6-27">    ucs.plot(ax<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ax, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#f2f2f2"</span>, edgecolor<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#969696"</span>, linewidth<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.4</span>)</span>
<span id="cb6-28">    entorno[entorno[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cnuc"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> uc[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cnuc"</span>]].plot(ax<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ax, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#F0E442"</span>, alpha<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.55</span>)</span>
<span id="cb6-29">    ucs[ucs[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cnuc"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> uc[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cnuc"</span>]].plot(ax<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ax, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#e5ecdc"</span>, edgecolor<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"black"</span>, linewidth<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.2</span>)</span>
<span id="cb6-30">    alertas.plot(ax<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ax, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alertas[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cor"</span>], linewidth<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb6-31"></span>
<span id="cb6-32">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Escala de 20 km, norte, legenda, título e fonte</span></span>
<span id="cb6-33">    x0, y0 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ax.get_xlim()[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> m <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.4</span>, ax.get_ylim()[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> m <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.4</span></span>
<span id="cb6-34">    ax.plot([x0, x0 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20_000</span>], [y0, y0], color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"black"</span>, linewidth<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>)</span>
<span id="cb6-35">    ax.text(x0 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10_000</span>, y0 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> m <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.12</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"20 km"</span>, ha<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"center"</span>, fontsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">9</span>)</span>
<span id="cb6-36">    ax.annotate(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"N"</span>, xy<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.95</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.95</span>), xytext<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.95</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.86</span>), xycoords<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"axes fraction"</span>,</span>
<span id="cb6-37">                ha<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"center"</span>, fontsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span>, fontweight<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bold"</span>,</span>
<span id="cb6-38">                arrowprops<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(facecolor<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"black"</span>, width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>, headwidth<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span>))</span>
<span id="cb6-39">    itens <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [Patch(facecolor<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#e5ecdc"</span>, edgecolor<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"black"</span>, label<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"UC do mapa"</span>),</span>
<span id="cb6-40">             Patch(facecolor<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#F0E442"</span>, alpha<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.55</span>, label<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Entorno de 3 km"</span>)]</span>
<span id="cb6-41">    itens <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+=</span> [Patch(color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>cor, label<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>rotulo) <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> cor, rotulo <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> CORES.values()]</span>
<span id="cb6-42">    ax.legend(handles<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>itens, loc<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"upper left"</span>, fontsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">9</span>, framealpha<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.9</span>)</span>
<span id="cb6-43">    ax.set_title(uc[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>], fontsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">15</span>, fontweight<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bold"</span>, loc<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"left"</span>)</span>
<span id="cb6-44">    ax.set_axis_off()</span>
<span id="cb6-45">    fig.text(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.01</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.01</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Alertas DETER desde 01/08/2026. Fontes: INPE/TerraBrasilis, "</span></span>
<span id="cb6-46">             <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MMA (CNUC). SIRGAS 2000 / Brazil Polyconic (EPSG:5880)."</span>, fontsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>)</span>
<span id="cb6-47">    fig.savefig(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"dados/mapas_py/mapa_</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>uc[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'cnuc'</span>]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">.png"</span>, dpi<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">150</span>, bbox_inches<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tight"</span>)</span>
<span id="cb6-48">    plt.close(fig)</span>
<span id="cb6-49">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Mapa de"</span>, uc[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>], <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"exportado"</span>)</span></code></pre></div></div>
</div>
</div>
</div>
</section>
<section id="conferindo-o-resultado" class="level2">
<h2 class="anchored" data-anchor-id="conferindo-o-resultado">Conferindo o resultado</h2>
<p>O Atlas do QGIS e o laço do Python geraram os <strong>7 mapas</strong> do recorte, um por UC, em poucos segundos. As versões do ArcMap e do ArcGIS Pro seguem a mesma lógica, mas não foram testadas aqui (precisam de licença).</p>
</section>
<section id="armadilhas" class="level2">
<h2 class="anchored" data-anchor-id="armadilhas">Armadilhas</h2>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Aviso</span>Mapa em graus, escala errada
</div>
</div>
<div class="callout-body-container callout-body">
<p>Um mapa em SIRGAS 2000 geográfico (graus) tem a barra de escala distorcida, e as UCs ficam “achatadas” na vertical. Ponha o <strong>quadro do mapa</strong> numa projeção em metros (aqui, EPSG:5880), mesmo que os dados continuem em graus.</p>
</div>
</div>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Aviso</span>Atlas que estica o quadro do mapa (QGIS, pelo código)
</div>
</div>
<div class="callout-body-container callout-body">
<p>Montando o layout pelo Python, se o mapa começar sem extensão, a primeira página do atlas <strong>muda o tamanho do quadro</strong> e ele passa da folha. Dê uma extensão inicial ao mapa (<code>zoomToExtent</code>) antes de ligar o atlas, como no código acima.</p>
</div>
</div>
<div class="callout callout-style-default callout-tip callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Dica</span>Nome do arquivo
</div>
</div>
<div class="callout-body-container callout-body">
<p>Use o código da UC (<code>mapa_0000.00.0267.png</code>), não o nome. Acentos, espaços e barras no nome do arquivo quebram scripts e links, principalmente entre Windows e Linux.</p>
</div>
</div>
</section>
<section id="veja-também" class="level2">
<h2 class="anchored" data-anchor-id="veja-também">Veja também</h2>
<ul>
<li><a href="../artigos/11-relatorio-pdf.html">Relatório automático em PDF</a>, que junta mapa, tabela e texto</li>
<li><a href="../tutoriais/mapas-preto-e-branco.html">Mapas acadêmicos em preto e branco no R</a>, sobre os elementos de um bom mapa</li>
</ul>
<div class="navegacao-livro">
<p><a href="../artigos/09-densidade-kernel.html" class="anterior"><span class="direcao">← Anterior</span> Densidade Kernel do desmatamento: onde a pressão está concentrada</a> <a href="../artigos/11-relatorio-pdf.html" class="proximo"><span class="direcao">Próximo →</span> Relatório automático em PDF: o boletim que se escreve sozinho</a></p>
</div>
</section>
<section id="atualizações" class="level2 unnumbered">
<h2 class="unnumbered anchored" data-anchor-id="atualizações">Atualizações</h2>
<ul>
<li><strong>29/10/2026:</strong> publicação, com dados do INPE, do MMA, do IBAMA e do SICAR de outubro de 2026.</li>
</ul>
<p><a href="https://hendesson.github.io/en/articles/10-automated-maps.html">English version</a></p>


</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> De volta ao topo</a><div id="quarto-appendix" class="default"><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Licença</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/deed.pt_br">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Como citar</h2><div><div class="quarto-appendix-secondary-label">BibTeX</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@misc{alves2026,
  author = {Alves, Hendesson},
  publisher = {Hendesson Alves},
  title = {Um mapa por UC, automático: do ArcMap ao QGIS e ao Python},
  date = {2026-10-29},
  url = {https://hendesson.github.io/artigos/10-mapas-automaticos.html},
  doi = {10.5281/zenodo.23780264},
  langid = {pt-BR},
  abstract = {Um mapa por Unidade de Conservação, gerado sem cliques: o
    arcpy.mapping do ArcMap, o arcpy.mp e as séries de mapas do ArcGIS
    Pro, o Atlas do QGIS montado por código e um laço com matplotlib.}
}
</code></pre><div class="quarto-appendix-secondary-label">Por favor, cite este trabalho como:</div><div id="ref-alves2026" class="csl-entry quarto-appendix-citeas">
Alves, Hendesson. 2026. <span>“Um mapa por UC, automático: do ArcMap ao
QGIS e ao Python.”</span> In <em>Artigos de geoprocessamento para
monitoramento ambiental</em>. Preprint, Hendesson Alves, October 29. <a href="https://doi.org/10.5281/zenodo.23780264">https://doi.org/10.5281/zenodo.23780264</a>.
</div></div></section></div> ]]></description>
  <category>Mapas</category>
  <category>ArcMap</category>
  <guid>https://hendesson.github.io/artigos/10-mapas-automaticos.html</guid>
  <pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate>
  <media:content url="https://hendesson.github.io/imagens/artigos/mapa_atlas.png" medium="image" type="image/png" height="102" width="144"/>
</item>
<item>
  <title>Relatório automático em PDF: o boletim que se escreve sozinho</title>
  <dc:creator>Hendesson Alves</dc:creator>
  <link>https://hendesson.github.io/artigos/11-relatorio-pdf.html</link>
  <description><![CDATA[ 





<div class="ficha">
<p><span class="rotulo">Nível</span> Intermediário <span class="rotulo">Leitura</span> 10 min <span class="rotulo">Dados</span> outubro de 2026 <span class="rotulo">Programas</span> <span class="selo-texto">ArcGIS</span> <img src="https://hendesson.github.io/imagens/ferramentas/qgis.svg" class="img-fluid" alt="QGIS"> <img src="https://hendesson.github.io/imagens/ferramentas/python.svg" class="img-fluid" alt="Python"></p>
</div>
<p>Os scripts mais longos da minha pasta não faziam análise espacial: montavam uma <strong>nota informativa</strong> em PDF, com logotipos, legenda, uma tabela por UC e o texto de cada ocorrência. Eram 1.500 linhas de <code>fpdf</code>, e qualquer mudança de layout dava trabalho.</p>
<p>Aqui está o mesmo tipo de produto, um <strong>boletim de desmatamento por UC</strong> com dados públicos, em quatro caminhos. O mais curto para manter costuma ser o <strong>Quarto</strong>: o layout fica num arquivo de texto e o script só troca a UC.</p>
<div class="grid">
<div class="g-col-12 g-col-md-6">
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://hendesson.github.io/imagens/artigos/boletim.png" class="img-fluid figure-img" alt="Página A4 com faixa azul no topo com o título Boletim de desmatamento em Unidades de Conservação, um parágrafo com o período, uma tabela com cinco UCs e um gráfico de barras com a área no interior e no entorno."></p>
<figcaption>Primeira página do boletim gerado com fpdf2.</figcaption>
</figure>
</div>
</div>
<div class="g-col-12 g-col-md-6">
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://hendesson.github.io/imagens/artigos/boletim_quarto.png" class="img-fluid figure-img" alt="Página A4 com o nome da Área de Proteção Ambiental do Tapajós, uma frase com a área desmatada no interior e no entorno, o mapa da UC e uma tabela com alertas por local e classe."></p>
<figcaption>Página do boletim gerado pelo Quarto para a APA do Tapajós.</figcaption>
</figure>
</div>
</div>
</div>
<section id="o-que-vai-no-boletim" class="level2">
<h2 class="anchored" data-anchor-id="o-que-vai-no-boletim">O que vai no boletim</h2>
<ol type="1">
<li><strong>Período</strong> e fonte, calculados a partir dos próprios dados (nunca digitados).</li>
<li><strong>Tabela resumo</strong>: área de alertas no interior e no entorno de cada UC.</li>
<li><strong>Gráfico</strong> da tabela.</li>
<li><strong>Uma página por UC</strong>, com o mapa do <a href="../artigos/10-mapas-automaticos.html">artigo anterior</a>.</li>
</ol>
<p>Os dados vêm da camada <code>deter_interior_entorno</code> (artigo <a href="../artigos/02-interior-entorno.html">Interior e entorno</a>): alertas de desmatamento (corte raso, com vegetação e mineração) dos últimos 90 dias.</p>
</section>
<section id="o-código" class="level2">
<h2 class="anchored" data-anchor-id="o-código">O código</h2>
<div class="tabset-margin-container"></div><div class="panel-tabset" data-group="programa">
<ul class="nav nav-tabs"><li class="nav-item"><a class="nav-link active" id="tabset-1-1-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-1" aria-controls="tabset-1-1" aria-selected="true" href="">ArcGIS Pro</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-2-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-2" aria-controls="tabset-1-2" aria-selected="false" href="">QGIS</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-3-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-3" aria-controls="tabset-1-3" aria-selected="false" href="">PostGIS</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-4-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-4" aria-controls="tabset-1-4" aria-selected="false" href="">Python</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-5-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-5" aria-controls="tabset-1-5" aria-selected="false" href="">Quarto</a></li></ul>
<div class="tab-content" data-group="programa">
<div id="tabset-1-1" class="tab-pane active" aria-labelledby="tabset-1-1-tab">
<p>O ArcGIS Pro tem <strong>Relatórios</strong> (Inserir → Relatório), que fazem a tabela por UC com cabeçalho e rodapé, e <strong>Séries de mapas</strong> no layout. O script junta os dois num PDF:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> arcpy</span>
<span id="cb1-2"></span>
<span id="cb1-3">projeto <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.mp.ArcGISProject(<span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\b</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">oletim</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">aprx"</span>)</span>
<span id="cb1-4"></span>
<span id="cb1-5"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Tabela por UC (relatório criado em Inserir → Relatório, agrupado por nome_uc)</span></span>
<span id="cb1-6">relatorio <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> projeto.listReports(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Alertas por UC"</span>)[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]</span>
<span id="cb1-7">relatorio.exportToPDF(<span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\s</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">aida</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\t</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">abela</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">pdf"</span>)</span>
<span id="cb1-8"></span>
<span id="cb1-9"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Um mapa por UC (layout com série de mapas configurada)</span></span>
<span id="cb1-10">layout <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> projeto.listLayouts(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Mapa por UC"</span>)[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]</span>
<span id="cb1-11">layout.mapSeries.exportToPDF(<span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\s</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">aida</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\m</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">apas</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">pdf"</span>)</span>
<span id="cb1-12"></span>
<span id="cb1-13"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Juntar tudo num arquivo só</span></span>
<span id="cb1-14">boletim <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.mp.PDFDocumentCreate(<span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\s</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">aida</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\b</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">oletim</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">pdf"</span>)</span>
<span id="cb1-15">boletim.appendPages(<span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\s</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">aida</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\t</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">abela</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">pdf"</span>)</span>
<span id="cb1-16">boletim.appendPages(<span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\s</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">aida</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\m</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">apas</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">pdf"</span>)</span>
<span id="cb1-17">boletim.saveAndClose()</span></code></pre></div></div>
<p>O <code>fpdf2</code> da aba Python também roda no ArcGIS Pro: no <strong>Gerenciador de pacotes</strong>, clone o ambiente padrão, ative o clone e instale <code>fpdf2</code>. Foi assim que os scripts originais funcionavam.</p>
</div>
<div id="tabset-1-2" class="tab-pane" aria-labelledby="tabset-1-2-tab">
<p>O Atlas do QGIS exporta <strong>um PDF com uma página por UC</strong>. Basta acrescentar ao layout do <a href="../artigos/10-mapas-automaticos.html">artigo anterior</a> uma <strong>tabela de atributos</strong> filtrada pela UC da página. Rode este trecho <strong>depois</strong> do código daquele artigo:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb2-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Continua o código do artigo anterior (layout, atlas e camadas já criados)</span></span>
<span id="cb2-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> qgis.core <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> QgsLayoutItemAttributeTable, QgsLayoutFrame, QgsLayoutItemPage</span>
<span id="cb2-3"></span>
<span id="cb2-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Diminui o mapa para abrir espaço para a tabela embaixo, em retrato</span></span>
<span id="cb2-5">layout.pageCollection().page(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>).setPageSize(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"A4"</span>, QgsLayoutItemPage.Portrait)</span>
<span id="cb2-6">mapa.attemptResize(QgsLayoutSize(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">194</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">150</span>, MM))</span>
<span id="cb2-7">mapa.zoomToExtent(para_metros.transformBoundingBox(extensao_ucs))</span>
<span id="cb2-8">legenda.setColumnCount(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>)</span>
<span id="cb2-9"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> item, (x, y) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> [(legenda, (<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">176</span>)), (norte, (<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">188</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">25</span>)), (escala, (<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">145</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">178</span>)),</span>
<span id="cb2-10">                     (fonte, (<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">145</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">192</span>))]:</span>
<span id="cb2-11">    item.attemptMove(QgsLayoutPoint(x, y, MM))</span>
<span id="cb2-12">norte.attemptResize(QgsLayoutSize(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">11</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">11</span>, MM))</span>
<span id="cb2-13">fonte.attemptResize(QgsLayoutSize(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">57</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>, MM))</span>
<span id="cb2-14"></span>
<span id="cb2-15"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Tabela com os alertas da UC da página (filtro pela feição do atlas)</span></span>
<span id="cb2-16">tabela <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> QgsLayoutItemAttributeTable.create(layout)</span>
<span id="cb2-17">layout.addMultiFrame(tabela)                 <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># o layout passa a ser o dono da tabela</span></span>
<span id="cb2-18">tabela.setVectorLayer(alertas)</span>
<span id="cb2-19">tabela.setFilterFeatures(<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb2-20">tabela.setFeatureFilter(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'intersects($geometry, @atlas_geometry)'</span>)</span>
<span id="cb2-21">tabela.setMaximumNumberOfFeatures(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>)</span>
<span id="cb2-22">tabela.setDisplayedFields([<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"classname"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"municipality"</span>])</span>
<span id="cb2-23">quadro_tabela <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> QgsLayoutFrame(layout, tabela)</span>
<span id="cb2-24">tabela.addFrame(quadro_tabela)</span>
<span id="cb2-25">quadro_tabela.attemptMove(QgsLayoutPoint(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">230</span>, MM))</span>
<span id="cb2-26">quadro_tabela.attemptResize(QgsLayoutSize(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">194</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">58</span>, MM))</span>
<span id="cb2-27"></span>
<span id="cb2-28"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Um PDF só, com uma página por UC</span></span>
<span id="cb2-29">config_pdf <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> QgsLayoutExporter.PdfExportSettings()</span>
<span id="cb2-30">resultado, erro <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> QgsLayoutExporter.exportToPdf(atlas, PASTA <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"boletim_qgis.pdf"</span>, config_pdf)</span>
<span id="cb2-31"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"PDF:"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ok"</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> resultado <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> QgsLayoutExporter.Success <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span> erro)</span></code></pre></div></div>
<p>O filtro <code>intersects($geometry, @atlas_geometry)</code> faz a tabela mostrar só os alertas da UC da página. Sem código, o mesmo filtro fica em <strong>Propriedades do item → Filtrar com</strong>.</p>
</div>
<div id="tabset-1-3" class="tab-pane" aria-labelledby="tabset-1-3-tab">
<p>O banco entrega a tabela pronta para qualquer gerador de relatório (Quarto, Power BI, ArcGIS Pro):</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode sql code-with-copy"><code class="sourceCode sql"><span id="cb3-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">CREATE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">OR</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">REPLACE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">VIEW</span> artigos.boletim_90_dias <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span></span>
<span id="cb3-2"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WITH</span> periodo <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">max</span>(view_date) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> fim <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.deter_interior_entorno)</span>
<span id="cb3-3"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> nome_uc,</span>
<span id="cb3-4">       <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">count</span>(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FILTER</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">local</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'interior'</span>)                 <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> alertas_interior,</span>
<span id="cb3-5">       <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">round</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sum</span>(area_ha) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FILTER</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">local</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'interior'</span>), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)   <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> interior_ha,</span>
<span id="cb3-6">       <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">round</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sum</span>(area_ha) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FILTER</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">local</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'entorno'</span>), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> entorno_ha,</span>
<span id="cb3-7">       <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">min</span>(p.fim) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">90</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> inicio, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">min</span>(p.fim) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> fim</span>
<span id="cb3-8"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.deter_interior_entorno, periodo p</span>
<span id="cb3-9"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> classname <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">IN</span> (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'DESMATAMENTO_CR'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'DESMATAMENTO_VEG'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'MINERACAO'</span>)</span>
<span id="cb3-10">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AND</span> view_date <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> p.fim <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">90</span></span>
<span id="cb3-11"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">GROUP</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BY</span> nome_uc</span>
<span id="cb3-12"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ORDER</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BY</span> interior_ha <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">DESC</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">NULLS</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">LAST</span>;</span>
<span id="cb3-13"></span>
<span id="cb3-14"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.boletim_90_dias;</span></code></pre></div></div>
</div>
<div id="tabset-1-4" class="tab-pane" aria-labelledby="tabset-1-4-tab">
<p>Com o <strong>fpdf2</strong> (<code>pip install fpdf2</code>), o mesmo pacote dos scripts originais:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb4-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> datetime <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> date</span>
<span id="cb4-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> geopandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> gpd</span>
<span id="cb4-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> pd</span>
<span id="cb4-4"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> matplotlib</span>
<span id="cb4-5">matplotlib.use(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Agg"</span>)</span>
<span id="cb4-6"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> matplotlib.pyplot <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> plt</span>
<span id="cb4-7"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> fpdf <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> FPDF</span>
<span id="cb4-8"></span>
<span id="cb4-9">CLASSES <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"DESMATAMENTO_CR"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"DESMATAMENTO_VEG"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MINERACAO"</span>]</span>
<span id="cb4-10"></span>
<span id="cb4-11"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> nome(texto):</span>
<span id="cb4-12">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""FLORESTA NACIONAL DO JAMANXIM -&gt; Floresta Nacional do Jamanxim"""</span></span>
<span id="cb4-13">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">" "</span>.join(p <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> p <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"de"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"do"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"da"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dos"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"das"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"e"</span>) <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span> p.capitalize()</span>
<span id="cb4-14">                    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> p <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> texto.lower().split())</span>
<span id="cb4-15"></span>
<span id="cb4-16"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1. Dados: alertas de desmatamento dos últimos 90 dias, por UC e local</span></span>
<span id="cb4-17">d <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.read_file(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dados/deter_interior_entorno.gpkg"</span>)</span>
<span id="cb4-18">d[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.to_datetime(d[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>])</span>
<span id="cb4-19">fim <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> d[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">max</span>()</span>
<span id="cb4-20">inicio <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> fim <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> pd.Timedelta(days<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">90</span>)</span>
<span id="cb4-21">d <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> d[d[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"classname"</span>].isin(CLASSES) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> (d[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> inicio)]</span>
<span id="cb4-22">tabela <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (d.pivot_table(index<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>, columns<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"local"</span>, values<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>,</span>
<span id="cb4-23">                        aggfunc<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"sum"</span>, fill_value<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb4-24">          .reindex(columns<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"interior"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"entorno"</span>], fill_value<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb4-25">          .sort_values(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"interior"</span>, ascending<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>))</span>
<span id="cb4-26">alertas <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> d[d[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"local"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"interior"</span>].groupby(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>).size()</span>
<span id="cb4-27"></span>
<span id="cb4-28"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2. Gráfico para o relatório</span></span>
<span id="cb4-29">fig, ax <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> plt.subplots(figsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">3.2</span>))</span>
<span id="cb4-30">tabela[::<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>].rename(index<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>nome).plot.barh(ax<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ax, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#009E73"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#E69F00"</span>], width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.75</span>)</span>
<span id="cb4-31">ax.set_xlabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Área de alertas (ha)"</span>)</span>
<span id="cb4-32">ax.set_ylabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">""</span>)</span>
<span id="cb4-33">ax.legend([<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Interior"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Entorno de 3 km"</span>], frameon<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb4-34">ax.spines[[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"top"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"right"</span>]].set_visible(<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb4-35">fig.tight_layout()</span>
<span id="cb4-36">fig.savefig(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dados/boletim_grafico.png"</span>, dpi<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">200</span>)</span>
<span id="cb4-37"></span>
<span id="cb4-38"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 3. O PDF: cabeçalho e rodapé em todas as páginas</span></span>
<span id="cb4-39"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">class</span> Boletim(FPDF):</span>
<span id="cb4-40">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> header(<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">self</span>):</span>
<span id="cb4-41">        <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">self</span>.set_fill_color(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">114</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">178</span>)</span>
<span id="cb4-42">        <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">self</span>.set_text_color(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">255</span>)</span>
<span id="cb4-43">        <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">self</span>.set_font(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Helvetica"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"B"</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">13</span>)</span>
<span id="cb4-44">        <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">self</span>.cell(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"  Boletim de desmatamento em Unidades de Conservação"</span>,</span>
<span id="cb4-45">                  fill<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>, new_x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"LMARGIN"</span>, new_y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"NEXT"</span>)</span>
<span id="cb4-46">        <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">self</span>.set_text_color(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb4-47">        <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">self</span>.ln(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>)</span>
<span id="cb4-48"></span>
<span id="cb4-49">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> footer(<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">self</span>):</span>
<span id="cb4-50">        <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">self</span>.set_y(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span>)</span>
<span id="cb4-51">        <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">self</span>.set_font(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Helvetica"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">""</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>)</span>
<span id="cb4-52">        <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">self</span>.cell(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>, <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"Fontes: INPE (DETER), MMA (CNUC). Gerado em "</span></span>
<span id="cb4-53">                        <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>date<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>today()<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%</span>d<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/%</span>m<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/%</span>Y<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">."</span>, align<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"L"</span>)</span>
<span id="cb4-54">        <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">self</span>.cell(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>, <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"Página </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">self</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>page_no()<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, align<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"R"</span>)</span>
<span id="cb4-55"></span>
<span id="cb4-56">pdf <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> Boletim(orientation<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"P"</span>, unit<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mm"</span>, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">format</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"A4"</span>)</span>
<span id="cb4-57">pdf.set_auto_page_break(auto<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>, margin<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">15</span>)</span>
<span id="cb4-58">pdf.add_page()</span>
<span id="cb4-59"></span>
<span id="cb4-60"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 4. Resumo, tabela e gráfico</span></span>
<span id="cb4-61">pdf.set_font(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Helvetica"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">""</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">11</span>)</span>
<span id="cb4-62">pdf.multi_cell(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>, <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"Alertas de desmatamento (corte raso, com vegetação e mineração) do DETER "</span></span>
<span id="cb4-63">                     <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"entre </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>inicio<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%</span>d<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/%</span>m<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/%</span>Y<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> e </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>fim<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%</span>d<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/%</span>m<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/%</span>Y<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">, no interior das UCs e na faixa "</span></span>
<span id="cb4-64">                     <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"de 3 km em volta."</span>)</span>
<span id="cb4-65">pdf.ln(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>)</span>
<span id="cb4-66">pdf.set_font(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Helvetica"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">""</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">9</span>)</span>
<span id="cb4-67"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">with</span> pdf.table(col_widths<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">90</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">25</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">35</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">35</span>), text_align<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"LEFT"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"RIGHT"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"RIGHT"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"RIGHT"</span>)) <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> t:</span>
<span id="cb4-68">    t.row([<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Unidade de Conservação"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Alertas"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Interior (ha)"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Entorno (ha)"</span>])</span>
<span id="cb4-69">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> uc, linha <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> tabela.iterrows():</span>
<span id="cb4-70">        t.row([nome(uc), <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>(alertas.get(uc, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)),</span>
<span id="cb4-71">               <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>linha[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'interior'</span>]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:,.1f}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>.replace(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">","</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"X"</span>).replace(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"."</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">","</span>).replace(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"X"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"."</span>),</span>
<span id="cb4-72">               <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>linha[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'entorno'</span>]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:,.1f}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>.replace(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">","</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"X"</span>).replace(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"."</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">","</span>).replace(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"X"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"."</span>)])</span>
<span id="cb4-73">pdf.ln(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>)</span>
<span id="cb4-74">pdf.image(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dados/boletim_grafico.png"</span>, w<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">180</span>)</span>
<span id="cb4-75"></span>
<span id="cb4-76"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 5. Uma página por UC, com o mapa do artigo anterior</span></span>
<span id="cb4-77">ucs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.read_file(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dados/artigos.gpkg"</span>, layer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ucs"</span>).set_index(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nome_uc"</span>)</span>
<span id="cb4-78"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> uc <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> tabela.index:</span>
<span id="cb4-79">    pdf.add_page()</span>
<span id="cb4-80">    pdf.set_font(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Helvetica"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"B"</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span>)</span>
<span id="cb4-81">    pdf.cell(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>, nome(uc), new_x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"LMARGIN"</span>, new_y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"NEXT"</span>)</span>
<span id="cb4-82">    pdf.set_font(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Helvetica"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">""</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>)</span>
<span id="cb4-83">    pdf.cell(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>, <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>ucs<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>loc[uc, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'categoria'</span>]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> · </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>ucs<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>loc[uc, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'grupo'</span>]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> · "</span></span>
<span id="cb4-84">                   <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"CNUC </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>ucs<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>loc[uc, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'cnuc'</span>]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, new_x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"LMARGIN"</span>, new_y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"NEXT"</span>)</span>
<span id="cb4-85">    pdf.cell(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>, <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"Interior: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>tabela<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>loc[uc, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'interior'</span>]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:.1f}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> ha · "</span></span>
<span id="cb4-86">                   <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"Entorno: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>tabela<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>loc[uc, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'entorno'</span>]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:.1f}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> ha"</span>, new_x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"LMARGIN"</span>, new_y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"NEXT"</span>)</span>
<span id="cb4-87">    pdf.ln(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>)</span>
<span id="cb4-88">    pdf.image(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"dados/mapas_py/mapa_</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>ucs<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>loc[uc, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'cnuc'</span>]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">.png"</span>, w<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">185</span>)</span>
<span id="cb4-89"></span>
<span id="cb4-90">pdf.output(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dados/boletim.pdf"</span>)</span>
<span id="cb4-91"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"boletim.pdf com"</span>, pdf.page_no(), <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"páginas"</span>)</span>
<span id="cb4-92"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(tabela.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">round</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>))</span></code></pre></div></div>
</div>
<div id="tabset-1-5" class="tab-pane" aria-labelledby="tabset-1-5-tab">
<p>Um arquivo <code>boletim.qmd</code> é o <strong>modelo</strong>; o parâmetro <code>cnuc</code> escolhe a UC. O PDF sai pelo <strong>Typst</strong>, que já vem com o Quarto (não precisa instalar LaTeX).</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode markdown code-with-copy"><code class="sourceCode markdown"><span id="cb5-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">---</span></span>
<span id="cb5-2"><span class="an" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">title:</span><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"> "Boletim de desmatamento"</span></span>
<span id="cb5-3"><span class="an" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">format:</span></span>
<span id="cb5-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">  typst:</span></span>
<span id="cb5-5"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    papersize: a4</span></span>
<span id="cb5-6"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    margin: {x: 2cm, y: 2cm}</span></span>
<span id="cb5-7"><span class="an" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">lang:</span><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"> pt-BR</span></span>
<span id="cb5-8"><span class="an" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">execute:</span></span>
<span id="cb5-9"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">  echo: false</span></span>
<span id="cb5-10"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">  warning: false</span></span>
<span id="cb5-11"><span class="an" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">jupyter:</span><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"> python3</span></span>
<span id="cb5-12"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">---</span></span>
<span id="cb5-13"></span>
<span id="cb5-14"><span class="in" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">```{python}</span></span>
<span id="cb5-15"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#| tags: [parameters]</span></span>
<span id="cb5-16">cnuc <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"0000.00.0266"</span>      <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># trocado na hora de gerar: -P cnuc:...</span></span>
<span id="cb5-17"><span class="in" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">```</span></span>
<span id="cb5-18"></span>
<span id="cb5-19"><span class="in" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">```{python}</span></span>
<span id="cb5-20"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> geopandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> gpd</span>
<span id="cb5-21"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> pd</span>
<span id="cb5-22"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> IPython.display <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> Markdown</span>
<span id="cb5-23"></span>
<span id="cb5-24"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> nome(texto):</span>
<span id="cb5-25">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">" "</span>.join(p <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> p <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"de"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"do"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"da"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dos"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"das"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"e"</span>) <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span> p.capitalize()</span>
<span id="cb5-26">                    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> p <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> texto.lower().split())</span>
<span id="cb5-27"></span>
<span id="cb5-28">G <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"../dados/artigos.gpkg"</span></span>
<span id="cb5-29">uc <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.read_file(G, layer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ucs"</span>).query(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cnuc == @cnuc"</span>).iloc[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]</span>
<span id="cb5-30">d <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.read_file(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"../dados/deter_interior_entorno.gpkg"</span>).query(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cnuc == @cnuc"</span>)</span>
<span id="cb5-31">d[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.to_datetime(d[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>])</span>
<span id="cb5-32">fim <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> d[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">max</span>()</span>
<span id="cb5-33">d <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> d[d[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"classname"</span>].isin([<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"DESMATAMENTO_CR"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"DESMATAMENTO_VEG"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MINERACAO"</span>])</span>
<span id="cb5-34">      <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> (d[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> fim <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> pd.Timedelta(days<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">90</span>))]</span>
<span id="cb5-35">area <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> d.groupby(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"local"</span>)[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sum</span>().reindex([<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"interior"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"entorno"</span>], fill_value<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb5-36"><span class="in" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">```</span></span>
<span id="cb5-37"></span>
<span id="cb5-38"><span class="in" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">```{python}</span></span>
<span id="cb5-39"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#| output: asis</span></span>
<span id="cb5-40"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"## </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>nome(uc[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'nome_uc'</span>])<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\n</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb5-41"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>uc[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'categoria'</span>]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> · </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>uc[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'grupo'</span>]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> · CNUC </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>cnuc<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\n</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb5-42">ha <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> x: <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>x<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:,.1f}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>.replace(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">","</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">" "</span>).replace(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"."</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">","</span>).replace(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">" "</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"."</span>)</span>
<span id="cb5-43"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"Nos 90 dias até **</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>fim<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%</span>d<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/%</span>m<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/%</span>Y<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">**, o DETER registrou **</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>ha(area[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'interior'</span>])<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> ha** de "</span></span>
<span id="cb5-44">      <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"desmatamento no interior da UC e **</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>ha(area[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'entorno'</span>])<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> ha** no entorno de 3 km.</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\n</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb5-45"><span class="in" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">```</span></span>
<span id="cb5-46"></span>
<span id="cb5-47"><span class="in" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">```{python}</span></span>
<span id="cb5-48"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#| fig-cap: "Mapa da UC com os alertas desde agosto de 2026."</span></span>
<span id="cb5-49"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> IPython.display <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> Image</span>
<span id="cb5-50">Image(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"../dados/mapas_py/mapa_</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>cnuc<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">.png"</span>, width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">600</span>)</span>
<span id="cb5-51"><span class="in" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">```</span></span>
<span id="cb5-52"></span>
<span id="cb5-53"><span class="in" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">```{python}</span></span>
<span id="cb5-54">tabela <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (d.groupby([<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"local"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"classname"</span>])[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>].agg([<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"count"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"sum"</span>]).<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">round</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb5-55">          .reset_index()</span>
<span id="cb5-56">          .rename(columns<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>{<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"local"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Local"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"classname"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Classe"</span>,</span>
<span id="cb5-57">                           <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"count"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Alertas"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"sum"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Área (ha)"</span>}))</span>
<span id="cb5-58">Markdown(tabela.to_markdown(index<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>))</span>
<span id="cb5-59"><span class="in" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">```</span></span></code></pre></div></div>
<p>Para gerar um PDF por UC, chame o Quarto num laço (no Windows, use um <code>for</code> do PowerShell):</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb6-1"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> cnuc <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> 0000.00.0266 0000.00.0267 0000.00.0268<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">;</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">do</span></span>
<span id="cb6-2">  <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">quarto</span> render boletim.qmd <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-P</span> cnuc:<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">$cnuc</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">--output</span> boletim_<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">$cnuc</span>.pdf</span>
<span id="cb6-3"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">done</span></span></code></pre></div></div>
<p>O Quarto precisa de <code>jupyter</code>, <code>papermill</code> e <code>tabulate</code> instalados no mesmo Python dos dados (<code>pip install jupyter papermill tabulate</code>).</p>
</div>
</div>
</div>
</section>
<section id="conferindo-o-resultado" class="level2">
<h2 class="anchored" data-anchor-id="conferindo-o-resultado">Conferindo o resultado</h2>
<p>As versões Python (fpdf2), Quarto e QGIS geraram os PDFs com os mesmos números. Nos 90 dias até 16/10/2026:</p>
<table class="table-striped caption-top table">
<caption>Alertas de desmatamento do DETER (corte raso, com vegetação e mineração) nos 90 dias até 16/10/2026.</caption>
<thead>
<tr class="header">
<th>UC</th>
<th style="text-align: right;">Alertas no interior</th>
<th style="text-align: right;">Interior (ha)</th>
<th style="text-align: right;">Entorno (ha)</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Floresta Nacional do Jamanxim</td>
<td style="text-align: right;">35</td>
<td style="text-align: right;">628,5</td>
<td style="text-align: right;">9,1</td>
</tr>
<tr class="even">
<td>Floresta Nacional de Altamira</td>
<td style="text-align: right;">12</td>
<td style="text-align: right;">436,1</td>
<td style="text-align: right;">24,2</td>
</tr>
<tr class="odd">
<td>Área de Proteção Ambiental do Tapajós</td>
<td style="text-align: right;">38</td>
<td style="text-align: right;">433,0</td>
<td style="text-align: right;">274,0</td>
</tr>
<tr class="even">
<td>Parque Nacional do Jamanxim</td>
<td style="text-align: right;">6</td>
<td style="text-align: right;">73,5</td>
<td style="text-align: right;">100,9</td>
</tr>
<tr class="odd">
<td>Parque Nacional do Rio Novo</td>
<td style="text-align: right;">6</td>
<td style="text-align: right;">48,2</td>
<td style="text-align: right;">0</td>
</tr>
</tbody>
</table>
<p>No Parque Nacional do Jamanxim, que é de Proteção Integral, o entorno teve <strong>mais</strong> desmatamento que o interior no período. É o tipo de achado que um boletim semanal mostra cedo.</p>
</section>
<section id="armadilhas" class="level2">
<h2 class="anchored" data-anchor-id="armadilhas">Armadilhas</h2>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Aviso</span>Datas digitadas no texto
</div>
</div>
<div class="callout-body-container callout-body">
<p>“Boletim de 1º a 30 de setembro” escrito à mão fica errado na primeira vez que o script roda em outro mês. Calcule o período a partir dos dados (<code>max(view_date)</code>), como nos códigos acima.</p>
</div>
</div>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Aviso</span>Acentos no PDF
</div>
</div>
<div class="callout-body-container callout-body">
<p>As fontes padrão do fpdf2 (Helvetica, Times) só têm os caracteres do Latin-1: acentos do português funcionam, mas travessão (—), aspas curvas e emojis não. Para qualquer caractere, carregue uma fonte TTF com <code>pdf.add_font("DejaVu", "", "DejaVuSans.ttf")</code>.</p>
</div>
</div>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Aviso</span>Tabela de atributos no layout do QGIS, pelo código
</div>
</div>
<div class="callout-body-container callout-body">
<p>Crie a tabela com <code>QgsLayoutItemAttributeTable.create(layout)</code> e registre-a com <code>layout.addMultiFrame(tabela)</code> <strong>antes</strong> de configurar. Sem isso, o Python apaga a tabela da memória e o QGIS fecha sem aviso na hora de exportar.</p>
</div>
</div>
<div class="callout callout-style-default callout-tip callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Dica</span>Logotipos e identidade visual
</div>
</div>
<div class="callout-body-container callout-body">
<p>Os boletins oficiais levam logotipo e cabeçalho do órgão. Num boletim pessoal ou de estudo, <strong>não use logotipos de instituições</strong>: deixe claro que é um produto seu, feito com dados públicos.</p>
</div>
</div>
</section>
<section id="veja-também" class="level2">
<h2 class="anchored" data-anchor-id="veja-também">Veja também</h2>
<ul>
<li><a href="../artigos/10-mapas-automaticos.html">Um mapa por UC, automático</a></li>
<li><a href="../guia-espacial/curso/07-power-bi.html">Módulo 7 do curso: Power BI</a>, para um painel em vez de PDF</li>
</ul>
<div class="navegacao-livro">
<p><a href="../artigos/10-mapas-automaticos.html" class="anterior"><span class="direcao">← Anterior</span> Um mapa por UC, automático: do ArcMap ao QGIS e ao Python</a> <a href="../artigos/12-priorizacao-arcgis-qgis.html" class="proximo"><span class="direcao">Próximo →</span> Priorizar alertas em ArcGIS Pro, QGIS e Python</a></p>
</div>
</section>
<section id="atualizações" class="level2 unnumbered">
<h2 class="unnumbered anchored" data-anchor-id="atualizações">Atualizações</h2>
<ul>
<li><strong>29/10/2026:</strong> publicação, com dados do INPE, do MMA, do IBAMA e do SICAR de outubro de 2026.</li>
</ul>
<p><a href="https://hendesson.github.io/en/articles/11-pdf-report.html">English version</a></p>


</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> De volta ao topo</a><div id="quarto-appendix" class="default"><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Licença</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/deed.pt_br">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Como citar</h2><div><div class="quarto-appendix-secondary-label">BibTeX</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@misc{alves2026,
  author = {Alves, Hendesson},
  publisher = {Hendesson Alves},
  title = {Relatório automático em PDF: o boletim que se escreve
    sozinho},
  date = {2026-10-29},
  url = {https://hendesson.github.io/artigos/11-relatorio-pdf.html},
  doi = {10.5281/zenodo.23780266},
  langid = {pt-BR},
  abstract = {Um boletim de desmatamento em PDF, com resumo, tabela,
    gráfico e uma página com mapa para cada UC, gerado por script.
    Quatro caminhos: fpdf2, Quarto com Typst, Atlas do QGIS e relatórios
    do ArcGIS Pro.}
}
</code></pre><div class="quarto-appendix-secondary-label">Por favor, cite este trabalho como:</div><div id="ref-alves2026" class="csl-entry quarto-appendix-citeas">
Alves, Hendesson. 2026. <span>“Relatório automático em PDF: o boletim
que se escreve sozinho.”</span> In <em>Artigos de geoprocessamento para
monitoramento ambiental</em>. Preprint, Hendesson Alves, October 29. <a href="https://doi.org/10.5281/zenodo.23780266">https://doi.org/10.5281/zenodo.23780266</a>.
</div></div></section></div> ]]></description>
  <category>Mapas</category>
  <category>Relatórios</category>
  <category>Quarto</category>
  <guid>https://hendesson.github.io/artigos/11-relatorio-pdf.html</guid>
  <pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate>
  <media:content url="https://hendesson.github.io/imagens/artigos/boletim.png" medium="image" type="image/png" height="204" width="144"/>
</item>
<item>
  <title>Priorizar alertas em ArcGIS Pro, QGIS e Python</title>
  <dc:creator>Hendesson Alves</dc:creator>
  <link>https://hendesson.github.io/artigos/12-priorizacao-arcgis-qgis.html</link>
  <description><![CDATA[ 





<div class="ficha">
<p><span class="rotulo">Nível</span> Avançado <span class="rotulo">Leitura</span> 14 min <span class="rotulo">Dados</span> outubro de 2026 <span class="rotulo">Programas</span> <span class="selo-texto">ArcGIS</span> <img src="https://hendesson.github.io/imagens/ferramentas/qgis.svg" class="img-fluid" alt="QGIS"> <img src="https://hendesson.github.io/imagens/ferramentas/postgis.svg" class="img-fluid" alt="PostGIS"> <img src="https://hendesson.github.io/imagens/ferramentas/python.svg" class="img-fluid" alt="Python"></p>
</div>
<p>Com centenas de alertas por mês, a fiscalização precisa decidir <strong>por onde começar</strong>. O script que eu usava fazia isso em quatro passos: juntar os alertas que estão perto uns dos outros num <strong>grupo</strong>, medir cada grupo, transformar as medidas em <strong>índices de 0 a 1</strong> e somar com <strong>pesos</strong>.</p>
<p>O <a href="../guia-espacial/curso/05-priorizacao.html">Módulo 5 do curso</a> faz uma versão disso em SQL, passo a passo. Aqui está a lógica do script original, com os mesmos parâmetros, em cada programa.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://hendesson.github.io/imagens/artigos/priorizacao_grupos.png" class="img-fluid figure-img" alt="Mapa da região de Novo Progresso com as UCs em verde claro e grupos de alertas coloridos: muito baixa em amarelo-claro, baixa em amarelo, média em laranja, alta em vermelho e muito alta em vermelho-escuro. Os 11 grupos de prioridade muito alta aparecem espalhados pelo recorte, vários deles nas bordas das UCs."></p>
<figcaption>Grupos de alertas do último ano, coloridos pela prioridade.</figcaption>
</figure>
</div>
<section id="a-lógica" class="level2">
<h2 class="anchored" data-anchor-id="a-lógica">A lógica</h2>
<div class="cell" data-eval="true" data-layout-align="default">
<div class="cell-output-display">
<div>
<p></p><figure class="figure"><p></p>
<div>
<pre class="mermaid mermaid-js">flowchart LR
    A["Alertas do&lt;br/&gt;último ano"] --&gt; B["Agrupar vizinhos&lt;br/&gt;60 m / 800 m"]
    B --&gt; C["Medidas do grupo:&lt;br/&gt;área, quantidade,&lt;br/&gt;tempo, velocidade"]
    C --&gt; D["Índices 0 a 1&lt;br/&gt;(com limites)"]
    D --&gt; E["Nota ponderada&lt;br/&gt;0,2 / 0,2 / 0,2 / 0,4"]
    E --&gt; F["Classe:&lt;br/&gt;Muito Baixa a&lt;br/&gt;Muito Alta"]
</pre>
</div>
<p></p><figcaption> Do alerta ao grupo e à nota</figcaption> </figure><p></p>
</div>
</div>
</div>
<table class="caption-top table">
<colgroup>
<col style="width: 18%">
<col style="width: 18%">
<col style="width: 18%">
<col style="width: 18%">
<col style="width: 25%">
</colgroup>
<thead>
<tr class="header">
<th>Medida do grupo</th>
<th>Como se calcula</th>
<th>Limites: corte raso</th>
<th>Limites: mineração</th>
<th style="text-align: right;">Peso</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Área</td>
<td>soma da área dos alertas (ha)</td>
<td>3 a 30 ha</td>
<td>0,1 a 5 ha</td>
<td style="text-align: right;">0,2</td>
</tr>
<tr class="even">
<td>Quantidade</td>
<td>número de alertas no grupo</td>
<td>1 a 4</td>
<td>1 a 10</td>
<td style="text-align: right;">0,2</td>
</tr>
<tr class="odd">
<td>Tempo</td>
<td>dias entre o alerta mais novo do grupo e a data de referência</td>
<td>−365 a −14 dias</td>
<td>−365 a −14 dias</td>
<td style="text-align: right;">0,2</td>
</tr>
<tr class="even">
<td>Velocidade</td>
<td>área ÷ dias desde o primeiro alerta do grupo (ha/dia)</td>
<td>0,1 a 0,5</td>
<td>0,00057 a 0,1</td>
<td style="text-align: right;">0,4</td>
</tr>
</tbody>
</table>
<ul>
<li><strong>Agrupar:</strong> alertas a até <strong>60 m</strong> um do outro (corte raso) ou <strong>800 m</strong> (mineração, que se espalha ao longo dos rios) viram um grupo só.</li>
<li><strong>Índice com limites:</strong> abaixo do mínimo vale 0, acima do máximo vale 1, e no meio cresce em linha reta. Um grupo de 30 ha ou mais já tem índice de área 1.</li>
<li><strong>Classes:</strong> ≥ 0,95 Muito Alta; ≥ 0,8 Alta; ≥ 0,6 Média; ≥ 0,4 Baixa; abaixo disso, Muito Baixa.</li>
</ul>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Nota</span>Data de referência
</div>
</div>
<div class="callout-body-container callout-body">
<p>O script original media o tempo até <strong>hoje</strong>. Aqui, a referência é a <strong>data do alerta mais novo</strong> (16/10/2026), para que o resultado não mude só porque o script rodou outro dia. Para uso diário, troque pela data de hoje.</p>
</div>
</div>
</section>
<section id="o-código" class="level2">
<h2 class="anchored" data-anchor-id="o-código">O código</h2>
<p>Dados: camada <code>deter</code> do GeoPackage dos artigos (<a href="../artigos/sobre.html#dados">como baixar</a>). O script original usava alertas do Programa Brasil MAIS, que são restritos a órgãos públicos; o DETER funciona igual.</p>
<div class="tabset-margin-container"></div><div class="panel-tabset" data-group="programa">
<ul class="nav nav-tabs"><li class="nav-item"><a class="nav-link active" id="tabset-1-1-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-1" aria-controls="tabset-1-1" aria-selected="true" href="">ArcGIS Pro</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-2-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-2" aria-controls="tabset-1-2" aria-selected="false" href="">QGIS</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-3-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-3" aria-controls="tabset-1-3" aria-selected="false" href="">PostGIS</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-4-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-4" aria-controls="tabset-1-4" aria-selected="false" href="">Python</a></li></ul>
<div class="tab-content" data-group="programa">
<div id="tabset-1-1" class="tab-pane active" aria-labelledby="tabset-1-1-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> arcpy</span>
<span id="cb1-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> datetime <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> timedelta</span>
<span id="cb1-3"></span>
<span id="cb1-4">arcpy.env.overwriteOutput <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span></span>
<span id="cb1-5">arcpy.env.outputCoordinateSystem <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.SpatialReference(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5880</span>)     <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># metros</span></span>
<span id="cb1-6">gpkg <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\a</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">rtigos</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">gpkg"</span></span>
<span id="cb1-7">gdb <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\r</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">esultados</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">gdb"</span></span>
<span id="cb1-8"></span>
<span id="cb1-9">PARAM <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> {</span>
<span id="cb1-10">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"corte_raso"</span>: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(dist<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">60</span>, area<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">30</span>), qtde<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>), velo<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.1</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span>)),</span>
<span id="cb1-11">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mineracao"</span>:  <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(dist<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">800</span>, area<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>), qtde<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>), velo<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.00057</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.1</span>)),</span>
<span id="cb1-12">}</span>
<span id="cb1-13"></span>
<span id="cb1-14"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> norm(valor, limites):</span>
<span id="cb1-15">    a, b <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> limites</span>
<span id="cb1-16">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">min</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">max</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, (valor <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> a) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> (b <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> a)))</span>
<span id="cb1-17"></span>
<span id="cb1-18"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> classe(x):</span>
<span id="cb1-19">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> limite, nome <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> [(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.95</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Muito Alta"</span>), (<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.8</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Alta"</span>), (<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.6</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Média"</span>), (<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.4</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Baixa"</span>)]:</span>
<span id="cb1-20">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> limite:</span>
<span id="cb1-21">            <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> nome</span>
<span id="cb1-22">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Muito Baixa"</span></span>
<span id="cb1-23"></span>
<span id="cb1-24"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1 e 2. Alertas do último ano, corrigidos, com área e tipo</span></span>
<span id="cb1-25">deter <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.management.CopyFeatures(gpkg <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\m</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ain</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">deter"</span>, <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"memory</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">eter"</span>)</span>
<span id="cb1-26">ref <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">max</span>(r[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>] <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> r <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> arcpy.da.SearchCursor(deter, [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>]))</span>
<span id="cb1-27">corte <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (ref <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> timedelta(days<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">365</span>)).strftime(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"%Y-%m-</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%d</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb1-28">alertas <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.analysis.Select(</span>
<span id="cb1-29">    deter, <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"memory</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\a</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">lertas"</span>,</span>
<span id="cb1-30">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"classname IN ('DESMATAMENTO_CR', 'DESMATAMENTO_VEG', 'MINERACAO') "</span></span>
<span id="cb1-31">    <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"AND view_date &gt; timestamp '</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>corte<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> 00:00:00'"</span>)</span>
<span id="cb1-32">arcpy.management.RepairGeometry(alertas)</span>
<span id="cb1-33">arcpy.management.CalculateGeometryAttributes(</span>
<span id="cb1-34">    alertas, [[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"AREA_GEODESIC"</span>]], area_unit<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"HECTARES"</span>)</span>
<span id="cb1-35">arcpy.management.CalculateField(</span>
<span id="cb1-36">    alertas, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tipo"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"'mineracao' if !classname! == 'MINERACAO' else 'corte_raso'"</span>,</span>
<span id="cb1-37">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"PYTHON3"</span>, field_type<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"TEXT"</span>)</span>
<span id="cb1-38"></span>
<span id="cb1-39">tabelas <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb1-40"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> tipo, p <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> PARAM.items():</span>
<span id="cb1-41">    a <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.analysis.Select(alertas, <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">rf"memory</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\a</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">_</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>tipo<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"tipo = '</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>tipo<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">'"</span>)</span>
<span id="cb1-42"></span>
<span id="cb1-43">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 3. Agrupar: buffer de metade da distância, dissolver tudo e separar as partes</span></span>
<span id="cb1-44">    grupos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.analysis.PairwiseBuffer(a, <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">rf"memory</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\b</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">uf_</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>tipo<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>,</span>
<span id="cb1-45">                                           <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>p[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'dist'</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> Meters"</span>, dissolve_option<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ALL"</span>)</span>
<span id="cb1-46">    grupos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.management.MultipartToSinglepart(grupos, <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">rf"memory</span><span class="er" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">grupos_</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>tipo<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb1-47">    arcpy.management.CalculateField(grupos, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cluster"</span>, <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"'</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>tipo<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">_' + str(!OBJECTID!)"</span>,</span>
<span id="cb1-48">                                    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"PYTHON3"</span>, field_type<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"TEXT"</span>)</span>
<span id="cb1-49">    a <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.analysis.SpatialJoin(a, grupos, <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">rf"memory</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\a</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">j_</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>tipo<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"JOIN_ONE_TO_ONE"</span>,</span>
<span id="cb1-50">                                   <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"KEEP_COMMON"</span>, match_option<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"INTERSECT"</span>)</span>
<span id="cb1-51"></span>
<span id="cb1-52">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 4. Medidas de cada grupo</span></span>
<span id="cb1-53">    t <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.analysis.Statistics(a, <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">rf"memory</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\t</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">_</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>tipo<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>,</span>
<span id="cb1-54">                                  [[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SUM"</span>], [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gid"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"COUNT"</span>],</span>
<span id="cb1-55">                                   [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MIN"</span>], [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MAX"</span>]], <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cluster"</span>)</span>
<span id="cb1-56"></span>
<span id="cb1-57">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 5. Índices, nota e classe</span></span>
<span id="cb1-58">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> campo, tipo_campo <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> [(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tempo"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"LONG"</span>), (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"velo"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"DOUBLE"</span>),</span>
<span id="cb1-59">                              (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"indice"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"DOUBLE"</span>), (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"prioridade"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"TEXT"</span>), (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tipo"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"TEXT"</span>)]:</span>
<span id="cb1-60">        arcpy.management.AddField(t, campo, tipo_campo)</span>
<span id="cb1-61">    campos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SUM_area_ha"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"COUNT_gid"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MIN_view_date"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MAX_view_date"</span>,</span>
<span id="cb1-62">              <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tempo"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"velo"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"indice"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"prioridade"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tipo"</span>]</span>
<span id="cb1-63">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">with</span> arcpy.da.UpdateCursor(t, campos) <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> cursor:</span>
<span id="cb1-64">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> area, qtde, primeiro, ultimo, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>_ <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> cursor:</span>
<span id="cb1-65">            tempo <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (ultimo <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> ref).days</span>
<span id="cb1-66">            velo <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> area <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">max</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, (ref <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> primeiro).days)</span>
<span id="cb1-67">            indice <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> norm(area, p[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area"</span>]) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> norm(qtde, p[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"qtde"</span>])</span>
<span id="cb1-68">                      <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> norm(tempo, (<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">365</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">14</span>)) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.4</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> norm(velo, p[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"velo"</span>]))</span>
<span id="cb1-69">            cursor.updateRow([area, qtde, primeiro, ultimo, tempo, velo, indice,</span>
<span id="cb1-70">                              classe(indice), tipo])</span>
<span id="cb1-71">    arcpy.management.JoinField(grupos, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cluster"</span>, t, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cluster"</span>)</span>
<span id="cb1-72">    tabelas.append(grupos)</span>
<span id="cb1-73"></span>
<span id="cb1-74">arcpy.management.Merge(tabelas, gdb <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="er" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">priorizacao_grupos"</span>)</span></code></pre></div></div>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
Nota
</div>
</div>
<div class="callout-body-container callout-body">
<p>O script original agrupava com <strong>Agregar polígonos</strong> (<code>cartography.AggregatePolygons</code>), que só existe na licença <strong>Advanced</strong>. O buffer de metade da distância, dissolvido, dá os mesmos grupos e funciona na licença Basic.</p>
</div>
</div>
</div>
<div id="tabset-1-2" class="tab-pane" aria-labelledby="tabset-1-2-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb2-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> processing</span>
<span id="cb2-2">G <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"C:/dados/artigos.gpkg"</span></span>
<span id="cb2-3"></span>
<span id="cb2-4">PARAM <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> {</span>
<span id="cb2-5">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"corte_raso"</span>: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(dist<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">60</span>, area<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">30</span>), qtde<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>), velo<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.1</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span>)),</span>
<span id="cb2-6">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mineracao"</span>:  <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(dist<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">800</span>, area<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>), qtde<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>), velo<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.00057</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.1</span>)),</span>
<span id="cb2-7">}</span>
<span id="cb2-8"></span>
<span id="cb2-9"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> rodar(alg, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span>p):</span>
<span id="cb2-10">    p.setdefault(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"OUTPUT"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"memory:"</span>)</span>
<span id="cb2-11">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> processing.run(alg, p)[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"OUTPUT"</span>]</span>
<span id="cb2-12"></span>
<span id="cb2-13"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> norm(campo, limites):</span>
<span id="cb2-14">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""Expressão do QGIS: normaliza entre os limites e corta em 0 e 1."""</span></span>
<span id="cb2-15">    a, b <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> limites</span>
<span id="cb2-16">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f'clamp(0, ("</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>campo<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">" - </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>a<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">) / (</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>b<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> - </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>a<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">), 1)'</span></span>
<span id="cb2-17"></span>
<span id="cb2-18"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1. Data de referência (o alerta mais novo) e alertas do último ano</span></span>
<span id="cb2-19">fonte <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> QgsVectorLayer(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>G<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">|layername=deter"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"deter"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ogr"</span>)</span>
<span id="cb2-20">ref <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> fonte.maximumValue(fonte.fields().indexOf(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>))</span>
<span id="cb2-21">corte <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ref.addDays(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">365</span>).toString(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"yyyy-MM-dd"</span>)</span>
<span id="cb2-22">ref <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ref.toString(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"yyyy-MM-dd"</span>)</span>
<span id="cb2-23">alertas <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:extractbyexpression"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>fonte, EXPRESSION<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span></span>
<span id="cb2-24">                <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"classname IN ('DESMATAMENTO_CR', 'DESMATAMENTO_VEG', 'MINERACAO') "</span></span>
<span id="cb2-25">                <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"AND view_date &gt; '</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>corte<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">'"</span>)</span>
<span id="cb2-26"></span>
<span id="cb2-27"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2. Corrigir, passar para metros, área em hectares e tipo</span></span>
<span id="cb2-28">alertas <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:fixgeometries"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alertas)</span>
<span id="cb2-29">alertas <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:removenullgeometries"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alertas, REMOVE_EMPTY<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb2-30">alertas <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:reprojectlayer"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alertas, TARGET_CRS<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"EPSG:5880"</span>)</span>
<span id="cb2-31">alertas <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:fieldcalculator"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alertas, FIELD_NAME<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>, FIELD_TYPE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>,</span>
<span id="cb2-32">                FIELD_PRECISION<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>,</span>
<span id="cb2-33">                FORMULA<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area(transform($geometry, 'EPSG:5880', 'ESRI:102033')) / 10000"</span>)</span>
<span id="cb2-34">alertas <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:fieldcalculator"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alertas, FIELD_NAME<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tipo"</span>, FIELD_TYPE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>,</span>
<span id="cb2-35">                FORMULA<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"if(classname = 'MINERACAO', 'mineracao', 'corte_raso')"</span>)</span>
<span id="cb2-36"></span>
<span id="cb2-37">partes <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb2-38"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> tipo, p <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> PARAM.items():</span>
<span id="cb2-39">    a <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:extractbyattribute"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alertas, FIELD<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tipo"</span>, OPERATOR<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, VALUE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>tipo)</span>
<span id="cb2-40"></span>
<span id="cb2-41">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 3. Agrupar: buffer de metade da distância, dissolver e separar as partes</span></span>
<span id="cb2-42">    grupos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:buffer"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>a, DISTANCE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>p[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dist"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, DISSOLVE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb2-43">    grupos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:multiparttosingleparts"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>grupos)</span>
<span id="cb2-44">    grupos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:fieldcalculator"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>grupos, FIELD_NAME<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cluster"</span>, FIELD_TYPE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>,</span>
<span id="cb2-45">                   FORMULA<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"'</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>tipo<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">_' || to_string(@row_number)"</span>)</span>
<span id="cb2-46">    a <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:joinattributesbylocation"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>a, JOIN<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>grupos, PREDICATE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>],</span>
<span id="cb2-47">              JOIN_FIELDS<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cluster"</span>], METHOD<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb2-48"></span>
<span id="cb2-49">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 4. Medidas de cada grupo</span></span>
<span id="cb2-50">    c <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:aggregate"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>a, GROUP_BY<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'"cluster"'</span>, AGGREGATES<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[</span>
<span id="cb2-51">        {<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"aggregate"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"first_value"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"input"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'"cluster"'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"name"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cluster"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"type"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>,</span>
<span id="cb2-52">         <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"length"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">30</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"precision"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>},</span>
<span id="cb2-53">        {<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"aggregate"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"first_value"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"input"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'"tipo"'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"name"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tipo"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"type"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>,</span>
<span id="cb2-54">         <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"length"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"precision"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>},</span>
<span id="cb2-55">        {<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"aggregate"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"sum"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"input"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'"area_ha"'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"name"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"type"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>,</span>
<span id="cb2-56">         <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"length"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"precision"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>},</span>
<span id="cb2-57">        {<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"aggregate"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"count"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"input"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'"gid"'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"name"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"qtde"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"type"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>,</span>
<span id="cb2-58">         <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"length"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"precision"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>},</span>
<span id="cb2-59">        {<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"aggregate"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"minimum"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"input"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'"view_date"'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"name"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"primeiro"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"type"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">14</span>,</span>
<span id="cb2-60">         <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"length"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"precision"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>},</span>
<span id="cb2-61">        {<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"aggregate"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"maximum"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"input"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'"view_date"'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"name"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ultimo"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"type"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">14</span>,</span>
<span id="cb2-62">         <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"length"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"precision"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>}])</span>
<span id="cb2-63">    c <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:fieldcalculator"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>c, FIELD_NAME<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tempo"</span>, FIELD_TYPE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,</span>
<span id="cb2-64">              FORMULA<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"-day(to_date('</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>ref<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">') - </span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\"</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">ultimo</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\"</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">)"</span>)</span>
<span id="cb2-65">    c <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:fieldcalculator"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>c, FIELD_NAME<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"velo"</span>, FIELD_TYPE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>,</span>
<span id="cb2-66">              FIELD_PRECISION<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>,</span>
<span id="cb2-67">              FORMULA<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\"</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">area_ha</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\"</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> / max(1, day(to_date('</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>ref<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">') - </span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\"</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">primeiro</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\"</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">))"</span>)</span>
<span id="cb2-68"></span>
<span id="cb2-69">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 5. Nota ponderada e classe</span></span>
<span id="cb2-70">    c <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:fieldcalculator"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>c, FIELD_NAME<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"indice"</span>, FIELD_TYPE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>,</span>
<span id="cb2-71">              FIELD_PRECISION<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>, FORMULA<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(</span>
<span id="cb2-72">                  <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"0.2 * </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>norm(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'area_ha'</span>, p[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'area'</span>])<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> + 0.2 * </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>norm(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'qtde'</span>, p[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'qtde'</span>])<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> + "</span></span>
<span id="cb2-73">                  <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"0.2 * </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>norm(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'tempo'</span>, (<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">365</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">14</span>))<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> + 0.4 * </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>norm(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'velo'</span>, p[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'velo'</span>])<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>))</span>
<span id="cb2-74">    c <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:fieldcalculator"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>c, FIELD_NAME<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"prioridade"</span>, FIELD_TYPE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>,</span>
<span id="cb2-75">              FORMULA<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"CASE WHEN indice &gt;= 0.95 THEN 'Muito Alta' WHEN indice &gt;= 0.8 THEN "</span></span>
<span id="cb2-76">                      <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"'Alta' WHEN indice &gt;= 0.6 THEN 'Média' WHEN indice &gt;= 0.4 THEN 'Baixa' "</span></span>
<span id="cb2-77">                      <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ELSE 'Muito Baixa' END"</span>)</span>
<span id="cb2-78">    partes.append(c)</span>
<span id="cb2-79"></span>
<span id="cb2-80">clusters <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:mergevectorlayers"</span>, LAYERS<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>partes, CRS<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"EPSG:5880"</span>,</span>
<span id="cb2-81">                 OUTPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"C:/dados/priorizacao_qgis.gpkg"</span>)</span>
<span id="cb2-82">resumo <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rodar(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"qgis:statisticsbycategories"</span>, INPUT<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>clusters,</span>
<span id="cb2-83">               CATEGORIES_FIELD_NAME<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tipo"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"prioridade"</span>])</span>
<span id="cb2-84"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> f <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> resumo.getFeatures():</span>
<span id="cb2-85">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tipo"</span>], f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"prioridade"</span>], f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"count"</span>])</span></code></pre></div></div>
<p>O agrupamento usa a mesma ideia do ArcGIS: dois alertas a até 60 m um do outro têm buffers de 30 m que se tocam, e o <strong>Dissolver</strong> junta os dois. As funções <code>clamp</code>, <code>day</code> e <code>max</code> da expressão fazem o resto.</p>
</div>
<div id="tabset-1-3" class="tab-pane" aria-labelledby="tabset-1-3-tab">
<p>O <code>ST_ClusterDBSCAN</code> faz o agrupamento direto: com <code>minpoints = 1</code>, ele junta toda geometria que está a até <code>eps</code> metros de outra do grupo, igual ao <strong>Agregar polígonos</strong>.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode sql code-with-copy"><code class="sourceCode sql"><span id="cb3-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-- Parâmetros do script original</span></span>
<span id="cb3-2"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">DROP</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">TABLE</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">IF</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">EXISTS</span> artigos.prior_param;</span>
<span id="cb3-3"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">CREATE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">TABLE</span> artigos.prior_param (tipo text <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">PRIMARY</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">KEY</span>, dist <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">numeric</span>,</span>
<span id="cb3-4">    area_min <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">numeric</span>, area_max <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">numeric</span>, qtde_min <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">numeric</span>, qtde_max <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">numeric</span>,</span>
<span id="cb3-5">    velo_min <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">numeric</span>, velo_max <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">numeric</span>);</span>
<span id="cb3-6"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">INSERT</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">INTO</span> artigos.prior_param <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">VALUES</span></span>
<span id="cb3-7">    (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'corte_raso'</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">60</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">30</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.1</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span>),</span>
<span id="cb3-8">    (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'mineracao'</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">800</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.00057</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.1</span>);</span>
<span id="cb3-9"></span>
<span id="cb3-10"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-- Normalização com limites: abaixo do mínimo = 0, acima do máximo = 1</span></span>
<span id="cb3-11"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">CREATE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">OR</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">REPLACE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FUNCTION</span> artigos.normalizar(valor <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">numeric</span>, minimo <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">numeric</span>, maximo <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">numeric</span>)</span>
<span id="cb3-12">RETURNS <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">numeric</span> LANGUAGE sql IMMUTABLE <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span></span>
<span id="cb3-13">$$ <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">least</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">greatest</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, (valor <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> minimo) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> (maximo <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> minimo))) $$;</span>
<span id="cb3-14"></span>
<span id="cb3-15"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">DROP</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">TABLE</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">IF</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">EXISTS</span> artigos.prior_clusters;</span>
<span id="cb3-16"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">CREATE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">TABLE</span> artigos.prior_clusters <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span></span>
<span id="cb3-17"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WITH</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ref</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">max</span>(view_date) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> d <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.deter),</span>
<span id="cb3-18">alertas <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> (                                  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-- 1 e 2. último ano, corrigidos, em metros</span></span>
<span id="cb3-19">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> a.gid, a.view_date,</span>
<span id="cb3-20">           <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">CASE</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHEN</span> a.classname <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'MINERACAO'</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">THEN</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'mineracao'</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ELSE</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'corte_raso'</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">END</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> tipo,</span>
<span id="cb3-21">           ST_Transform(ST_CollectionExtract(ST_MakeValid(a.geom), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5880</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> geom</span>
<span id="cb3-22">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.deter a, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ref</span></span>
<span id="cb3-23">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> a.classname <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">IN</span> (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'DESMATAMENTO_CR'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'DESMATAMENTO_VEG'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'MINERACAO'</span>)</span>
<span id="cb3-24">      <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AND</span> a.view_date <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ref</span>.d <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">365</span></span>
<span id="cb3-25">),</span>
<span id="cb3-26">agrupados <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> (                                <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-- 3. alertas a até 60 m (ou 800 m) = mesmo grupo</span></span>
<span id="cb3-27">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>, (ST_Area(ST_Transform(geom, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4674</span>):<span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">:geography</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10000</span>):<span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">:numeric</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> area_ha,</span>
<span id="cb3-28">           <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">CASE</span> tipo</span>
<span id="cb3-29">               <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHEN</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'mineracao'</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">THEN</span> ST_ClusterDBSCAN(geom, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">800</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">OVER</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">PARTITION</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BY</span> tipo)</span>
<span id="cb3-30">               <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ELSE</span> ST_ClusterDBSCAN(geom, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">60</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">OVER</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">PARTITION</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BY</span> tipo)</span>
<span id="cb3-31">           <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">END</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">cluster</span></span>
<span id="cb3-32">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> alertas</span>
<span id="cb3-33">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHERE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">NOT</span> ST_IsEmpty(geom)</span>
<span id="cb3-34">),</span>
<span id="cb3-35">medidas <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> (                                  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-- 4. medidas de cada grupo</span></span>
<span id="cb3-36">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> g.tipo, g.<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">cluster</span>, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sum</span>(g.area_ha) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> area_ha, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">count</span>(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> qtde,</span>
<span id="cb3-37">           <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">max</span>(g.view_date) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ref</span>.d <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> tempo,</span>
<span id="cb3-38">           <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sum</span>(g.area_ha) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">greatest</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ref</span>.d <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">min</span>(g.view_date)) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> velo,</span>
<span id="cb3-39">           ST_Union(g.geom) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> geom</span>
<span id="cb3-40">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> agrupados g, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ref</span></span>
<span id="cb3-41">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">GROUP</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BY</span> g.tipo, g.<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">cluster</span>, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ref</span>.d</span>
<span id="cb3-42">)</span>
<span id="cb3-43"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> m.<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>,                                   <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-- 5. nota ponderada</span></span>
<span id="cb3-44">       <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> artigos.normalizar(m.area_ha, p.area_min, p.area_max)</span>
<span id="cb3-45">     <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> artigos.normalizar(m.qtde, p.qtde_min, p.qtde_max)</span>
<span id="cb3-46">     <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> artigos.normalizar(m.tempo, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">365</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">14</span>)</span>
<span id="cb3-47">     <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.4</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> artigos.normalizar(m.velo, p.velo_min, p.velo_max) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> indice</span>
<span id="cb3-48"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> medidas m</span>
<span id="cb3-49"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">JOIN</span> artigos.prior_param p <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">USING</span> (tipo);</span>
<span id="cb3-50"></span>
<span id="cb3-51"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ALTER</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">TABLE</span> artigos.prior_clusters <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ADD</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">COLUMN</span> prioridade text;</span>
<span id="cb3-52"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">UPDATE</span> artigos.prior_clusters <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SET</span> prioridade <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">CASE</span></span>
<span id="cb3-53">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHEN</span> indice <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.95</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">THEN</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Muito Alta'</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHEN</span> indice <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.8</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">THEN</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Alta'</span></span>
<span id="cb3-54">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHEN</span> indice <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.6</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">THEN</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Média'</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">WHEN</span> indice <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.4</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">THEN</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Baixa'</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ELSE</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Muito Baixa'</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">END</span>;</span>
<span id="cb3-55"></span>
<span id="cb3-56"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> tipo, prioridade, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">count</span>(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> grupos, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">round</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sum</span>(area_ha)) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> area_ha</span>
<span id="cb3-57"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.prior_clusters</span>
<span id="cb3-58"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">GROUP</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BY</span> tipo, prioridade</span>
<span id="cb3-59"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ORDER</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">BY</span> tipo, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">min</span>(indice) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">DESC</span>;</span></code></pre></div></div>
</div>
<div id="tabset-1-4" class="tab-pane" aria-labelledby="tabset-1-4-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb4-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> geopandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> gpd</span>
<span id="cb4-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> pd</span>
<span id="cb4-3"></span>
<span id="cb4-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Parâmetros do script original: distância de agrupamento, limites de cada índice e pesos</span></span>
<span id="cb4-5">PARAM <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> {</span>
<span id="cb4-6">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"corte_raso"</span>: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(dist<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">60</span>, area<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">30</span>), qtde<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>), velo<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.1</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span>)),</span>
<span id="cb4-7">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mineracao"</span>:  <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(dist<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">800</span>, area<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>), qtde<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>), velo<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.00057</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.1</span>)),</span>
<span id="cb4-8">}</span>
<span id="cb4-9">TEMPO <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">365</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">14</span>)                       <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># dias até a data de referência (negativo = passado)</span></span>
<span id="cb4-10">PESOS <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(area<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.2</span>, qtde<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.2</span>, tempo<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.2</span>, velo<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.4</span>)</span>
<span id="cb4-11">CLASSES <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.95</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Muito Alta"</span>), (<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.8</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Alta"</span>), (<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.6</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Média"</span>), (<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.4</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Baixa"</span>), (<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Muito Baixa"</span>)]</span>
<span id="cb4-12"></span>
<span id="cb4-13"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1. Alertas de corte raso e mineração dos últimos 365 dias</span></span>
<span id="cb4-14">deter <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.read_file(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dados/artigos.gpkg"</span>, layer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"deter"</span>)</span>
<span id="cb4-15">deter[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.to_datetime(deter[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>])</span>
<span id="cb4-16">ref <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> deter[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">max</span>()                       <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># data de referência: o alerta mais novo</span></span>
<span id="cb4-17">deter <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> deter[(deter[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> ref <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> pd.Timedelta(days<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">365</span>))</span>
<span id="cb4-18">              <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> deter[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"classname"</span>].isin([<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"DESMATAMENTO_CR"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"DESMATAMENTO_VEG"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MINERACAO"</span>])]</span>
<span id="cb4-19">deter[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tipo"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> deter[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"classname"</span>].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">map</span>(<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> c: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mineracao"</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> c <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MINERACAO"</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"corte_raso"</span>)</span>
<span id="cb4-20"></span>
<span id="cb4-21"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2. Geometrias corrigidas, em metros, e área em hectares</span></span>
<span id="cb4-22">deter[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"geometry"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> deter.make_valid(method<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"structure"</span>, keep_collapsed<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb4-23">deter <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> deter[<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span>deter.is_empty].to_crs(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5880</span>)</span>
<span id="cb4-24">deter[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> deter.to_crs(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ESRI:102033"</span>).area <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10_000</span></span>
<span id="cb4-25"></span>
<span id="cb4-26"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> normalizar(valor, limites):</span>
<span id="cb4-27">    minimo, maximo <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> limites</span>
<span id="cb4-28">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> ((valor <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> minimo) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> (maximo <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> minimo)).clip(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb4-29"></span>
<span id="cb4-30">partes <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb4-31"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> tipo, p <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> PARAM.items():</span>
<span id="cb4-32">    a <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> deter[deter[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tipo"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> tipo]</span>
<span id="cb4-33">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 3. Agrupar: buffer de metade da distância, unir e separar as partes</span></span>
<span id="cb4-34">    grupos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.GeoDataFrame(geometry<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[a.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">buffer</span>(p[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dist"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>).union_all()], crs<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5880</span>)</span>
<span id="cb4-35">    grupos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> grupos.explode(index_parts<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>).reset_index(drop<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb4-36">    grupos[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cluster"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>tipo<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">_</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>i <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> i <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(grupos))]</span>
<span id="cb4-37">    a <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.sjoin(a, grupos, predicate<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"intersects"</span>).drop(columns<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"index_right"</span>)</span>
<span id="cb4-38"></span>
<span id="cb4-39">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 4. Medidas de cada grupo</span></span>
<span id="cb4-40">    c <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> a.groupby(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cluster"</span>).agg(area_ha<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"sum"</span>), qtde<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gid"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"count"</span>),</span>
<span id="cb4-41">                                 primeiro<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"min"</span>), ultimo<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"max"</span>))</span>
<span id="cb4-42">    c[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tempo"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (c[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ultimo"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> ref).dt.days                         <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 0 = mais recente</span></span>
<span id="cb4-43">    c[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"velo"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> c[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> (ref <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> c[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"primeiro"</span>]).dt.days.clip(lower<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb4-44"></span>
<span id="cb4-45">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 5. Índices de 0 a 1, nota ponderada e classe</span></span>
<span id="cb4-46">    c[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"indice"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (PESOS[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> normalizar(c[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>], p[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area"</span>])</span>
<span id="cb4-47">                   <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> PESOS[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"qtde"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> normalizar(c[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"qtde"</span>], p[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"qtde"</span>])</span>
<span id="cb4-48">                   <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> PESOS[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tempo"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> normalizar(c[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tempo"</span>], TEMPO)</span>
<span id="cb4-49">                   <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> PESOS[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"velo"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> normalizar(c[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"velo"</span>], p[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"velo"</span>]))</span>
<span id="cb4-50">    c[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"prioridade"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> c[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"indice"</span>].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">map</span>(<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> x: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">next</span>(n <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> lim, n <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> CLASSES <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> lim))</span>
<span id="cb4-51">    partes.append(c.assign(tipo<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>tipo))</span>
<span id="cb4-52"></span>
<span id="cb4-53">clusters <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.concat(partes)</span>
<span id="cb4-54"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"data de referência:"</span>, ref.date())</span>
<span id="cb4-55"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(pd.crosstab(clusters[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tipo"</span>], clusters[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"prioridade"</span>]))</span>
<span id="cb4-56">colunas <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tipo"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area_ha"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"qtde"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tempo"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"velo"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"indice"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"prioridade"</span>]</span>
<span id="cb4-57"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(clusters.sort_values(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"indice"</span>, ascending<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)[colunas].head(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>).<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">round</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>))</span>
<span id="cb4-58">clusters.to_csv(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dados/priorizacao_python.csv"</span>)</span></code></pre></div></div>
</div>
</div>
</div>
</section>
<section id="conferindo-o-resultado" class="level2">
<h2 class="anchored" data-anchor-id="conferindo-o-resultado">Conferindo o resultado</h2>
<p>As versões do <strong>QGIS</strong>, do <strong>PostGIS</strong> e do <strong>Python</strong> formaram os mesmos grupos e deram exatamente a mesma contagem em cada classe:</p>
<table class="table-striped caption-top table">
<caption>Grupos de alertas do DETER de 17/10/2025 a 16/10/2026 no recorte de exemplo.</caption>
<colgroup>
<col style="width: 15%">
<col style="width: 21%">
<col style="width: 21%">
<col style="width: 21%">
<col style="width: 21%">
</colgroup>
<thead>
<tr class="header">
<th>Prioridade</th>
<th style="text-align: right;">Grupos de corte raso</th>
<th style="text-align: right;">Área (ha)</th>
<th style="text-align: right;">Grupos de mineração</th>
<th style="text-align: right;">Área (ha)</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Muito Alta</td>
<td style="text-align: right;">11</td>
<td style="text-align: right;">6.974</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr class="even">
<td>Alta</td>
<td style="text-align: right;">29</td>
<td style="text-align: right;">4.433</td>
<td style="text-align: right;">7</td>
<td style="text-align: right;">173</td>
</tr>
<tr class="odd">
<td>Média</td>
<td style="text-align: right;">68</td>
<td style="text-align: right;">2.150</td>
<td style="text-align: right;">63</td>
<td style="text-align: right;">747</td>
</tr>
<tr class="even">
<td>Baixa</td>
<td style="text-align: right;">26</td>
<td style="text-align: right;">539</td>
<td style="text-align: right;">56</td>
<td style="text-align: right;">489</td>
</tr>
<tr class="odd">
<td>Muito Baixa</td>
<td style="text-align: right;">129</td>
<td style="text-align: right;">1.929</td>
<td style="text-align: right;">14</td>
<td style="text-align: right;">110</td>
</tr>
</tbody>
</table>
<p>Os 11 grupos de prioridade <strong>muito alta</strong> somam quase 7 mil hectares, mais que os 129 grupos de prioridade muito baixa juntos. É esse o ganho de priorizar: quase 40% da área de alertas do ano está em menos de 3% dos grupos (11 de 403).</p>
</section>
<section id="armadilhas" class="level2">
<h2 class="anchored" data-anchor-id="armadilhas">Armadilhas</h2>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Aviso</span>Distância em graus
</div>
</div>
<div class="callout-body-container callout-body">
<p><code>AggregatePolygons</code> e <code>ST_ClusterDBSCAN</code> usam a <strong>unidade da camada</strong>. Com os dados em SIRGAS 2000 (graus), “60” quer dizer 60 graus. Reprojete para metros antes de agrupar, como em todos os códigos acima.</p>
</div>
</div>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Aviso</span>Velocidade de um alerta isolado
</div>
</div>
<div class="callout-body-container callout-body">
<p>Um grupo com um alerta só, detectado hoje, teria velocidade “área ÷ 0 dias”. O original dividia pela diferença até hoje; aqui o divisor tem mínimo de 1 dia. Escolha uma regra e escreva no relatório.</p>
</div>
</div>
<div class="callout callout-style-default callout-tip callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Dica</span>Os limites e os pesos são escolhas
</div>
</div>
<div class="callout-body-container callout-body">
<p>Os limites (30 ha, 4 alertas, 0,5 ha/dia…) e os pesos vieram da experiência de uma equipe com um tipo de alerta. Não são critérios oficiais. Teste outros valores e veja como a lista muda: se os primeiros lugares não mudam, a priorização é robusta.</p>
</div>
</div>
</section>
<section id="veja-também" class="level2">
<h2 class="anchored" data-anchor-id="veja-também">Veja também</h2>
<ul>
<li><a href="../guia-espacial/curso/05-priorizacao.html">Módulo 5 do curso: Priorização</a>, a versão em SQL com <code>WITH RECURSIVE</code></li>
<li><a href="../artigos/09-densidade-kernel.html">Densidade Kernel do desmatamento</a>, outra forma de ver concentração</li>
</ul>
<div class="navegacao-livro">
<p><a href="../artigos/11-relatorio-pdf.html" class="anterior"><span class="direcao">← Anterior</span> Relatório automático em PDF: o boletim que se escreve sozinho</a> <a href="../artigos/13-atualizar-camadas.html" class="proximo"><span class="direcao">Próximo →</span> Atualizar camadas sem duplicar: substituir, anexar e carga incremental</a></p>
</div>
</section>
<section id="atualizações" class="level2 unnumbered">
<h2 class="unnumbered anchored" data-anchor-id="atualizações">Atualizações</h2>
<ul>
<li><strong>29/10/2026:</strong> publicação, com dados do INPE, do MMA, do IBAMA e do SICAR de outubro de 2026.</li>
</ul>
<p><a href="https://hendesson.github.io/en/articles/12-prioritization-arcgis-qgis.html">English version</a></p>


</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> De volta ao topo</a><div id="quarto-appendix" class="default"><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Licença</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/deed.pt_br">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Como citar</h2><div><div class="quarto-appendix-secondary-label">BibTeX</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@misc{alves2026,
  author = {Alves, Hendesson},
  publisher = {Hendesson Alves},
  title = {Priorizar alertas em ArcGIS Pro, QGIS e Python},
  date = {2026-10-29},
  url = {https://hendesson.github.io/artigos/12-priorizacao-arcgis-qgis.html},
  doi = {10.5281/zenodo.23780268},
  langid = {pt-BR},
  abstract = {Agrupar alertas vizinhos, medir área, quantidade, tempo e
    velocidade de cada grupo e transformar tudo numa nota de prioridade.
    Com os parâmetros do script original, os 11 grupos de prioridade
    máxima concentram quase 40\% da área de alertas do ano.}
}
</code></pre><div class="quarto-appendix-secondary-label">Por favor, cite este trabalho como:</div><div id="ref-alves2026" class="csl-entry quarto-appendix-citeas">
Alves, Hendesson. 2026. <span>“Priorizar alertas em ArcGIS Pro, QGIS e
Python.”</span> In <em>Artigos de geoprocessamento para monitoramento
ambiental</em>. Preprint, Hendesson Alves, October 29. <a href="https://doi.org/10.5281/zenodo.23780268">https://doi.org/10.5281/zenodo.23780268</a>.
</div></div></section></div> ]]></description>
  <category>DETER</category>
  <category>Priorização</category>
  <guid>https://hendesson.github.io/artigos/12-priorizacao-arcgis-qgis.html</guid>
  <pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate>
  <media:content url="https://hendesson.github.io/imagens/artigos/priorizacao_grupos.png" medium="image" type="image/png" height="192" width="144"/>
</item>
<item>
  <title>Atualizar camadas sem duplicar: substituir, anexar e carga incremental</title>
  <dc:creator>Hendesson Alves</dc:creator>
  <link>https://hendesson.github.io/artigos/13-atualizar-camadas.html</link>
  <description><![CDATA[ 





<div class="ficha">
<p><span class="rotulo">Nível</span> Avançado <span class="rotulo">Leitura</span> 10 min <span class="rotulo">Dados</span> outubro de 2026 <span class="rotulo">Programas</span> <span class="selo-texto">ArcGIS</span> <img src="https://hendesson.github.io/imagens/ferramentas/qgis.svg" class="img-fluid" alt="QGIS"> <img src="https://hendesson.github.io/imagens/ferramentas/postgis.svg" class="img-fluid" alt="PostGIS"> <img src="https://hendesson.github.io/imagens/ferramentas/python.svg" class="img-fluid" alt="Python"></p>
</div>
<p>Quase todos os scripts da minha pasta terminavam do mesmo jeito: <strong>apagar</strong> as feições de uma camada e <strong>anexar</strong> as novas (<code>DeleteFeatures</code> + <code>Append</code>). Funciona, mas cada script reinventava a regra, e um erro no meio deixava a camada vazia ou duplicada.</p>
<p>Este artigo junta os quatro padrões que apareciam nos scripts e mostra o mais útil para o DETER, a <strong>carga incremental</strong>, com três armadilhas que só apareceram testando com os dados reais.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://hendesson.github.io/imagens/artigos/atualizacao.png" class="img-fluid figure-img" alt="Quatro painéis. Substituir tudo: a tabela inteira é trocada. Substituir um pedaço: só as linhas de um ano são trocadas. Anexar só o novo: linhas novas entram no fim. Inserir ou atualizar: linhas novas entram e as que já existem são atualizadas pela chave."></p>
<figcaption>Os quatro padrões de atualização.</figcaption>
</figure>
</div>
<section id="os-quatro-padrões" class="level2">
<h2 class="anchored" data-anchor-id="os-quatro-padrões">Os quatro padrões</h2>
<table class="caption-top table">
<colgroup>
<col style="width: 33%">
<col style="width: 33%">
<col style="width: 33%">
</colgroup>
<thead>
<tr class="header">
<th>Padrão</th>
<th>Quando usar</th>
<th>No script antigo</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><strong>1. Substituir tudo</strong></td>
<td>camada pequena, que a fonte publica inteira (embargos, UCs)</td>
<td><code>DeleteFeatures</code> + <code>Append</code> dos embargos do IBAMA</td>
</tr>
<tr class="even">
<td><strong>2. Substituir um pedaço</strong></td>
<td>dado por período que pode ser republicado (um ano do PRODES)</td>
<td>apagar o ano com <code>UpdateCursor</code> e anexar</td>
</tr>
<tr class="odd">
<td><strong>3. Anexar só o novo</strong></td>
<td>dado que só cresce (alertas diários)</td>
<td>pegar a data máxima e anexar o que é mais novo</td>
</tr>
<tr class="even">
<td><strong>4. Inserir ou atualizar</strong> (“upsert”)</td>
<td>quando um registro pode mudar depois de publicado</td>
<td>não existia: duplicava</td>
</tr>
</tbody>
</table>
<p>O padrão 2 está no artigo <a href="../artigos/03-prodes-ucs.html#atualizar-quando-sair-um-ano-novo">PRODES nas UCs</a>. Os padrões 1, 3 e 4 estão abaixo.</p>
</section>
<section id="substituir-tudo-sem-deixar-a-camada-vazia" class="level2">
<h2 class="anchored" data-anchor-id="substituir-tudo-sem-deixar-a-camada-vazia">1. Substituir tudo, sem deixar a camada vazia</h2>
<p>O risco do “apagar e anexar” é o script cair <strong>entre</strong> as duas etapas: a camada fica vazia até alguém perceber. Faça a troca de uma vez só:</p>
<table class="caption-top table">
<colgroup>
<col style="width: 50%">
<col style="width: 50%">
</colgroup>
<thead>
<tr class="header">
<th>Programa</th>
<th>Como</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>ArcGIS Pro</td>
<td><code>arcpy.management.TruncateTable(destino)</code> e <code>Append(novos, destino, "NO_TEST")</code>, dentro de um <code>with arcpy.da.Editor(gdb):</code> para desfazer se der erro</td>
</tr>
<tr class="even">
<td>QGIS</td>
<td><code>native:savefeatures</code> com <code>ACTION_ON_EXISTING_FILE = 1</code> (sobrescreve só a camada, numa operação)</td>
</tr>
<tr class="odd">
<td>PostGIS</td>
<td><code>BEGIN; TRUNCATE destino; INSERT INTO destino SELECT … FROM novos; COMMIT;</code></td>
</tr>
<tr class="even">
<td>Python</td>
<td><code>gdf.to_file("base.gpkg", layer="embargos")</code> grava a camada inteira de novo</td>
</tr>
</tbody>
</table>
</section>
<section id="e-4.-carga-incremental-do-deter" class="level2">
<h2 class="anchored" data-anchor-id="e-4.-carga-incremental-do-deter">3 e 4. Carga incremental do DETER</h2>
<p>O DETER publica alertas <strong>todos os dias</strong>. Baixar o serviço inteiro a cada vez é lento; o certo é pedir <strong>só o que mudou</strong> e juntar à base. A receita que funcionou, depois dos testes:</p>
<ol type="1">
<li>Descobrir a <strong>data mais recente</strong> da base.</li>
<li>Pedir ao servidor os alertas desde <strong>30 dias antes</strong> dessa data (a “janela de segurança”).</li>
<li>Comparar pela <strong>chave</strong> <code>gid</code> + <code>classname</code> + <code>view_date</code> e ficar só com o que falta.</li>
<li><strong>Anexar</strong> (ou, no PostGIS, inserir e atualizar o que mudou).</li>
</ol>
<p>Para testar, criei uma base “antiga”, só com os alertas até 30/09/2026, e rodei cada versão <strong>duas vezes seguidas</strong>.</p>
<div class="tabset-margin-container"></div><div class="panel-tabset" data-group="programa">
<ul class="nav nav-tabs"><li class="nav-item"><a class="nav-link active" id="tabset-1-1-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-1" aria-controls="tabset-1-1" aria-selected="true" href="">ArcGIS Pro</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-2-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-2" aria-controls="tabset-1-2" aria-selected="false" href="">QGIS</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-3-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-3" aria-controls="tabset-1-3" aria-selected="false" href="">PostGIS</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-4-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-4" aria-controls="tabset-1-4" aria-selected="false" href="">Python</a></li></ul>
<div class="tab-content" data-group="programa">
<div id="tabset-1-1" class="tab-pane active" aria-labelledby="tabset-1-1-tab">
<p>O ArcGIS Pro não filtra WFS por data na ferramenta <code>WFSToFeatureClass</code>. O jeito é pedir o GeoJSON filtrado ao servidor, como na aba Python, e converter com <code>JSONToFeatures</code>:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> arcpy</span>
<span id="cb1-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> urllib.parse</span>
<span id="cb1-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> urllib.request</span>
<span id="cb1-4"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> datetime <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> timedelta</span>
<span id="cb1-5"></span>
<span id="cb1-6">arcpy.env.overwriteOutput <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span></span>
<span id="cb1-7">base <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\r</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">esultados</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">gdb</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">eter_historico"</span></span>
<span id="cb1-8"></span>
<span id="cb1-9"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> chave(gid, classe, data):</span>
<span id="cb1-10">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""O gid sozinho se repete no DETER: a chave é código + classe + data."""</span></span>
<span id="cb1-11">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>gid<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">|</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>classe<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">|</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>(data)[:<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span></span>
<span id="cb1-12"></span>
<span id="cb1-13"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1. Até quando a base já tem dados? Buscar de novo os 30 dias anteriores</span></span>
<span id="cb1-14">campos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gid"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"classname"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>]</span>
<span id="cb1-15">existentes <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> {chave(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>linha) <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> linha <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> arcpy.da.SearchCursor(base, campos)}</span>
<span id="cb1-16">ultima <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">max</span>(linha[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>] <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> linha <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> arcpy.da.SearchCursor(base, campos))</span>
<span id="cb1-17">desde <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (ultima <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> timedelta(days<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">30</span>)).strftime(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"%Y-%m-</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%d</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb1-18"></span>
<span id="cb1-19"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2. Pedir ao servidor só a janela, só no recorte</span></span>
<span id="cb1-20">filtro <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"view_date &gt;= '</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>desde<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">' AND BBOX(geom,-56.5,-8.5,-54.5,-5.5,'EPSG:4674')"</span></span>
<span id="cb1-21">url <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"https://terrabrasilis.dpi.inpe.br/geoserver/deter-amz/ows?service=WFS&amp;version=2.0.0"</span></span>
<span id="cb1-22">       <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"&amp;request=GetFeature&amp;typeNames=deter-amz:deter_amz&amp;outputFormat=application/json"</span></span>
<span id="cb1-23">       <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"&amp;srsName=EPSG:4674&amp;CQL_FILTER=</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>urllib<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>parse<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>quote(filtro)<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb1-24">urllib.request.urlretrieve(url, <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">eter_janela</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">geojson"</span>)</span>
<span id="cb1-25">janela <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.conversion.JSONToFeatures(<span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"C:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ados</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">\d</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">eter_janela</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">.</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">geojson"</span>,</span>
<span id="cb1-26">                                         <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"memory</span><span class="er" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">janela"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"POLYGON"</span>)</span>
<span id="cb1-27"></span>
<span id="cb1-28"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 3. Só o que falta na base (a data vem como texto no GeoJSON)</span></span>
<span id="cb1-29">faltam <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [oid <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> oid, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>linha <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> arcpy.da.SearchCursor(janela, [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"OID@"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> campos)</span>
<span id="cb1-30">          <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> chave(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>linha) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">not</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> existentes]</span>
<span id="cb1-31"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"alertas novos:"</span>, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(faltam))</span>
<span id="cb1-32"></span>
<span id="cb1-33"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 4. Converter a data e anexar</span></span>
<span id="cb1-34"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> faltam:</span>
<span id="cb1-35">    novos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> arcpy.analysis.Select(janela, <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"memory</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\n</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">ovos"</span>,</span>
<span id="cb1-36">                                  <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"OBJECTID IN (</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">','</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>join(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">map</span>(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>, faltam))<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">)"</span>)</span>
<span id="cb1-37">    arcpy.management.CalculateField(</span>
<span id="cb1-38">        novos, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"data"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"datetime.datetime.strptime(!view_date![:10], '%Y-%m-</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%d</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">')"</span>,</span>
<span id="cb1-39">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"PYTHON3"</span>, field_type<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"DATE"</span>)</span>
<span id="cb1-40">    arcpy.management.DeleteField(novos, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>)</span>
<span id="cb1-41">    arcpy.management.AlterField(novos, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"data"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>)</span>
<span id="cb1-42">    arcpy.management.Append(novos, base, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"NO_TEST"</span>)</span></code></pre></div></div>
<p>O mesmo vale para uma camada do <strong>ArcGIS Online</strong>: use a URL do serviço (<code>.../FeatureServer/0</code>) como <code>base</code>, como os scripts originais faziam.</p>
</div>
<div id="tabset-1-2" class="tab-pane" aria-labelledby="tabset-1-2-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb2-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> processing</span>
<span id="cb2-2"></span>
<span id="cb2-3">BASE <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"C:/dados/deter_historico.gpkg"</span></span>
<span id="cb2-4">WFS <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"WFS:https://terrabrasilis.dpi.inpe.br/geoserver/deter-amz/ows"</span></span>
<span id="cb2-5">       <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"|layername=deter-amz:deter_amz"</span>)</span>
<span id="cb2-6">CAMPOS <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gid"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"classname"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"sensor"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"satellite"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"municipality"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"uf"</span>]</span>
<span id="cb2-7"></span>
<span id="cb2-8"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> chave(f):</span>
<span id="cb2-9">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""O gid sozinho se repete no DETER: a chave é código + classe + data."""</span></span>
<span id="cb2-10">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'gid'</span>]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">|</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'classname'</span>]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">|</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'view_date'</span>]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>toString(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'yyyy-MM-dd'</span>)<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span></span>
<span id="cb2-11"></span>
<span id="cb2-12"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1. Até quando a base já tem dados? Buscar de novo os 30 dias anteriores</span></span>
<span id="cb2-13">historico <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> QgsVectorLayer(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>BASE<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">|layername=deter"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"historico"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ogr"</span>)</span>
<span id="cb2-14">ultima <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> historico.maximumValue(historico.fields().indexOf(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>))</span>
<span id="cb2-15">desde <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ultima.addDays(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">30</span>).toString(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"yyyy-MM-dd"</span>)</span>
<span id="cb2-16">existentes <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> {chave(f) <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> f <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> historico.getFeatures()}</span>
<span id="cb2-17"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"base atual:"</span>, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(existentes), <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"alertas; buscando desde"</span>, desde)</span>
<span id="cb2-18"></span>
<span id="cb2-19"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2. Camada WFS filtrada no servidor (data) e pelo retângulo da área de interesse</span></span>
<span id="cb2-20">servidor <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> QgsVectorLayer(WFS, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"deter_wfs"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ogr"</span>)</span>
<span id="cb2-21">servidor.setSubsetString(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"view_date &gt;= '</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>desde<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">'"</span>)</span>
<span id="cb2-22">retangulo <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> QgsFeatureRequest().setFilterRect(QgsRectangle(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">56.5</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">8.5</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">54.5</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">5.5</span>))</span>
<span id="cb2-23">janela <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> servidor.materialize(retangulo)           <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># copia para a memória</span></span>
<span id="cb2-24"></span>
<span id="cb2-25"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 3. Ficar só com o que ainda não está na base, e só com os campos da base</span></span>
<span id="cb2-26">ids <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [f.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">id</span>() <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> f <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> janela.getFeatures() <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> chave(f) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">not</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> existentes]</span>
<span id="cb2-27">novos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> janela.materialize(QgsFeatureRequest().setFilterFids(ids))</span>
<span id="cb2-28">novos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> processing.run(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:retainfields"</span>, {</span>
<span id="cb2-29">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"INPUT"</span>: novos, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"FIELDS"</span>: CAMPOS, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"OUTPUT"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"memory:"</span>})[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"OUTPUT"</span>]</span>
<span id="cb2-30"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"alertas novos:"</span>, novos.featureCount())</span>
<span id="cb2-31"></span>
<span id="cb2-32"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 4. Acrescentar à camada da base (ação 2 = anexar, sem criar campos)</span></span>
<span id="cb2-33"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> novos.featureCount():</span>
<span id="cb2-34">    processing.run(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"native:savefeatures"</span>, {</span>
<span id="cb2-35">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"INPUT"</span>: novos, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"OUTPUT"</span>: BASE, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"LAYER_NAME"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"deter"</span>,</span>
<span id="cb2-36">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ACTION_ON_EXISTING_FILE"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>})</span>
<span id="cb2-37">depois <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> QgsVectorLayer(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>BASE<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">|layername=deter"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"depois"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ogr"</span>)</span>
<span id="cb2-38"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"base depois:"</span>, depois.featureCount(), <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"alertas"</span>)</span></code></pre></div></div>
<p>O <code>materialize</code> copia as feições para a memória sem passar pelo Processamento, que pararia nas geometrias inválidas do DETER (veja o artigo <a href="../artigos/02-interior-entorno.html">Interior e entorno</a>).</p>
</div>
<div id="tabset-1-3" class="tab-pane" aria-labelledby="tabset-1-3-tab">
<p>No banco, a chave vira uma <strong>chave primária</strong>, e o <code>INSERT … ON CONFLICT</code> insere o que é novo e atualiza o que já existe, numa única operação:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode sql code-with-copy"><code class="sourceCode sql"><span id="cb3-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-- Só na primeira vez: a base, a partir da camada deter do GeoPackage</span></span>
<span id="cb3-2"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">CREATE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">TABLE</span> artigos.deter_hist <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span></span>
<span id="cb3-3"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> gid, classname, view_date, sensor, satellite, municipality, uf, geom</span>
<span id="cb3-4"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.deter;</span>
<span id="cb3-5"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ALTER</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">TABLE</span> artigos.deter_hist <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ADD</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">PRIMARY</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">KEY</span> (gid, classname, view_date);</span>
<span id="cb3-6"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">CREATE</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">INDEX</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ON</span> artigos.deter_hist <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">USING</span> gist (geom);</span></code></pre></div></div>
<p>O script de atualização usa o <code>ogr2ogr</code> para trazer a janela do WFS:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb4-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#!/usr/bin/env bash</span></span>
<span id="cb4-2"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Carga incremental do DETER no PostGIS: só os alertas mais novos que os da base.</span></span>
<span id="cb4-3"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">set</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-euo</span> pipefail</span>
<span id="cb4-4"><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">BANCO</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>monitoramento_ambiental</span>
<span id="cb4-5"></span>
<span id="cb4-6"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1. Até quando a base já tem dados? Buscar de novo os 30 dias anteriores (janela de segurança)</span></span>
<span id="cb4-7"><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">DESDE</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">$(</span><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">psql</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-d</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">$BANCO</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-Atc</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SELECT max(view_date) - 30 FROM artigos.deter_hist"</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">)</span></span>
<span id="cb4-8"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">echo</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"buscando alertas desde </span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">$DESDE</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span></span>
<span id="cb4-9"></span>
<span id="cb4-10"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2. Trazer do WFS só a janela, para uma tabela de passagem</span></span>
<span id="cb4-11"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">ogr2ogr</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-f</span> PostgreSQL <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"PG:dbname=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">$BANCO</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span></span>
<span id="cb4-12">  <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"WFS:https://terrabrasilis.dpi.inpe.br/geoserver/deter-amz/ows"</span> deter-amz:deter_amz <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span></span>
<span id="cb4-13">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-nln</span> artigos.deter_novos <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-overwrite</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-nlt</span> MULTIPOLYGON <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-lco</span> GEOMETRY_NAME=geom <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span></span>
<span id="cb4-14">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-spat</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-56.5</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-8.5</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-54.5</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-5.5</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-where</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date &gt;= '</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">$DESDE</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'"</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span></span>
<span id="cb4-15">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-select</span> gid,classname,view_date,sensor,satellite,municipality,uf</span>
<span id="cb4-16"></span>
<span id="cb4-17"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 3. Inserir os novos; se a chave já existir, atualizar</span></span>
<span id="cb4-18"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">psql</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-d</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">$BANCO</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-v</span> ON_ERROR_STOP=1 <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-f</span> upsert.sql</span></code></pre></div></div>
<p>E o <code>upsert.sql</code>:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode sql code-with-copy"><code class="sourceCode sql"><span id="cb5-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">INSERT</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">INTO</span> artigos.deter_hist (gid, classname, view_date, sensor, satellite,</span>
<span id="cb5-2">                                municipality, uf, geom)</span>
<span id="cb5-3"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> gid, classname, view_date, sensor, satellite, municipality, uf, geom</span>
<span id="cb5-4"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.deter_novos</span>
<span id="cb5-5"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">ON</span> CONFLICT (gid, classname, view_date) DO <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">UPDATE</span></span>
<span id="cb5-6">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SET</span> geom <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> EXCLUDED.geom,</span>
<span id="cb5-7">        municipality <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> EXCLUDED.municipality;</span>
<span id="cb5-8"></span>
<span id="cb5-9"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">SELECT</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">count</span>(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> alertas, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">max</span>(view_date) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">AS</span> ate <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">FROM</span> artigos.deter_hist;</span></code></pre></div></div>
</div>
<div id="tabset-1-4" class="tab-pane" aria-labelledby="tabset-1-4-tab">
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb6-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> geopandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> gpd</span>
<span id="cb6-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> pd</span>
<span id="cb6-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> urllib.parse <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> quote</span>
<span id="cb6-4"></span>
<span id="cb6-5">BASE <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dados/deter_historico.gpkg"</span></span>
<span id="cb6-6">CAMPOS <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gid"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"classname"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"sensor"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"satellite"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"municipality"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"uf"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"geometry"</span>]</span>
<span id="cb6-7"></span>
<span id="cb6-8"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> chave(gdf):</span>
<span id="cb6-9">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""O gid sozinho se repete no DETER: a chave é código + classe + data."""</span></span>
<span id="cb6-10">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> gdf[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gid"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"|"</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> gdf[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"classname"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"|"</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> gdf[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>].astype(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>)</span>
<span id="cb6-11"></span>
<span id="cb6-12"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1. Até quando a base já tem dados? Buscar de novo os 30 dias anteriores (janela de segurança)</span></span>
<span id="cb6-13">historico <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.read_file(BASE, layer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"deter"</span>)</span>
<span id="cb6-14">ultima <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.to_datetime(historico[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"view_date"</span>]).<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">max</span>()</span>
<span id="cb6-15">desde <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (ultima <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> pd.Timedelta(days<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">30</span>)).date()</span>
<span id="cb6-16"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"base atual:"</span>, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(historico), <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"alertas, até"</span>, ultima.date(), <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"- buscando desde"</span>, desde)</span>
<span id="cb6-17"></span>
<span id="cb6-18"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2. Pedir ao servidor só a janela, só no recorte (o filtro roda no servidor)</span></span>
<span id="cb6-19">filtro <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"view_date &gt;= '</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>desde<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">' AND BBOX(geom,-56.5,-8.5,-54.5,-5.5,'EPSG:4674')"</span></span>
<span id="cb6-20">url <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"https://terrabrasilis.dpi.inpe.br/geoserver/deter-amz/ows?service=WFS&amp;version=2.0.0"</span></span>
<span id="cb6-21">       <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"&amp;request=GetFeature&amp;typeNames=deter-amz:deter_amz&amp;outputFormat=application/json"</span></span>
<span id="cb6-22">       <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"&amp;srsName=EPSG:4674&amp;CQL_FILTER=</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>quote(filtro)<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb6-23">novos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.read_file(url)</span>
<span id="cb6-24"></span>
<span id="cb6-25"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> novos.empty:</span>
<span id="cb6-26">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nada novo no servidor"</span>)</span>
<span id="cb6-27"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span>:</span>
<span id="cb6-28">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 3. Ficar só com o que ainda não está na base</span></span>
<span id="cb6-29">    novos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> novos.set_crs(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4674</span>, allow_override<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)[CAMPOS]</span>
<span id="cb6-30">    novos <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> novos[<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span>chave(novos).isin(chave(historico))]</span>
<span id="cb6-31">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 4. Acrescentar à mesma camada do GeoPackage</span></span>
<span id="cb6-32">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(novos):</span>
<span id="cb6-33">        novos.to_file(BASE, layer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"deter"</span>, mode<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"a"</span>)</span>
<span id="cb6-34">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"alertas acrescentados:"</span>, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(novos))</span>
<span id="cb6-35"></span>
<span id="cb6-36">depois <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.read_file(BASE, layer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"deter"</span>)</span>
<span id="cb6-37"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"base depois:"</span>, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(depois), <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"alertas; chaves repetidas:"</span>, chave(depois).duplicated().<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sum</span>())</span></code></pre></div></div>
</div>
</div>
</div>
</section>
<section id="conferindo-o-resultado" class="level2">
<h2 class="anchored" data-anchor-id="conferindo-o-resultado">Conferindo o resultado</h2>
<p>As três versões testadas (QGIS, PostGIS e Python) partiram da mesma base de 7.483 alertas:</p>
<table class="table-striped caption-top table">
<caption>Carga incremental do DETER no recorte de exemplo (dados até 16/10/2026).</caption>
<thead>
<tr class="header">
<th></th>
<th style="text-align: right;">1ª execução</th>
<th style="text-align: right;">2ª execução</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Base antes</td>
<td style="text-align: right;">7.483</td>
<td style="text-align: right;">7.823</td>
</tr>
<tr class="even">
<td>Alertas acrescentados</td>
<td style="text-align: right;">340</td>
<td style="text-align: right;">0</td>
</tr>
<tr class="odd">
<td>Base depois</td>
<td style="text-align: right;">7.823</td>
<td style="text-align: right;">7.823</td>
</tr>
<tr class="even">
<td>Chaves repetidas</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
</tbody>
</table>
<p>A segunda execução não acrescentou nada, que é o teste mais importante: um script de atualização precisa poder rodar duas vezes sem estragar a base.</p>
</section>
<section id="as-três-armadilhas-que-os-dados-mostraram" class="level2">
<h2 class="anchored" data-anchor-id="as-três-armadilhas-que-os-dados-mostraram">As três armadilhas que os dados mostraram</h2>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Aviso</span>1. O código do alerta se repete
</div>
</div>
<div class="callout-body-container callout-body">
<p>O campo <code>gid</code> parece um identificador, mas <strong>28 códigos</strong> do recorte aparecem em dois alertas diferentes (classe, data e lugar diferentes). Ex.: <code>36608_hist</code> é um desmatamento de março de 2024 <strong>e</strong> uma cicatriz de queimada de outubro de 2024. Com <code>gid</code> como chave, o PostGIS recusa a tabela; com ele num <code>isin</code>, alertas novos seriam descartados. A combinação <code>gid</code> + <code>classname</code> + <code>view_date</code> é única nos 7.823 alertas.</p>
</div>
</div>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Aviso</span>2. O filtro de data passa o último dia de novo
</div>
</div>
<div class="callout-body-container callout-body">
<p>Pelo <code>ogr2ogr</code>, o filtro <code>view_date &gt; '2026-10-16'</code> devolveu <strong>148 alertas do próprio dia 16</strong>. O servidor compara a data como data e hora, com fuso horário. O <code>ON CONFLICT</code> evitou a duplicação, mas um script que só anexa teria duplicado os 148. Moral: <strong>nunca confie só no filtro de data</strong>; compare pela chave.</p>
</div>
</div>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Aviso</span>3. Alertas publicados depois
</div>
</div>
<div class="callout-body-container callout-body">
<p>Um alerta pode entrar no serviço dias depois da data da imagem (<code>view_date</code>). Se o script só busca “o que é mais novo que a data máxima”, esse alerta nunca entra. A <strong>janela de 30 dias</strong> pega os atrasados, e a chave descarta o que já estava na base.</p>
</div>
</div>
</section>
<section id="agendar-e-levar-ao-power-bi" class="level2">
<h2 class="anchored" data-anchor-id="agendar-e-levar-ao-power-bi">Agendar e levar ao Power BI</h2>
<ul>
<li><strong>Agendar:</strong> Agendador de Tarefas do Windows ou <code>cron</code> (veja o artigo <a href="../artigos/04-focos-calor.html#rodar-sozinho-todo-dia">Focos de calor</a>). Rode uma vez por dia, de madrugada.</li>
<li><strong>Power BI:</strong> com a base atualizada no PostGIS, o painel do <a href="../guia-espacial/curso/07-power-bi.html">Módulo 7</a> só precisa de <strong>Atualizar</strong>. No serviço do Power BI, a atualização agendada de um banco que está no seu computador exige o <strong>gateway de dados local</strong> instalado e ligado.</li>
</ul>
</section>
<section id="veja-também" class="level2">
<h2 class="anchored" data-anchor-id="veja-também">Veja também</h2>
<ul>
<li><a href="../artigos/03-prodes-ucs.html">Desmatamento anual do PRODES nas UCs</a>, com o padrão 2</li>
<li><a href="../guia-espacial/curso/06-python.html">Módulo 6 do curso: Python + PostGIS</a>, para gravar no banco sem senha no código</li>
</ul>
<div class="navegacao-livro">
<p><a href="../artigos/12-priorizacao-arcgis-qgis.html" class="anterior"><span class="direcao">← Anterior</span> Priorizar alertas em ArcGIS Pro, QGIS e Python</a></p>
</div>
</section>
<section id="atualizações" class="level2 unnumbered">
<h2 class="unnumbered anchored" data-anchor-id="atualizações">Atualizações</h2>
<ul>
<li><strong>29/10/2026:</strong> publicação, com dados do INPE, do MMA, do IBAMA e do SICAR de outubro de 2026.</li>
</ul>
<p><a href="https://hendesson.github.io/en/articles/13-updating-layers.html">English version</a></p>


</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> De volta ao topo</a><div id="quarto-appendix" class="default"><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Licença</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/deed.pt_br">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Como citar</h2><div><div class="quarto-appendix-secondary-label">BibTeX</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@misc{alves2026,
  author = {Alves, Hendesson},
  publisher = {Hendesson Alves},
  title = {Atualizar camadas sem duplicar: substituir, anexar e carga
    incremental},
  date = {2026-10-29},
  url = {https://hendesson.github.io/artigos/13-atualizar-camadas.html},
  doi = {10.5281/zenodo.23780270},
  langid = {pt-BR},
  abstract = {Os quatro jeitos de atualizar uma base que recebe dados
    novos e a receita de carga incremental do DETER que sobrevive a três
    armadilhas reais: código repetido, filtro de data com fuso e alertas
    publicados com atraso.}
}
</code></pre><div class="quarto-appendix-secondary-label">Por favor, cite este trabalho como:</div><div id="ref-alves2026" class="csl-entry quarto-appendix-citeas">
Alves, Hendesson. 2026. <span>“Atualizar camadas sem duplicar:
substituir, anexar e carga incremental.”</span> In <em>Artigos de
geoprocessamento para monitoramento ambiental</em>. Preprint, Hendesson
Alves, October 29. <a href="https://doi.org/10.5281/zenodo.23780270">https://doi.org/10.5281/zenodo.23780270</a>.
</div></div></section></div> ]]></description>
  <category>DETER</category>
  <category>Automação</category>
  <guid>https://hendesson.github.io/artigos/13-atualizar-camadas.html</guid>
  <pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate>
  <media:content url="https://hendesson.github.io/imagens/artigos/atualizacao.png" medium="image" type="image/png" height="57" width="144"/>
</item>
</channel>
</rss>
