Cooperativismo, floresta e renda na Amazônia — dados
  • Início
  • Mapa principal
  • Catálogo de bases
  • Indicadores
  • Mapas
    • Desmatamento e áreas protegidas (mapa principal)
    • Municípios da Amazônia Legal
    • Áreas designadas e entorno
    • Setores censitários
    • Cooperativas e associações
    • Cooperados × não cooperados (Censo Agro, por UF)
    • Páginas dos municípios do Acre
  • Análises
    • Pressão por desmatamento nas reservas extrativistas
  • Metodologia
    • Níveis de análise e definições
    • Metodologia dos cruzamentos
    • Registro de decisões
    • Política de dados
    • Dados para baixar
  • Sobre
    • Sobre o site
    • Pendências e próximos passos
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 === new URLSearchParams(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(new Set(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>`);
  return html`<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 = new Promise(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;
}
{
  const m = await mapa.pronto;
  mapa.variavel = escolha;
  mapa.ano = ano;
  m.getSource("mun").setData({type: "FeatureCollection", features: geo.features.map(f => ({...f, properties: {...f.properties, _v: valores[f.properties.cod_mun]}}))});
  m.setPaintProperty("mun-fill", "fill-color", expressao);
  return html`<span></span>`;
}

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(new Map([["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 < 760
Plot.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.

Gerado em 03/11/2026 22:41 a partir do commit 2209fa1 do repositório do projeto. Dados: PRODES Amazônia Legal v20260408 (raster) e PRODES Cerrado v20260407 (INPE), com as manchas de 1–6,25 ha do PRODES bioma Amazônia vetorial v20260717 — outra versão que a do raster; limite da Amazônia Legal 2024 (IBGE); demais versões nas páginas de cada fonte.

Projeto UFAC · IESP-UERJ · IFAC (2026–2029). Versão de trabalho — dados preliminares, não citar.