<?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>DeepWebGis</title>
<link>https://TODO-dominio.com.br/tutoriais/</link>
<atom:link href="https://TODO-dominio.com.br/tutoriais/index.xml" rel="self" type="application/rss+xml"/>
<description>Notebooks executáveis de sensoriamento remoto com Python: do STAC ao mapa final.</description>
<image>
<url>https://TODO-dominio.com.br/assets/img/og-default.jpg</url>
<title>DeepWebGis</title>
<link>https://TODO-dominio.com.br/tutoriais/</link>
</image>
<generator>quarto-1.10.19</generator>
<lastBuildDate>Tue, 13 Oct 2026 03:00:00 GMT</lastBuildDate>
<item>
  <title></title>
  <link>https://TODO-dominio.com.br/tutoriais/buscando-sentinel2-stac/</link>
  <description><![CDATA[ 



<header id="title-block-header" class="sr-tutorial-topo">
  <div class="sr-tutorial-imagem sr-mira">
    <img src="https://TODO-dominio.com.br/tutoriais/buscando-sentinel2-stac/thumbnail.webp" alt="Recorte em cor verdadeira do Sentinel-2 sobre lavouras de Sorriso, MT, com talhões retangulares em tons de verde e marrom." fetchpriority="high" decoding="async">
    <span class="sr-tutorial-imagem__coord">-12.55°, -55.72° · Sorriso, MT</span>
  </div>
  <div class="sr-tutorial-titulo">
    <span class="sr-rotulo">tutorial · 13 de outubro de 2026</span>
    <h1 class="title">Buscando imagens Sentinel-2 via STAC</h1>
    <p class="sr-tutorial-descricao">Encontre cenas Sentinel-2 por área, data e cobertura de nuvens no Microsoft Planetary Computer, sem login e sem download manual.</p>
  </div>
  <div class="sr-tutorial-meta">
    <dl class="sr-meta-linha">
      <div><dt>Nível</dt><dd><span class="sr-chip sr-chip--iniciante">Iniciante</span></dd></div>
      <div><dt>Tempo</dt><dd>15 min</dd></div>
      <div><dt>Área de estudo</dt><dd>Sorriso, MT</dd></div>
      <div class="sr-meta-linha--largo"><dt>Bibliotecas</dt><dd class="sr-tags"><span class="sr-banda"><b>py</b><span>pystac-client</span></span><span class="sr-banda"><b>py</b><span>planetary-computer</span></span><span class="sr-banda"><b>py</b><span>geopandas</span></span><span class="sr-banda"><b>py</b><span>rioxarray</span></span><span class="sr-banda"><b>py</b><span>matplotlib</span></span></dd></div>
    </dl>
    <div class="sr-mapa sr-mapa--mini" data-sr-mapa="mini" data-lat="-12.55" data-lon="-55.72" data-nivel="iniciante" aria-label="Mini-mapa da área de estudo: Sorriso, MT">
      <div class="sr-mapa__carregando">-12.55°, -55.72°</div>
    </div>
  </div>
  <div class="sr-tutorial-acoes">
    <a href="https://colab.research.google.com/github/TODO-usuario/sr-blog/blob/main/tutoriais/buscando-sentinel2-stac/index.ipynb"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Abrir no Colab" width="117" height="20"></a>
    <a href="../../tutoriais/buscando-sentinel2-stac/index.html" download="">⬇ Baixar o notebook (.ipynb)</a>
    <a href="https://github.com/TODO-usuario/sr-blog/blob/main/tutoriais/buscando-sentinel2-stac/index.ipynb">Ver no GitHub</a>
  </div>
</header>



<section id="objetivo" class="level2">
<h2 class="anchored" data-anchor-id="objetivo">Objetivo</h2>
<p>Antes de calcular qualquer índice, é preciso <strong>achar a imagem certa</strong>. Neste tutorial você vai usar o padrão <strong>STAC</strong> (<em>SpatioTemporal Asset Catalog</em>) para buscar cenas do Sentinel-2 no catálogo público do Microsoft Planetary Computer.</p>
<p>Ao final, você saberá:</p>
<ul>
<li>o que é um catálogo STAC e como ele organiza coleções, itens e <em>assets</em>;</li>
<li>buscar cenas por <strong>área</strong>, <strong>intervalo de datas</strong> e <strong>cobertura de nuvens</strong>;</li>
<li>transformar o resultado em uma tabela (<code>GeoDataFrame</code>) para filtrar e ordenar;</li>
<li>abrir só o recorte da cena que interessa, sem baixar o arquivo inteiro.</li>
</ul>
<p>A área de estudo é o entorno de <strong>Sorriso (MT)</strong>, um dos maiores produtores de grãos do país.</p>
</section>
<section id="pré-requisitos" class="level2">
<h2 class="anchored" data-anchor-id="pré-requisitos">Pré-requisitos</h2>
<ul>
<li>Python básico (listas, dicionários, funções).</li>
<li>Nenhuma conta ou chave de API: o Planetary Computer assina as URLs automaticamente.</li>
</ul>
<p>Bibliotecas usadas (todas no <code>environment.yml</code> do site):</p>
<table class="caption-top table">
<thead>
<tr class="header">
<th>Biblioteca</th>
<th>Para quê</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><code>pystac-client</code></td>
<td>conversar com a API STAC</td>
</tr>
<tr class="even">
<td><code>planetary-computer</code></td>
<td>assinar as URLs dos arquivos</td>
</tr>
<tr class="odd">
<td><code>geopandas</code></td>
<td>tabela com geometrias dos resultados</td>
</tr>
<tr class="even">
<td><code>rioxarray</code></td>
<td>ler o recorte da imagem (COG)</td>
</tr>
<tr class="odd">
<td><code>matplotlib</code></td>
<td>gráficos</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>Rodando no Colab
</div>
</div>
<div class="callout-body-container callout-body">
<p>Use o botão <strong>Abrir no Colab</strong> no topo da página e rode a célula abaixo antes das demais. No seu computador, com o ambiente do site ativo, ela não é necessária.</p>
</div>
</div>
<div id="e46430d9" class="cell" data-execution_count="1">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" 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;"># Descomente no Colab:</span></span>
<span id="cb1-2"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># !pip install -q pystac-client planetary-computer geopandas rioxarray matplotlib</span></span></code></pre></div></div>
</div>
<div id="11a2a91b" class="cell" data-execution_count="2">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" 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> geopandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> gpd</span>
<span id="cb2-2"><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="cb2-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> planetary_computer</span>
<span id="cb2-4"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pystac_client</span>
<span id="cb2-5"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> rioxarray  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># noqa: F401  (registra o acessor .rio)</span></span>
<span id="cb2-6"><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, shape</span>
<span id="cb2-7"></span>
<span id="cb2-8">plt.style.use(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dark_background"</span>)  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># opcional: gráficos no estilo escuro do site</span></span></code></pre></div></div>
</div>
</section>
<section id="acesso-aos-dados-o-catálogo-stac" class="level2">
<h2 class="anchored" data-anchor-id="acesso-aos-dados-o-catálogo-stac">Acesso aos dados: o catálogo STAC</h2>
<p>Um catálogo STAC tem três níveis:</p>
<ul>
<li><strong>Coleção</strong>: um conjunto de dados, como <code>sentinel-2-l2a</code> (reflectância de superfície já corrigida da atmosfera);</li>
<li><strong>Item</strong>: uma cena, com data, geometria e metadados (nuvens, órbita, tile…);</li>
<li><strong>Asset</strong>: cada arquivo do item, como uma banda (<code>B04</code>, <code>B08</code>) ou a composição colorida (<code>visual</code>).</li>
</ul>
<p>Abrimos o catálogo passando <code>modifier=planetary_computer.sign_inplace</code>, que assina cada URL para que possamos ler os arquivos diretamente.</p>
<div id="8ef723e6" class="cell" data-execution_count="3">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb3-1">catalogo <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pystac_client.Client.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">open</span>(</span>
<span id="cb3-2">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"https://planetarycomputer.microsoft.com/api/stac/v1"</span>,</span>
<span id="cb3-3">    modifier<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>planetary_computer.sign_inplace,</span>
<span id="cb3-4">)</span>
<span id="cb3-5">s2 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> catalogo.get_collection(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"sentinel-2-l2a"</span>)</span>
<span id="cb3-6"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(s2.title)</span>
<span id="cb3-7"><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;">"Extensão temporal:"</span>, s2.extent.temporal.intervals[<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;">0</span>].date(), <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"até hoje"</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>Sentinel-2 Level-2A
Extensão temporal: 2015-06-27 até hoje</code></pre>
</div>
</div>
</section>
<section id="definindo-a-busca" class="level2">
<h2 class="anchored" data-anchor-id="definindo-a-busca">Definindo a busca</h2>
<p>Vamos procurar cenas sobre um quadrado de cerca de 11 km ao redor de Sorriso, durante a <strong>estação seca de 2025</strong> (junho a setembro), quando o céu do Mato Grosso costuma estar limpo.</p>
<p>O filtro de nuvens usa a propriedade <code>eo:cloud_cover</code> de cada item, com a extensão <em>query</em> da API.</p>
<div id="77a8a0d0" class="cell" data-execution_count="4">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb5-1">lat, lon <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="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">12.55</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;">55.72</span></span>
<span id="cb5-2">d <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.05</span>  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># meio lado do quadrado, em graus (~5,5 km)</span></span>
<span id="cb5-3">bbox <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [lon <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> d, lat <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> d, lon <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> d, lat <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> d]</span>
<span id="cb5-4"></span>
<span id="cb5-5">busca <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> catalogo.search(</span>
<span id="cb5-6">    collections<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"sentinel-2-l2a"</span>],</span>
<span id="cb5-7">    bbox<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>bbox,</span>
<span id="cb5-8">    datetime<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"2025-06-01/2025-09-30"</span>,</span>
<span id="cb5-9">    query<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>{<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"eo:cloud_cover"</span>: {<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"lt"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>}},</span>
<span id="cb5-10">)</span>
<span id="cb5-11">itens <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> busca.item_collection()</span>
<span id="cb5-12"><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><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(itens)<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;"> cenas encontradas"</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>27 cenas encontradas</code></pre>
</div>
</div>
</section>
<section id="os-resultados-como-tabela" class="level2">
<h2 class="anchored" data-anchor-id="os-resultados-como-tabela">Os resultados como tabela</h2>
<p>Cada item é um <em>GeoJSON Feature</em>. O <code>geopandas</code> transforma a coleção inteira em uma tabela com geometria, o que facilita ordenar e filtrar.</p>
<div id="e31be5b0" class="cell" data-execution_count="5">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb7" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb7-1">gdf <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.GeoDataFrame.from_features(itens.to_dict(), 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:4326"</span>)</span>
<span id="cb7-2">gdf[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"id"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [i.<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> i <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> itens]</span>
<span id="cb7-3">gdf[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"data"</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;">"datetime"</span>].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>[:<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>]</span>
<span id="cb7-4">gdf[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tile"</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;">"s2:mgrs_tile"</span>]</span>
<span id="cb7-5">tabela <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;">"data"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"platform"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tile"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"eo:cloud_cover"</span>]].sort_values(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"data"</span>)</span>
<span id="cb7-6">tabela.head(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-display" data-execution_count="5">
<div>


<table class="dataframe caption-top table table-sm table-striped small" data-border="1">
<thead>
<tr class="header">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">data</th>
<th data-quarto-table-cell-role="th">platform</th>
<th data-quarto-table-cell-role="th">tile</th>
<th data-quarto-table-cell-role="th">eo:cloud_cover</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<th data-quarto-table-cell-role="th">26</th>
<td>2025-06-04</td>
<td>Sentinel-2C</td>
<td>21LXG</td>
<td>12.963872</td>
</tr>
<tr class="even">
<th data-quarto-table-cell-role="th">25</th>
<td>2025-06-06</td>
<td>Sentinel-2A</td>
<td>21LXG</td>
<td>0.138244</td>
</tr>
<tr class="odd">
<th data-quarto-table-cell-role="th">24</th>
<td>2025-06-09</td>
<td>Sentinel-2B</td>
<td>21LXG</td>
<td>0.002827</td>
</tr>
<tr class="even">
<th data-quarto-table-cell-role="th">23</th>
<td>2025-06-14</td>
<td>Sentinel-2C</td>
<td>21LXG</td>
<td>0.611727</td>
</tr>
<tr class="odd">
<th data-quarto-table-cell-role="th">22</th>
<td>2025-06-16</td>
<td>Sentinel-2A</td>
<td>21LXG</td>
<td>8.199535</td>
</tr>
<tr class="even">
<th data-quarto-table-cell-role="th">21</th>
<td>2025-06-19</td>
<td>Sentinel-2B</td>
<td>21LXG</td>
<td>8.898673</td>
</tr>
<tr class="odd">
<th data-quarto-table-cell-role="th">20</th>
<td>2025-06-26</td>
<td>Sentinel-2A</td>
<td>21LXG</td>
<td>0.083600</td>
</tr>
<tr class="even">
<th data-quarto-table-cell-role="th">19</th>
<td>2025-06-29</td>
<td>Sentinel-2B</td>
<td>21LXG</td>
<td>6.090753</td>
</tr>
<tr class="odd">
<th data-quarto-table-cell-role="th">18</th>
<td>2025-07-06</td>
<td>Sentinel-2A</td>
<td>21LXG</td>
<td>0.123832</td>
</tr>
<tr class="even">
<th data-quarto-table-cell-role="th">17</th>
<td>2025-07-09</td>
<td>Sentinel-2B</td>
<td>21LXG</td>
<td>0.001553</td>
</tr>
</tbody>
</table>

</div>
</div>
</div>
<p>O Sentinel-2 é distribuído em <em>tiles</em> da grade MGRS, quadrados de 110 × 110 km. A coluna <code>tile</code> diz em qual deles cada cena está. Se a sua área cair na borda entre dois tiles, a mesma data aparece duas vezes, uma por tile. Vamos ver onde a nossa área fica.</p>
<div id="acc42d61" class="cell" data-execution_count="6">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb8" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb8-1">aoi <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>[box(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>bbox)], 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:4326"</span>)</span>
<span id="cb8-2"></span>
<span id="cb8-3">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="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>))</span>
<span id="cb8-4">gdf.drop_duplicates(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tile"</span>).plot(</span>
<span id="cb8-5">    ax<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ax,</span>
<span id="cb8-6">    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;">"tile"</span>,</span>
<span id="cb8-7">    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.35</span>,</span>
<span id="cb8-8">    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;">"white"</span>,</span>
<span id="cb8-9">    legend<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="cb8-10">    legend_kwds<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>{<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"title"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Tile MGRS"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"loc"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"upper left"</span>},</span>
<span id="cb8-11">)</span>
<span id="cb8-12">aoi.boundary.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;">"#FF7A45"</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;">2.5</span>)</span>
<span id="cb8-13">ax.set_title(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Footprints dos tiles e área de interesse (laranja)"</span>)</span>
<span id="cb8-14">ax.set_xlabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Longitude"</span>)</span>
<span id="cb8-15">ax.set_ylabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Latitude"</span>)</span>
<span id="cb8-16">plt.show()</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://TODO-dominio.com.br/tutoriais/buscando-sentinel2-stac/index_files/figure-html/cell-7-output-1.png" width="527" height="523" class="figure-img"></p>
</figure>
</div>
</div>
</div>
<p>E a cobertura de nuvens ao longo da estação seca:</p>
<div id="16df9b22" class="cell" data-execution_count="7">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb9" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb9-1">por_data <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gdf.groupby(<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;">"eo:cloud_cover"</span>].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">min</span>()</span>
<span id="cb9-2"></span>
<span id="cb9-3">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;">8</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">3.2</span>))</span>
<span id="cb9-4">ax.bar(por_data.index, por_data.values, 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;">"#22D3EE"</span>)</span>
<span id="cb9-5">ax.axhline(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>, 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;">"#FF7A45"</span>, ls<span 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>, lw<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>, 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;">"5%"</span>)</span>
<span id="cb9-6">ax.set_ylabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Nuvens (%)"</span>)</span>
<span id="cb9-7">ax.set_title(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Cobertura de nuvens por data"</span>)</span>
<span id="cb9-8">ax.tick_params(axis<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"x"</span>, rotation<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>, labelsize<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="cb9-9">ax.legend()</span>
<span id="cb9-10">plt.tight_layout()</span>
<span id="cb9-11">plt.show()</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://TODO-dominio.com.br/tutoriais/buscando-sentinel2-stac/index_files/figure-html/cell-8-output-1.png" width="747" height="294" class="figure-img"></p>
</figure>
</div>
</div>
</div>
</section>
<section id="escolhendo-a-melhor-cena" class="level2">
<h2 class="anchored" data-anchor-id="escolhendo-a-melhor-cena">Escolhendo a melhor cena</h2>
<p>Ficamos com a cena de <strong>menor cobertura de nuvens</strong> cujo footprint <strong>contém toda a área de interesse</strong> (assim não precisamos fazer mosaico).</p>
<div id="164dca5e" class="cell" data-execution_count="8">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb10" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb10-1">area <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> box(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>bbox)</span>
<span id="cb10-2">cobrem <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [i <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> itens <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> shape(i.geometry).contains(area)]</span>
<span id="cb10-3"><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><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(cobrem)<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;"> de </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;">len</span>(itens)<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;"> cenas cobrem toda a área"</span>)</span>
<span id="cb10-4"></span>
<span id="cb10-5">melhor <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;">min</span>(cobrem, key<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> i: i.properties[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"eo:cloud_cover"</span>])</span>
<span id="cb10-6"></span>
<span id="cb10-7"><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;">"Cena:"</span>, melhor.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">id</span>)</span>
<span id="cb10-8"><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:"</span>, melhor.datetime.date())</span>
<span id="cb10-9"><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"Nuvens: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>melhor<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>properties[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'eo:cloud_cover'</span>]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:.2f}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">%"</span>)</span>
<span id="cb10-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;">"Assets disponíveis:"</span>, <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>(melhor.assets)))</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>27 de 27 cenas cobrem toda a área
Cena: S2A_MSIL2A_20250726T140111_R067_T21LXG_20250726T183013
Data: 2025-07-26
Nuvens: 0.00%
Assets disponíveis: AOT, B01, B02, B03, B04, B05, B06, B07, B08, B09, B11, B12, B8A, SCL, WVP, datastrip-metadata, granule-metadata, inspire-metadata, product-metadata, rendered_preview, safe-manifest, tilejson, visual</code></pre>
</div>
</div>
<p>Cada asset é um <strong>COG</strong> (<em>Cloud Optimized GeoTIFF</em>): um GeoTIFF organizado em blocos, que permite ler só a janela que interessa via HTTP. É isso que vamos fazer com o asset <code>visual</code>, a composição em cor verdadeira (B04, B03, B02) já pronta, em 8 bits.</p>
<div id="69bc70a4" class="cell" data-execution_count="9">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb12" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb12-1">visual <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rioxarray.open_rasterio(melhor.assets[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"visual"</span>].href)</span>
<span id="cb12-2"><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;">"Cena completa:"</span>, visual.shape, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"pixels — CRS"</span>, visual.rio.crs)</span>
<span id="cb12-3"></span>
<span id="cb12-4">recorte <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> visual.rio.clip_box(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>bbox, 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:4326"</span>)</span>
<span id="cb12-5"><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;">"Recorte:"</span>, recorte.shape)</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>Cena completa: (3, 10980, 10980) pixels — CRS EPSG:32721
Recorte: (3, 1112, 1093)</code></pre>
</div>
</div>
</section>
<section id="visualização-do-resultado" class="level2">
<h2 class="anchored" data-anchor-id="visualização-do-resultado">Visualização do resultado</h2>
<p>O recorte tem pouco mais de mil pixels de lado (10 m de resolução). Os talhões retangulares das lavouras e as matas ciliares ao longo dos rios ficam bem visíveis.</p>
<div id="b56a327c" class="cell" data-execution_count="10">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb14" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb14-1">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;">8</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>))</span>
<span id="cb14-2">recorte.plot.imshow(ax<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ax)</span>
<span id="cb14-3">ax.set_title(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"Sentinel-2 · cor verdadeira · </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>melhor<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>datetime<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><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> · Sorriso (MT)"</span>)</span>
<span id="cb14-4">ax.set_xlabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"x (m, UTM)"</span>)</span>
<span id="cb14-5">ax.set_ylabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"y (m, UTM)"</span>)</span>
<span id="cb14-6">ax.set_aspect(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"equal"</span>)</span>
<span id="cb14-7">plt.show()</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://TODO-dominio.com.br/tutoriais/buscando-sentinel2-stac/index_files/figure-html/cell-11-output-1.png" width="667" height="672" class="figure-img"></p>
</figure>
</div>
</div>
</div>
<p>Por fim, salvamos uma miniatura sem eixos. É ela que aparece no card deste tutorial no site.</p>
<div id="7d4284ad" class="cell" data-execution_count="11">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb15" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb15-1">img <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> recorte.transpose(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"y"</span>, <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;">"band"</span>).values</span>
<span id="cb15-2">altura <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> img.shape[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]</span>
<span id="cb15-3">faixa <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> img[<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>(altura <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="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>(altura <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> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>(img.shape[<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="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">9</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;">16</span>)]  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># recorte 16:9</span></span>
<span id="cb15-4"></span>
<span id="cb15-5">fig <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> plt.figure(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;">8</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">4.5</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>)</span>
<span id="cb15-6">ax <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> fig.add_axes([<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;">0</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;">1</span>])</span>
<span id="cb15-7">ax.imshow(faixa)</span>
<span id="cb15-8">ax.axis(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"off"</span>)</span>
<span id="cb15-9">fig.savefig(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"thumbnail.webp"</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>)</span>
<span id="cb15-10">plt.close(fig)</span></code></pre></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">
<span class="screen-reader-only">Nota</span>Créditos
</div>
</div>
<div class="callout-body-container callout-body">
<p>Contains modified Copernicus Sentinel data 2025, acessados pelo Microsoft Planetary Computer.</p>
</div>
</div>
</section>
<section id="exercícios" class="level2">
<h2 class="anchored" data-anchor-id="exercícios">Exercícios</h2>
<ol type="1">
<li>Troque a área para o <strong>entorno de Brasília</strong> (<code>lat, lon = -15.78, -47.93</code>) e repita a busca. Quantas cenas com menos de 5% de nuvens existem entre junho e setembro?</li>
<li>Busque cenas da <strong>estação chuvosa</strong> (dezembro a fevereiro) em Sorriso. Como muda a cobertura de nuvens?</li>
<li>Use <code>query={"s2:mgrs_tile": {"eq": "21LXG"}}</code> (ou o tile que apareceu no seu mapa) para restringir a busca a um único tile.</li>
<li>Repita o recorte com o asset <code>B08</code> (infravermelho próximo). O que acontece com a vegetação?</li>
</ol>
</section>
<section id="referências" class="level2">
<h2 class="anchored" data-anchor-id="referências">Referências</h2>
<ul>
<li><a href="https://stacspec.org/">Especificação STAC</a></li>
<li><a href="https://pystac-client.readthedocs.io/">Documentação do pystac-client</a></li>
<li><a href="https://planetarycomputer.microsoft.com/dataset/sentinel-2-l2a">Microsoft Planetary Computer: Sentinel-2 L2A</a></li>
<li><a href="https://cogeo.org/">Cloud Optimized GeoTIFF</a></li>
<li><a href="https://sentiwiki.copernicus.eu/web/s2-mission">Sentinel-2 User Handbook (ESA)</a></li>
</ul>


</section>

 ]]></description>
  <category>stac</category>
  <category>sentinel-2</category>
  <category>pystac-client</category>
  <guid>https://TODO-dominio.com.br/tutoriais/buscando-sentinel2-stac/</guid>
  <pubDate>Tue, 13 Oct 2026 03:00:00 GMT</pubDate>
  <media:content url="https://TODO-dominio.com.br/tutoriais/buscando-sentinel2-stac/thumbnail.webp" medium="image" type="image/webp"/>
</item>
</channel>
</rss>
