Versão de trabalho para a equipe do projeto · dados preliminares, não citar
Municípios da Amazônia Legal
Cooperativismo (Censo Agro 2017), produção extrativista, rebanho bovino e desmatamento
NotaComo ler este mapa
Município não é produtor. Estes mapas descrevem municípios. Um município com muitos produtores associados a cooperativas e pouco desmatamento não mostra que os cooperados desmatam menos: cooperativas, estradas, mercados e áreas protegidas não estão distribuídos ao acaso.
Manchas pequenas. Até 2021 o INPE só registrava desmatamentos a partir de 6,25 ha (quase nove campos de futebol). Desde 2022 registra também os de 1 a 6,25 ha, e eles estão incluídos aqui; os menores que 1 ha — parte dos roçados de uma família, que costumam ter de 0,5 a 2 ha — continuam fora.
Cores por quintis: cada cor reúne um quinto dos municípios com dado. Quando muitos municípios têm zero, o zero ganha cor própria e os quintis valem para os demais. Nas variáveis por ano (PEVS, PAM, PPM), os quintis são recalculados a cada ano: a cor compara municípios no mesmo ano, não um ano com outro — para isso, veja os valores na janela de cada município. Sobre os limites de cada fonte, ver definições e indicadores.
import {fmt, caixa, opcoesMapa, janela, numeroPt} from"../assets/mapas.js"maplibregl =require("maplibre-gl@4.7.1/dist/maplibre-gl.js")css =html`<link rel="stylesheet" href="https://unpkg.com/maplibre-gl@4.7.1/dist/maplibre-gl.css">`geo =FileAttachment("../gerado/dados/municipios_al.geojson").json()base =FileAttachment("../gerado/dados/indicadores_municipais.json").json()// Variáveis de um ano só (Censo Agro, desmatamento acumulado...) e variáveis com série anual (PEVS, PAM,// PPM), cujos valores ficam num arquivo à parte, baixado só quando uma delas é escolhida.variaveis = [...base.variaveis.map(v => ({...v,tipo:"fixo"})),...(base.variaveis_serie?? [])]ANOS = base.anos_serie?? [2025]CORES = ["#f0f9e8","#bae4bc","#7bccc4","#43a2ca","#0868ac"]SEM_DADO ="#d9d9d9"
viewof escolha = Inputs.select(variaveis, {label:"Indicador",format: v => v.rotulo+ (v.tipo==="serie"?" — por ano":""),value: variaveis.find(v => v.id===newURLSearchParams(window.location.search).get("indicador")) ?? variaveis.find(v => v.id==="pct_estab_coop")})viewof ano = Inputs.range([ANOS[0], ANOS[ANOS.length-1]], {label:"Ano",step:1,value: ANOS[ANOS.length-1],format: x =>String(x),disabled: escolha.tipo!=="serie"})serieDados = escolha.tipo==="serie"?FileAttachment("../gerado/dados/series_municipais.json").json() :null// Valor de cada município na variável (e no ano) escolhidos; nas séries de valor e quantidade, média de 3 anos.valores = {const out = {};for (const f of geo.features) {const cod = f.properties.cod_mun;if (escolha.tipo!=="serie") { out[cod] = base.municipios[cod]?.[escolha.id] ??null;continue; }const arr = serieDados.valores[escolha.id]?.[cod];const i = ano - ANOS[0];if (!arr) { out[cod] =null;continue; }const janelaAnos = escolha.media3? arr.slice(Math.max(0, i -2), i +1).filter(x => x !=null) : [arr[i]].filter(x => x !=null); out[cod] = janelaAnos.length? d3.mean(janelaAnos) :null; }return out;}// Classes de cor: quintis dos municípios com dado; se houver zeros, o zero ganha a primeira cor e os// quintis (agora quatro classes) valem só para os positivos. Legenda e pintura usam os mesmos cortes.escala = {const vals =Object.values(valores).filter(v => v !=null);const zero = vals.some(v => v ===0);const pos = zero ? vals.filter(v => v >0) : vals;const coresPos = zero ? CORES.slice(1) : CORES;const cortes =Array.from(newSet(d3.scaleQuantile().domain(pos).range(coresPos).quantiles()));return {zero, cortes,cores: coresPos.slice(0, cortes.length+1),min: d3.min(pos),max: d3.max(pos)};}expressao = {const passos = ["step", ["get","_v"], escala.cores[0]]; escala.cortes.forEach((c, i) => passos.push(c, escala.cores[i +1]));const comZero = escala.zero? ["case", ["==", ["get","_v"],0], CORES[0], passos] : passos;return ["case", ["==", ["get","_v"],null], SEM_DADO, comZero];}legenda = {const lim = [escala.min,...escala.cortes, escala.max];// com a classe "zero", a primeira classe positiva começa logo acima de zero (e não no menor valor, que arredondado viraria "0%")const ini = i => escala.zero&& i ===0?"acima de 0":fmt(lim[i], escolha.formato);const itens = escala.cores.map((c, i) =>html`<div>${caixa(c)}${ini(i)} – ${fmt(lim[i +1], escolha.formato)}</div>`);returnhtml`<div class="legenda-mapa">${escala.zero?html`<div>${caixa(CORES[0])}zero</div>`:""}${itens} <div>${caixa(SEM_DADO)}sem dado (${escolha.sem_dado??"sem informação"})</div> <p><small>${escolha.nota}</small></p></div>`;}
mapa = {const div =html`<div class="mapa"></div>`; div.pronto=newPromise(resolve => {setTimeout(() => {const m =new maplibregl.Map(opcoesMapa(div)); m.addControl(new maplibregl.NavigationControl({showCompass:false})); m.on("load", () => {const rotulos = m.getStyle().layers.find(l => l.type==="symbol")?.id; m.addSource("mun", {type:"geojson",data: geo,attribution:"IBGE, INPE/PRODES"}); m.addLayer({id:"mun-fill",type:"fill",source:"mun",paint: {"fill-color": SEM_DADO,"fill-opacity":0.85}}, rotulos); m.addLayer({id:"mun-line",type:"line",source:"mun",paint: {"line-color":"#ffffff","line-width":0.3}}, rotulos);janela(maplibregl, m, ["mun-fill"], fs => {const p = fs[0].properties, v = div.variavel;const num = x => (x ==null|| x ==="null") ?null:+x;const val =num(p._v), absol = v.absoluto?num(base.municipios[p.cod_mun]?.[v.absoluto]) :null;const abs = absol !=null?`<br><small>${fmt(absol,Number.isInteger(absol) ?"int":"num")}${v.rotulo_absoluto}</small>`:"";const quando = v.tipo==="serie"?` (${div.ano}${v.media3?`, média de ${div.ano-2}–${div.ano}`:""})`:"";const pagina = p.uf==="AC"?`<br><a href="../gerado/municipios/${p.cod_mun}.html">Página do município →</a>`:"";return`<strong>${p.nome} (${p.uf})</strong><br>${v.rotulo}${quando}: <strong>${fmt(val, v.formato)}</strong>${abs}${pagina}`; });resolve(m); }); },0); }); invalidation.then(async () => (await div.pronto).remove());return div;}
Extrativismo não madeireiro por estrato, ao longo do tempo
Valor (em reais de 2025, IPCA) e quantidade da extração de açaí, castanha-do-pará e borracha, e o valor dos demais produtos não madeireiros, na PEVS. O valor mostra sobretudo o preço do açaí; a quantidade, o volume extraído. O açaí cultivado não está aqui: ele está na PAM (a variável “Açaí cultivado” do mapa acima, só desde 2015) — parte da queda do açaí extrativo pode ser migração para o plantado.
extr =FileAttachment("../gerado/dados/extrativismo_estrato_ano.json").json()viewof medida = Inputs.radio(newMap([["Parcela do valor (%)","parcela"], ["Valor (R$ milhões de 2025)","valor"], ["Quantidade (mil toneladas)","quantidade"]]), {label:"Medida",value:"parcela"})extrLongo = extr.flatMap(d => (medida !=="quantidade"? [["Açaí", d.acai], ["Castanha-do-pará", d.castanha], ["Borracha (látex)", d.borracha], ["Outros não madeireiros", d.outros]].map(([produto, v]) => ({estrato: d.estrato,ano: d.ano, produto,v: v /1e3})): [["Açaí", d.q_acai], ["Castanha-do-pará", d.q_castanha], ["Borracha (látex)", d.q_borracha]].map(([produto, v]) => ({estrato: d.estrato,ano: d.ano, produto,v: v /1e3}))))Plot.plot({width:Math.min(width,1300),height: width <760?900:300,marginLeft:55,facet: {data: extrLongo, [width <760?"y":"x"]:"estrato",label:null},fx: {domain: ["Acre","AM, RR e AP","Pará","MT e RO","MA e TO"]},fy: {domain: ["Acre","AM, RR e AP","Pará","MT e RO","MA e TO"]},x: {label:"Ano",tickFormat: d =>String(d),ticks: [2005,2015,2025]},y: {label: {parcela:"parcela do valor não madeireiro (%)",valor:"R$ milhões de 2025",quantidade:"mil toneladas"}[medida],grid:true,tickFormat: medida ==="parcela"? (v =>numeroPt(0)(100* v)) :numeroPt(0)},color: {legend:true,domain: ["Açaí","Castanha-do-pará","Borracha (látex)","Outros não madeireiros"],range: ["#6a1b9a","#8d6e63","#2e7d32","#bdbdbd"]},marks: [Plot.areaY(extrLongo, Plot.stackY({x:"ano",y:"v",fill:"produto",order: ["Açaí","Castanha-do-pará","Borracha (látex)","Outros não madeireiros"],offset: medida ==="parcela"?"normalize":null,tip: {format: {x: d =>String(d),y:false}}}))]})
Associação a cooperativa e desmatamento recente, por estrato
Cada ponto é um município; o tamanho é o número de estabelecimentos agropecuários. Eixo horizontal: estabelecimentos com produtor associado a cooperativa (Censo Agro 2017). Eixo vertical: parte da floresta de 2007 desmatada em 2017–2025 (PRODES, só a parte do município no bioma Amazônia; desde 2022 inclui as manchas de 1 a 6,25 ha). É uma descrição, não um efeito — ver o aviso no topo.
pontos =Object.entries(base.municipios).map(([cod, m]) => ({cod,...m})).filter(m => m.pct_estab_coop!=null&& m.frac_desm_total_2017_2025_floresta!=null)ESTRATOS = ["Acre","AM, RR e AP","Pará","MT e RO","MA e TO"]// Em tela estreita, os estratos ficam um embaixo do outro (lado a lado ficariam ilegíveis).estreito = width <760Plot.plot({width: estreito ? width :1400,height: estreito ?5*240:440,marginLeft:50,facet: {data: pontos, [estreito ?"y":"x"]:"estrato",label:null},fx: {domain: ESTRATOS},fy: {domain: ESTRATOS},x: {label:"Associados a cooperativa (%)",percent:true,grid:true,tickFormat:numeroPt(1)},y: {label:"Floresta de 2007 desmatada em 2017–2025 (%)",percent:true,grid:true,tickFormat:numeroPt(1)},r: {range: [1.5,9]},marks: [ Plot.dot(pontos, {x:"pct_estab_coop",y:"frac_desm_total_2017_2025_floresta",r:"estab_total",fill:"#43a2ca",fillOpacity:0.55,stroke:"#0868ac",strokeWidth:0.4,tip:true,title: d =>`${d.nome} (${d.uf})\nAssociados a cooperativa: ${fmt(d.pct_estab_coop,"pct")}\nDesmatado 2017–2025: ${fmt(d.frac_desm_total_2017_2025_floresta,"pct")}\nEstabelecimentos: ${fmt(d.estab_total,"int")}`}) ]})
Resumo por estrato (percentuais calculados como soma ÷ soma, não média de municípios):
Estrato
Municípios
Estabelecimentos (2017)
Associados a cooperativa
Em associação de moradores
Estab. dentro de UC de uso sustentável
Floresta de 2007 desmatada em 2008–2025
Bovinos 2025 (milhões)
AM, RR e AP
93
106.312
3,9%
5,8%
6.453
1,5% (25.851 km²)
4,0
Acre
22
37.356
4,1%
8,9%
3.766
6,0% (8.711 km²)
5,2
MA e TO
320
230.368
1,1%
6,9%
436
13,7% (4.173 km²)
21,3
MT e RO
194
210.117
9,5%
3,2%
878
11,0% (45.483 km²)
48,7
Pará
144
281.699
2,0%
5,1%
5.922
6,7% (60.183 km²)
25,6
Dados: tabela completa por município, com dicionário de colunas, no repositório do projeto (amazonia-legal/output/05-painel-municipal/). Método e conferências: metodologia dos cruzamentos.