<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog do Fernando Quadro</title>
	<atom:link href="https://www.fernandoquadro.com.br/html/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.fernandoquadro.com.br/html</link>
	<description></description>
	<lastBuildDate>Tue, 21 Apr 2026 14:42:13 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://www.fernandoquadro.com.br/html/wp-content/uploads/2010/09/GeoServer_MARK.png</url>
	<title>Blog do Fernando Quadro</title>
	<link>https://www.fernandoquadro.com.br/html</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Curso WebGIS com PostGIS, GeoServer 3 e GeoNode 5</title>
		<link>https://www.fernandoquadro.com.br/html/2026/04/21/curso-webgis-com-postgis-geoserver-3-e-geonode-5/</link>
					<comments>https://www.fernandoquadro.com.br/html/2026/04/21/curso-webgis-com-postgis-geoserver-3-e-geonode-5/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Quadro]]></dc:creator>
		<pubDate>Tue, 21 Apr 2026 14:42:13 +0000</pubDate>
				<category><![CDATA[GIS]]></category>
		<category><![CDATA[GeoNode]]></category>
		<category><![CDATA[GeoServer]]></category>
		<category><![CDATA[PostGIS]]></category>
		<category><![CDATA[WebGIS]]></category>
		<guid isPermaLink="false">https://www.fernandoquadro.com.br/html/?p=10302</guid>

					<description><![CDATA[Se você já trabalha com dados geoespaciais, provavelmente domina análise. Mas deixa eu te provocar: 👉 Você sabe transformar isso em uma solução acessível na web? Porque existe uma diferença enorme entre: ✔ Gerar mapas ✔ E entregar uma plataforma... <a class="more-link" href="https://www.fernandoquadro.com.br/html/2026/04/21/curso-webgis-com-postgis-geoserver-3-e-geonode-5/">Continue Reading &#8594;</a>]]></description>
										<content:encoded><![CDATA[<p>Se você já trabalha com dados geoespaciais, provavelmente domina análise. Mas deixa eu te provocar:</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Você sabe transformar isso em uma <strong>solução acessível na web</strong>?</p>
<p>Porque existe uma diferença enorme entre:</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Gerar mapas<br />
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> E entregar uma plataforma que outras pessoas realmente usam</p>
<p>E é exatamente aí que entra o WebGIS.</p>
<p>Hoje, quem se destaca <strong>não é só quem analisa dados</strong>… É quem consegue:</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Centralizar informações<br />
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Publicar serviços padronizados (OGC)<br />
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Criar aplicações acessíveis via navegador<br />
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Controlar acesso e usuários<br />
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Escalar o uso dos dados</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Em outras palavras: <strong>sair do desktop e ir para internet</strong>.</p>
<p>Agora vem o ponto que trava muita gente:</p>
<p>“<strong>Pra fazer isso eu preciso programar?</strong>”</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Não.</strong></p>
<p>Com as ferramentas certas, você consegue construir um WebGIS completo usando:</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f5c4.png" alt="🗄" class="wp-smiley" style="height: 1em; max-height: 1em;" /> PostgreSQL + PostGIS<br />
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f30d.png" alt="🌍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> GeoServer<br />
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4ca.png" alt="📊" class="wp-smiley" style="height: 1em; max-height: 1em;" /> GeoNode</p>
<p>Tudo integrado, utilizando tecnologias open source já consolidadas no mercado. E mais importante: <strong>você aprende o fluxo completo, não só ferramentas isoladas</strong>.</p>
<p>Dado → Serviço → Aplicação → Usuário</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f525.png" alt="🔥" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Na prática, isso significa que você será capaz de:</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Estruturar dados espaciais de forma profissional<br />
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Publicar mapas e serviços na web<br />
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Criar portais geoespaciais completos<br />
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Desenvolver dashboards e GeoStories<br />
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Gerenciar permissões e acessos</p>
<p>Esse <strong>não é </strong>um curso de programação. É um curso para quem quer <strong>resultado aplicado</strong>, utilizando ferramentas prontas e poderosas. Se você quer parar de entregar arquivos e começar a entregar soluções acessíveis, escaláveis e profissionais…</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Esse é o próximo passo.</p>
<p>O curso é <strong>ministrado na modalidade EAD Ao Vivo</strong>, com aulas síncronas, porém,<strong> as aulas são gravadas</strong> e ficam <strong>disponíveis ao aluno por 12 meses</strong> no nosso portal do aluno.</p>
<p>Garanta sua vaga:</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f310.png" alt="🌐" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a href="https://geocursos.com.br/webgis" target="_blank">https://geocursos.com.br/webgis</a><br />
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4f1.png" alt="📱" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a href="https://whats.link/geocursos" target="_blank">https://whats.link/geocursos</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.fernandoquadro.com.br/html/2026/04/21/curso-webgis-com-postgis-geoserver-3-e-geonode-5/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Como criar seu próprio Catálogo STAC</title>
		<link>https://www.fernandoquadro.com.br/html/2026/03/23/como-criar-seu-proprio-catalogo-stac/</link>
					<comments>https://www.fernandoquadro.com.br/html/2026/03/23/como-criar-seu-proprio-catalogo-stac/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Quadro]]></dc:creator>
		<pubDate>Mon, 23 Mar 2026 13:52:51 +0000</pubDate>
				<category><![CDATA[GIS]]></category>
		<category><![CDATA[COG]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[GeoServer]]></category>
		<category><![CDATA[PostGIS]]></category>
		<category><![CDATA[STAC]]></category>
		<guid isPermaLink="false">https://www.fernandoquadro.com.br/html/?p=10266</guid>

					<description><![CDATA[Prezado leitor, Se você trabalha com dados geoespaciais, principalmente rasters, provavelmente já esbarrou em problemas como: Dificuldade de organizar grandes volumes de dados Falta de padronização na publicação APIs pouco eficientes para busca espacial/temporal É exatamente aqui que entra o... <a class="more-link" href="https://www.fernandoquadro.com.br/html/2026/03/23/como-criar-seu-proprio-catalogo-stac/">Continue Reading &#8594;</a>]]></description>
										<content:encoded><![CDATA[<p>Prezado leitor,</p>
<p>Se você trabalha com dados geoespaciais, principalmente rasters, provavelmente já esbarrou em problemas como:</p>
<ul>
<li>Dificuldade de organizar grandes volumes de dados</li>
<li>Falta de padronização na publicação</li>
<li>APIs pouco eficientes para busca espacial/temporal</li>
</ul>
<p>É exatamente aqui que entra o <strong>STAC (SpatioTemporal Asset Catalog)</strong>. Mais do que um formato, o STAC <strong>é um padrão moderno para organizar, catalogar e acessar dados geoespaciais</strong>, permitindo buscas rápidas e interoperáveis.</p>
<p>Neste guia, você vai aprender a montar um ambiente completo para:</p>
<ul>
<li>Organizar seus dados no padrão STAC</li>
<li>Publicar via API moderna</li>
<li>Integrar com o GeoServer</li>
<li>Servir dados raster (COG) de forma eficiente</li>
</ul>
<p>Este post apresenta, passo a passo, como montar um ambiente completo para criação e publicação de um catálogo STAC (SpatioTemporal Asset Catalog), utilizando Docker, PostGIS, GeoServer e uma API intermediária (adapter). O objetivo é permitir que você organize, publique e consuma dados geoespaciais modernos de forma eficiente.</p>
<p>Antes de começar, é importante entender o papel de cada componente:</p>
<ul>
<li><strong>PostGIS </strong>→ Armazena os metadados espaciais</li>
<li><strong>pgSTAC </strong>→ Implementa o padrão STAC dentro do PostgreSQL</li>
<li><strong>STAC FastAPI</strong> → Expõe os dados via API REST</li>
<li><strong>GeoServer</strong> → Publica e renderiza os dados</li>
<li><strong>Adapter (FastAPI)</strong> → Traduz STAC para o formato esperado pelo GeoServer</li>
</ul>
<p>Um ponto importante: o GeoServer ainda não consome STAC “puro” de forma completa, por isso o uso do adapter é essencial.</p>
<p><strong></p>
<h3>1. Atualização do sistema</h3>
<p></strong></p>
<p>Antes de instalar qualquer ferramenta, é importante garantir que o sistema esteja atualizado. Isso evita problemas de dependência e incompatibilidade.</p>
<pre>
> sudo apt update
> sudo apt upgrade -y
</pre>
<p><strong></p>
<h3>2. Instalação do Docker</h3>
<p></strong></p>
<p>O Docker será usado para isolar cada componente da arquitetura, garantindo reprodutibilidade. Isso evita conflitos de versão e facilita deploy em outros ambientes.</p>
<p>2.1 Adicionar chave GPG:</p>
<pre>
> curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
> sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
</pre>
<p>2.2 Adicionar repositório:</p>
<pre>
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
</pre>
<p>2.3 Instalar Docker + Compose:</p>
<pre>
> sudo apt update
> sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y
</pre>
<p>Com isso, você terá um ambiente isolado para rodar toda a stack sem conflitos de versão.</p>
<p><strong></p>
<h3>3. Estrutura do projeto</h3>
<p></strong></p>
<p>Agora vamos organizar os diretórios do projeto:</p>
<pre>
> sudo mkdir -p /docker/geoserver/plugins
> cd /docker/geoserver/plugins
</pre>
<p><strong></p>
<h3>4. Download dos plugins do GeoServer</h3>
<p></strong></p>
<p>O plugins que iremos realizar o download adicionam suporte a:</p>
<ul>
<li>COG (Cloud Optimized GeoTIFF) via HTTP/S3</li>
<li>Integração com STAC</li>
</ul>
<p>Sem esses plugins, o GeoServer não consegue trabalhar corretamente com dados cloud-native.</p>
<pre>
> wget https://build.geoserver.org/geoserver/2.27.x/community-latest/geoserver-2.27-SNAPSHOT-cog-http-plugin.zip
> wget https://build.geoserver.org/geoserver/2.27.x/community-latest/geoserver-2.27-SNAPSHOT-cog-s3-plugin.zip
> wget https://build.geoserver.org/geoserver/2.27.x/community-latest/geoserver-2.27-SNAPSHOT-stac-datastore-plugin.zip
</pre>
<p><strong></p>
<h3>5. Dockerfile do GeoServer</h3>
<p></strong></p>
<p>Criamos um Dockerfile para incluir os plugins:</p>
<pre>
cd /docker/geoserver
nano Dockerfile
</pre>
<p>O conteúdo do arquivo:</p>
<pre>
FROM docker.osgeo.org/geoserver:2.27.2

COPY plugins/*.jar /usr/local/tomcat/webapps/geoserver/WEB-INF/lib/
</pre>
<p>Aqui estamos estendendo a imagem padrão do GeoServer para suportar STAC e COG.</p>
<p><strong></p>
<h3>6. Arquivo Docker Compose</h3>
<p></strong></p>
<p>Agora definimos toda a infraestrutura: Banco de dados (PostGIS), API STAC e GeoServer. Vamos então criar o arquivo docker-compose.yaml:</p>
<pre>
cd /docker
nano docker-compose.yaml
</pre>
<p>Esse arquivo é o coração da infraestrutura, ele define como os serviços se comunicam e persistem dados. O conteúdo do arquivo:</p>
<pre>
volumes:
  postgis-data:
  geoserver-data:

networks:
  internal:
  external:

services:

  db:
    container_name: postgis
    image: postgis/postgis:16-3.4
    volumes:
      - postgis-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=postgis
      - POSTGRES_USER=postgis
      - POSTGRES_PASSWORD=senha_postgis
      - IP_LIST=*
      - ALLOW_IP_RANGE=0.0.0.0/0
      - POSTGRES_MULTIPLE_EXTENSIONS=postgis,hstore,postgis_topology,postgis_raster,pgrouting,btree_gist
      - FORCE_SSL=false
    ports:
      - "5432:5432"
    restart: unless-stopped
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgis-d postgis"]
      interval: 5s
      timeout: 5s
      retries: 10
    networks:
      - internal

  geoserver:
    container_name: geoserver
    build: ./geoserver
    volumes:
      - geoserver-data:/opt/geoserver/data_dir
      - /docker/geoserver/imagem_raster:/opt/geoserver/data_dir/coverages
    environment:
      - TZ=America/Sao_Paulo
      - GEOSERVER_ADMIN_USER=admin
      - GEOSERVER_ADMIN_PASSWORD=geoserver
      - INSTALL_EXTENSIONS=true
      - EXTRA_JAVA_OPTS=-Xms4G -Xmx6G
      - STABLE_EXTENSIONS=importer,wps,pyramid
      - PROXY_BASE_URL=http://192.168.186.140:8083/geoserver
      - GEOSERVER_CSRF_WHITELIST=192.168.186.140
      - HTTP_SCHEME=http
      - CORS_ENABLED=false
    ports:
      - "8083:8080"
    restart: unless-stopped
    healthcheck:
      test: curl --fail "http://localhost:8080/geoserver/web/wicket/resource/org.geoserver.web.GeoServerBasePage/img/logo.png" || exit 1
      interval: 1m30s
      timeout: 10s
      retries: 3
    networks:
      - internal
      - external

  stac:
    container_name: stac-api
    image: ghcr.io/stac-utils/stac-fastapi-pgstac:latest
    environment:
      - PGHOST=db
      - PGPORT=5432
      - PGDATABASE=postgis
      - PGUSER=postgis
      - PGPASSWORD=senha_postgis
    ports:
      - "8085:8080"
    depends_on:
      db:
        condition: service_healthy
    networks:
      - internal
</pre>
<p>Agora é subir o ambiente:</p>
<pre>
> docker compose build
> docker compose up -d
</pre>
<p><strong></p>
<h3>7. Criar banco STAC (pgstac)</h3>
<p></strong></p>
<p>Instalar a ferramenta: </p>
<pre>
sudo apt install -y pipx
pipx ensurepath
source ~/.bashrc
pipx install "pypgstac[psycopg]"
</pre>
<p>Configurar conexão:</p>
<pre>
export PGHOST=127.0.0.1
export PGPORT=5432
export PGDATABASE=postgis
export PGUSER=postgis
export PGPASSWORD=senha_postgis
</pre>
<p>Rodar migração:</p>
<pre>
> pypgstac migrate
</pre>
<p>Esse comando cria toda a estrutura STAC dentro do banco:</p>
<ul>
<li>Tabelas de collections</li>
<li>Tabelas de items</li>
<li>Índices espaciais e temporais</li>
</ul>
<p>Sem isso, a API STAC não consegue funcionar.</p>
<p><strong></p>
<h3>8. Criar Collection</h3>
<p></strong></p>
<p>Collections funcionam como agrupadores lógicos de dados. Exemplos: Sentinel-2, Ortofotos, Modelos de elevação.</p>
<p>Crie o arquivo:</p>
<pre>
nano collection.json
</pre>
<p>Conteúdo do arquivo:</p>
<pre>
{
  "id": "raster-test",
  "type": "Collection",
  "description": "Teste de raster",
  "license": "proprietary",
  "extent": {
    "spatial": { "bbox": [[-180, -90, 180, 90]] },
    "temporal": { "interval": [["2024-01-01T00:00:00Z", null]] }
  }
}
</pre>
<p>Para inserir no banco, execute o comando abaixo:</p>
<pre>
pypgstac load collections collection.json
</pre>
<p><strong></p>
<h3>9. Criar itens</h3>
<p></strong></p>
<p>Os Items representam os dados reais. Exemplo: Um raster específico, um ortomosaico, uma cena de satélite.</p>
<p>Crie o arquivo:</p>
<pre>
nano item.json
</pre>
<p>Conteúdo do arquivo:</p>
<pre>
{
  "type": "Feature",
  "stac_version": "1.0.0",
  "id": "paraiso-ortomosaico",
  "collection": "raster-test",
  "geometry": {
    "type": "Polygon",
    "coordinates": [[
      [-48.8961561, -25.0593974],
      [-48.8764276, -25.0593974],
      [-48.8764276, -25.0730781],
      [-48.8961561, -25.0730781],
      [-48.8961561, -25.0593974]
    ]]
  },
  "bbox": [-48.8961561,-25.0730781,-48.8764276,-25.0593974],
  "properties": {
    "datetime": "2024-01-01T00:00:00Z",
    "proj:epsg": 4326
  },
  "assets": {
    "data": {
      "href": "http://SEU_IP:9000/rasters/seu_arquivo.tif",
      "type": "image/tiff",
      "roles": ["data"]
    }
  }
}
</pre>
<p>Inserir item no banco:</p>
<pre>
pypgstac load items item.json
</pre>
<p>Se você precisar editar o conteúdo do json e realizar um update no banco, use o seguinte comando:</p>
<pre>
pypgstac load items item.json --method upsert
</pre>
<p>Você ainda tem uma outra opção que é a criação automático do arquivo json através do rio-stac, para isso você precisa:</p>
<pre>
pipx install rio-stac --include-deps
rio stac orotomosaico_cog.tif > item.json
</pre>
<p>Dica importante:</p>
<p>O campo &#8220;href&#8221;: &#8220;http://SEU_IP:9000/rasters/seu_arquivo.tif&#8221; do JSON, é o link para o dado real (idealmente um COG acessível via HTTP ou S3).</p>
<p><strong></p>
<h3>10. Adapter STAC (compatibilidade com GeoServer)</h3>
<p></strong></p>
<p>Essa é uma das partes mais importantes da arquitetura, pois o GeoServer não consume STAC de forma totalmente nativa. Então esse adapter vai resolver as incompatibilidades do GeoServer com STAC, ajustando links e headers. </p>
<p>Para o STAC funcionar perfeitamente no GeoServer, é necessário realizar alguns ajustes de:</p>
<ul>
<li>Content-Type</li>
<li>Href</li>
<li>Navegação interna</li>
</ul>
<p>Devido a esse problema, foi desenvolvido um adapter em FastAPI que: intercepta requisições, ajusta os links (href), corrige headers e diferencia chamadas internas e externas.</p>
<p>Criar API:</p>
<pre>
mkdir /docker/api
cd /docker/api
nano adapter.py
</pre>
<p>Conteúdo do arquivo adapter.py</p>
<pre>
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
import requests
import os

app = FastAPI()

STAC_URL = "http://stac-api:8080"

# URLs
PUBLIC_URL = os.getenv("PUBLIC_URL", "http://192.168.186.140:8087")
INTERNAL_URL = "http://stac-adapter:8081"


# -------------------------
# Helper para requisições
# -------------------------
def fetch(url, method="GET", json=None):
    if method == "POST":
        r = requests.post(url, json=json)
    else:
        r = requests.get(url)

    r.raise_for_status()
    return r.json()


# -------------------------
# Detecta se é chamada interna (GeoServer)
# -------------------------
def is_internal(request: Request):
    host = request.headers.get("host", "")
    return "stac-adapter" in host or "geoserver" in host


# -------------------------
# Fix links (inteligente)
# -------------------------
def fix_links(data, internal=False):
    base = INTERNAL_URL if internal else PUBLIC_URL

    def fix(obj):
        if isinstance(obj, dict):
            for k, v in obj.items():
                if k == "href" and isinstance(v, str):
                    obj[k] = v.replace("http://stac-api:8080", base)
                else:
                    fix(v)
        elif isinstance(obj, list):
            for item in obj:
                fix(item)

    fix(data)
    return data


# -------------------------
# ROOT
# -------------------------
@app.api_route("/", methods=["GET", "HEAD"])
async def root(request: Request):
    data = fetch(f"{STAC_URL}/")
    return JSONResponse(
        content=fix_links(data, internal=is_internal(request)),
        media_type="application/json"
    )


# -------------------------
# COLLECTIONS
# -------------------------
@app.api_route("/collections", methods=["GET", "HEAD"])
async def collections(request: Request):
    data = fetch(f"{STAC_URL}/collections")
    return JSONResponse(
        content=fix_links(data, internal=is_internal(request)),
        media_type="application/json"
    )


# -------------------------
# COLLECTION
# -------------------------
@app.api_route("/collections/{collection_id}", methods=["GET", "HEAD"])
async def collection(collection_id: str, request: Request):
    data = fetch(f"{STAC_URL}/collections/{collection_id}")
    return JSONResponse(
        content=fix_links(data, internal=is_internal(request)),
        media_type="application/geo+json"
    )


# -------------------------
# ITEMS
# -------------------------
@app.api_route("/collections/{collection_id}/items", methods=["GET", "HEAD"])
async def items(collection_id: str, request: Request):
    data = fetch(f"{STAC_URL}/collections/{collection_id}/items")
    return JSONResponse(
        content=fix_links(data, internal=is_internal(request)),
        media_type="application/geo+json"
    )


# -------------------------
# ITEM ESPECÍFICO
# -------------------------
@app.api_route("/collections/{collection_id}/items/{item_id}", methods=["GET", "HEAD"])
async def item(collection_id: str, item_id: str, request: Request):
    data = fetch(f"{STAC_URL}/collections/{collection_id}/items/{item_id}")
    return JSONResponse(
        content=fix_links(data, internal=is_internal(request)),
        media_type="application/geo+json"
    )


# -------------------------
# SEARCH
# -------------------------
@app.api_route("/search", methods=["GET", "POST", "HEAD"])
async def search(request: Request):
    if request.method == "POST":
        body = await request.json()
        data = fetch(f"{STAC_URL}/search", method="POST", json=body)
    else:
        data = fetch(f"{STAC_URL}/search")

    return JSONResponse(
        content=fix_links(data, internal=is_internal(request)),
        media_type="application/geo+json"
    )
</pre>
<p>Agora vamos ao conteúdo do arquivo Dockerfile:</p>
<pre>
FROM python:3.11-slim

WORKDIR /app

RUN pip install fastapi uvicorn requests

COPY adapter.py .

CMD ["uvicorn", "adapter:app", "--host", "0.0.0.0", "--port", "8081"]
</pre>
<p>E pra finalizar, você deve adicionar ao seu docker-compose:</p>
<pre>
adapter:
  container_name: stac-adapter
  build: ./api
  ports:
    - "8087:8081"
  depends_on:
    - stac
  networks:
    - internal
    - external
</pre>
<p>Agora é só subir o adapter:</p>
<pre>
docker compose up -d --build
</pre>
<p><strong></p>
<h3>11. Nginx</h3>
<p></strong></p>
<p>Agora, para finalizar, vamos instalar o nginx e deixar tudo rodando externamente na porta 80. O Nginx atua como proxy reverso, centralizando o acesso:</p>
<ul>
<li>/geoserver → GeoServer</li>
<li>/stac → Adapter</li>
<li>/stac-api → API direta</li>
</ul>
<p>E ainda ajuda na organização das rotas, facilidade de exposição externa e melhor controle de segurança.</p>
<p>Vamos criar o arquivo nginx-stac.conf:</p>
<pre>
cd /docker/
nano nginx-stac.conf
</pre>
<p>Esse arquivo deve conter o seguinte conteúdo:</p>
<pre>
server {
    listen 80;

    # -------------------------
    # GEOSERVER
    # -------------------------
    location /geoserver/ {
        proxy_pass http://geoserver:8080/geoserver/;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    # -------------------------
    # STAC (via adapter)
    # -------------------------
    location /stac/ {
        proxy_pass http://adapter:8081/;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    # -------------------------
    # STAC DIRETO (opcional)
    # -------------------------
    location /stac-api/ {
        proxy_pass http://stac-api:8080/;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
</pre>
<p>Você precisar alterar a seguinte linha do arquivo adapter.py:</p>
<pre>
PUBLIC_URL = os.getenv("PUBLIC_URL", "http://192.168.186.140:8087")
</pre>
<p>Para:</p>
<pre>
PUBLIC_URL = os.getenv("PUBLIC_URL", "http://192.168.186.140/stac")
</pre>
<p>Agora é só subir o seu container, e pronto:</p>
<pre>
docker compose up -d --build
</pre>
<p>Se tudo estiver correto, você verá sua collection retornada via API.</p>
<p><strong></p>
<h3>12. Conclusão</h3>
<p></strong></p>
<p>Com essa arquitetura, você passa a ter:</p>
<ul>
<li>Um catálogo STAC estruturado e escalável</li>
<li>Uma API moderna para consulta espacial e temporal</li>
<li>Integração com GeoServer</li>
<li>Suporte a dados cloud-native (COG)</li>
</ul>
<p>Mais do que isso, você construiu uma base sólida para aplicações geoespaciais modernas, preparada para lidar com grandes volumes de dados de forma eficiente.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.fernandoquadro.com.br/html/2026/03/23/como-criar-seu-proprio-catalogo-stac/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>O que é COG e por que ele está mudando a forma de publicar rasters</title>
		<link>https://www.fernandoquadro.com.br/html/2026/03/13/o-que-e-cog-e-por-que-ele-esta-mudando-a-forma-de-publicar-rasters/</link>
					<comments>https://www.fernandoquadro.com.br/html/2026/03/13/o-que-e-cog-e-por-que-ele-esta-mudando-a-forma-de-publicar-rasters/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Quadro]]></dc:creator>
		<pubDate>Fri, 13 Mar 2026 20:02:00 +0000</pubDate>
				<category><![CDATA[GIS]]></category>
		<category><![CDATA[COG]]></category>
		<category><![CDATA[GeoServer]]></category>
		<category><![CDATA[Raster]]></category>
		<guid isPermaLink="false">https://www.fernandoquadro.com.br/html/?p=10205</guid>

					<description><![CDATA[Dados raster estão entre os datasets mais pesados do mundo GIS. Ortomosaicos, imagens de satélite e modelos digitais de elevação frequentemente possuem dezenas ou até centenas de gigabytes. Historicamente, trabalhar com esses arquivos sempre foi um desafio para profissionais de... <a class="more-link" href="https://www.fernandoquadro.com.br/html/2026/03/13/o-que-e-cog-e-por-que-ele-esta-mudando-a-forma-de-publicar-rasters/">Continue Reading &#8594;</a>]]></description>
										<content:encoded><![CDATA[<p>Dados raster estão entre os datasets mais pesados do mundo GIS. Ortomosaicos, imagens de satélite e modelos digitais de elevação frequentemente possuem <strong>dezenas ou até centenas de gigabytes</strong>.</p>
<p>Historicamente, trabalhar com esses arquivos sempre foi um desafio para profissionais de geotecnologia. Entre os principais problemas estão:</p>
<ul>
<li>Leitura lenta de arquivos grandes</li>
<li>Alto consumo de disco</li>
<li>Necessidade de armazenamento local</li>
<li>Dificuldade de uso em ambientes cloud</li>
<li>Baixa escalabilidade em servidores GIS</li>
</ul>
<p>Foi nesse cenário que surgiu o <strong>Cloud Optimized GeoTIFF (COG)</strong>.</p>
<p>Hoje o COG é considerado um dos formatos mais importantes para infraestruturas modernas de dados geoespaciais, permitindo trabalhar com rasters gigantes de forma muito mais eficiente.</p>
<p>Neste artigo vamos entender:</p>
<ul>
<li>O que é COG</li>
<li>Como ele funciona</li>
<li>Por que ele é muito mais rápido</li>
<li>Vantagens e desvantagens</li>
<li>Como criar um COG</li>
<li>Como usar COG com servidores GIS</li>
<li>Impacto real na performance para usuários</li>
</ul>
<h2>1. O problema dos rasters tradicionais</h2>
<p>Um GeoTIFF tradicional não foi projetado para acesso remoto eficiente.</p>
<p>Imagine um ortomosaico de <strong>20 GB</strong>. Um usuário acessa apenas uma pequena área no mapa. O que acontece internamente:</p>
<p><center><br />
<img fetchpriority="high" decoding="async" src="https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_rasters_tradicionais_01-1024x683.png" alt="" width="500" height="334" class="aligncenter size-large wp-image-10241" srcset="https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_rasters_tradicionais_01-1024x683.png 1024w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_rasters_tradicionais_01-300x200.png 300w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_rasters_tradicionais_01-768x512.png 768w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_rasters_tradicionais_01-600x400.png 600w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_rasters_tradicionais_01-945x630.png 945w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_rasters_tradicionais_01.png 1536w" sizes="(max-width: 500px) 100vw, 500px" /><br />
</center></p>
<p>Mesmo que o usuário precise de apenas <strong>1% da imagem</strong>, o servidor pode acabar <strong>lendo uma grande parte do arquivo</strong>. Isso gera:</p>
<ul>
<li>Alto I/O de disco</li>
<li>Grande uso de CPU</li>
<li>Lentidão no acesso</li>
<li>Pouca escalabilidade</li>
</ul>
<h2>2. O que é Cloud Optimized GeoTIFF (COG)</h2>
<p>O Cloud Optimized GeoTIFF (COG) é uma variação do formato GeoTIFF otimizada para acesso eficiente via rede. Ele foi projetado para permitir que aplicações leiam <strong>apenas os pedaços necessários do arquivo</strong>. Em vez de carregar o raster inteiro, o cliente <strong>acessa somente os blocos relevantes</strong>.</p>
<p>Isso permite acessar rasters muito grandes diretamente em:</p>
<ul>
<li>Servidores HTTP</li>
<li>Object Storage</li>
<li>Infraestruturas Cloud</li>
</ul>
<p>Sem precisar baixar o arquivo completo.</p>
<h2>3. Como o COG funciona internamente</h2>
<p>A performance do COG depende de três características principais.</p>
<h4>3.1 Tiling interno</h4>
<p>No COG o raster é dividido em blocos menores chamados de <em>tiles</em>.</p>
<p>Esses blocos normalmente possuem tamanho como:</p>
<pre>512 x 512 pixels</pre>
<p>Quando um cliente pede uma área específica do mapa, <strong>apenas os tiles necessários são lidos</strong>.</p>
<h4>3.2 Overviews (pirâmide de resolução)</h4>
<p>COGs normalmente possuem <strong>overviews internas</strong>. Isso significa que versões reduzidas da imagem são armazenadas dentro do próprio arquivo. Exemplo:</p>
<p><center><br />
<img decoding="async" src="https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/cog_overviews_600px.png" alt="" width="600" height="281" class="aligncenter size-full wp-image-10247" srcset="https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/cog_overviews_600px.png 600w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/cog_overviews_600px-300x141.png 300w" sizes="(max-width: 600px) 100vw, 600px" /><br />
</center></p>
<p>Quando o usuário está visualizando o mapa em escalas menores, o servidor lê apenas as versões reduzidas. Isso reduz drasticamente:</p>
<ul>
<li>Leitura de dados</li>
<li>Tempo de renderização</li>
<li>Consumo de CPU</li>
</ul>
<h4>3.3 HTTP Range Requests</h4>
<p>Uma das principais características do COG é permitir leitura parcial do arquivo via HTTP. Exemplo de requisição:</p>
<pre>
GET /imagem.tif
Range: bytes=10000-20000
</pre>
<p>O servidor retorna apenas aquela parte do arquivo.</p>
<p> Isso permite acessar COGs sem baixar o raster inteiro diretamente em:</p>
<ul>
<li>Servidores web</li>
<li>S3</li>
<li>MinIO</li>
<li>Cloud Storage</li>
</ul>
<h2>4. Comparação prática: GeoTIFF vs COG</h2>
<div id="attachment_10239" style="width: 840px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-10239" src="https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/geotiff_vs_cog.png" alt="" width="830" height="309" class="size-full wp-image-10239" srcset="https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/geotiff_vs_cog.png 830w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/geotiff_vs_cog-300x112.png 300w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/geotiff_vs_cog-768x286.png 768w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/geotiff_vs_cog-600x223.png 600w" sizes="(max-width: 830px) 100vw, 830px" /><p id="caption-attachment-10239" class="wp-caption-text">Comparação visual &#8211; GeoTIFF vs COG</p></div>
<h4>4.1 GeoTIFF tradicional</h4>
<p><center><br />
<img fetchpriority="high" decoding="async" src="https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_rasters_tradicionais_01-1024x683.png" alt="" width="500" height="334" class="aligncenter size-large wp-image-10241" srcset="https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_rasters_tradicionais_01-1024x683.png 1024w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_rasters_tradicionais_01-300x200.png 300w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_rasters_tradicionais_01-768x512.png 768w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_rasters_tradicionais_01-600x400.png 600w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_rasters_tradicionais_01-945x630.png 945w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_rasters_tradicionais_01.png 1536w" sizes="(max-width: 500px) 100vw, 500px" /><br />
</center></p>
<p>Problemas:</p>
<ul>
<li>Alto uso de disco</li>
<li>Leitura pesada</li>
<li>Baixa escalabilidade</li>
</ul>
<h4>4.2 COG</h4>
<p><center><br />
<img loading="lazy" decoding="async" src="https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_rasters_cog_01.png" alt="" width="500" height="333" class="aligncenter size-full wp-image-10249" srcset="https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_rasters_cog_01.png 500w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_rasters_cog_01-300x200.png 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /><br />
</center></p>
<p>Benefícios:</p>
<ul>
<li>Leitura mínima de dados</li>
<li>Muito mais rápido</li>
<li>Ideal para cloud</li>
</ul>
<h2>5. Vantagens do COG</h2>
<p>Principais vantagens:</p>
<ul>
<li>Leitura parcial do raster</li>
<li>Acesso eficiente via HTTP</li>
<li>Ideal para cloud computing</li>
<li>Integração com object storage</li>
<li>Redução de I/O de disco</li>
<li>Excelente para grandes datasets</li>
</ul>
<h2>6. Desvantagens</h2>
<p>Apesar das vantagens, existem alguns pontos a considerar:</p>
<ul>
<li>Criação pode ser demorada para rasters muito grandes</li>
<li>Arquivos podem ficar maiores devido às overviews</li>
<li>Não é ideal para edição constante</li>
<li>Exige processamento inicial</li>
</ul>
<p>Por isso o COG é mais indicado para <strong>dados finais de publicação</strong>.</p>
<h2>7. Como criar um COG</h2>
<p>O primeiro passo é converter o raster tradicional para Cloud Optimized GeoTIFF (COG). A maneira mais comum é usar o GDAL:</p>
<pre>
gdal_translate input.tif output_cog.tif \
-of COG \
-co COMPRESS=LZW \
-co BLOCKSIZE=512 \
-co BIGTIFF=YES
</pre>
<h4>7.1 Parâmetros importantes</h4>
<table>
<thead>
<tr>
<th>Parâmetro</th>
<th>Função</th>
</tr>
</thead>
<tbody>
<tr>
<td>-of COG</td>
<td>gera um Cloud Optimized GeoTIFF</td>
</tr>
<tr>
<td>COMPRESS=LZW</td>
<td>compressão sem perdas</td>
</tr>
<tr>
<td>BLOCKSIZE=512</td>
<td>otimização para leitura em blocos</td>
</tr>
<tr>
<td>BIGTIFF=YES</td>
<td>necessário para arquivos grandes</td>
</tr>
</tbody>
</table>
<h4>7.2 Validação do COG</h4>
<p>
Depois da conversão, é importante verificar se o arquivo foi gerado corretamente, da seguinte forma:
</p>
<pre>
gdalinfo arquivo_cog.tif
</pre>
<p>Se aparecer:</p>
<pre>LAYOUT=COG</pre>
<p>Significa que o arquivo foi criado corretamente.</p>
<h2>8. COG e Object Storage</h2>
<p>Uma das maiores vantagens do COG é funcionar perfeitamente com Object Storage.</p>
<ul>
<li>S3</li>
<li>MinIO</li>
<li>Google Cloud Storage</li>
<li>Azure Blob Storage</li>
</ul>
<p>Arquitetura típica:</p>
<p><center><br />
<img loading="lazy" decoding="async" src="https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_geotiff_cog_gs_600px.png" alt="" width="600" height="102" class="aligncenter size-full wp-image-10251" srcset="https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_geotiff_cog_gs_600px.png 600w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_geotiff_cog_gs_600px-300x51.png 300w" sizes="auto, (max-width: 600px) 100vw, 600px" /><br />
</center></p>
<p>Isso permite criar infraestruturas altamente escaláveis.</p>
<h2>9. COG com servidores GIS</h2>
<p>Servidores como GeoServer podem acessar COGs diretamente via HTTP.</p>
<p>Fluxo típico:</p>
<p><center><br />
<img loading="lazy" decoding="async" src="https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_geotiff_cog_gs02.png" alt="" width="927" height="233" class="aligncenter size-full wp-image-10253" srcset="https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_geotiff_cog_gs02.png 927w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_geotiff_cog_gs02-300x75.png 300w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_geotiff_cog_gs02-768x193.png 768w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_geotiff_cog_gs02-600x151.png 600w" sizes="auto, (max-width: 927px) 100vw, 927px" /><br />
</center></p>
<p>Uma grande vantagem é que <strong>o raster não precisa ficar no servidor GIS</strong>.</p>
<h2>10. COG substitui o Cache (GWC)?</h2>
<p>Não. O COG e cache resolvem problemas diferentes. Enquanto o COG otimiza leitura do raster, o cache otimiza entrega de mapas renderizados.</p>
<p>Arquitetura recomendada:</p>
<p><center><br />
<img loading="lazy" decoding="async" src="https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_gwc_900px.png" alt="" width="900" height="268" class="aligncenter size-full wp-image-10257" srcset="https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_gwc_900px.png 900w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_gwc_900px-300x89.png 300w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_gwc_900px-768x229.png 768w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/fluxo_gwc_900px-600x179.png 600w" sizes="auto, (max-width: 900px) 100vw, 900px" /><br />
</center></p>
<h2>11. Benchmark de performance</h2>
<p>Vamos comparar três cenários. Vamos supor que você tem um ortomosaico de 20GB. Como seria a performance dele nos cenários abaixo:</p>
<h4>GeoTIFF tradicional</h4>
<p>Primeiro acesso:</p>
<pre>3 a 8 segundos</pre>
<p>Alta leitura de disco.</p>
<h4>COG</h4>
<p>Primeiro acesso:</p>
<pre>0.5 a 2 segundos</pre>
<p>Leitura parcial.</p>
<h4>COG + GeoWebCache</h4>
<p>Após cache:</p>
<pre>20 a 80 milissegundos</pre>
<p>Praticamente instantâneo.</p>
<h2>12. Conclusão</h2>
<p>O <strong>Cloud Optimized GeoTIFF</strong> se tornou um dos formatos mais importantes para infraestruturas modernas de dados raster.</p>
<p>Ele permite acesso eficiente a grandes rasters, integração com cloud e publicação escalável em servidores GIS.</p>
<p>Quando <strong>combinado com object storage e servidores como GeoServer</strong>, o <strong>COG possibilita arquiteturas altamente performáticas</strong> para distribuição de dados geoespaciais.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.fernandoquadro.com.br/html/2026/03/13/o-que-e-cog-e-por-que-ele-esta-mudando-a-forma-de-publicar-rasters/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Publicando rasters com COG + S3/MinIO + GeoServer</title>
		<link>https://www.fernandoquadro.com.br/html/2026/03/11/publicando-rasters-com-cog-s3-minio-geoserver/</link>
					<comments>https://www.fernandoquadro.com.br/html/2026/03/11/publicando-rasters-com-cog-s3-minio-geoserver/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Quadro]]></dc:creator>
		<pubDate>Wed, 11 Mar 2026 22:36:52 +0000</pubDate>
				<category><![CDATA[GIS]]></category>
		<category><![CDATA[GeoServer]]></category>
		<guid isPermaLink="false">https://www.fernandoquadro.com.br/html/?p=10185</guid>

					<description><![CDATA[Quando trabalhamos com ortomosaicos ou rasters muito grandes, um dos principais desafios é como armazenar e publicar esses dados com boa performance, sem sobrecarregar o servidor GIS. Uma arquitetura moderna que vem sendo cada vez mais utilizada é baseada em:... <a class="more-link" href="https://www.fernandoquadro.com.br/html/2026/03/11/publicando-rasters-com-cog-s3-minio-geoserver/">Continue Reading &#8594;</a>]]></description>
										<content:encoded><![CDATA[<p>
Quando trabalhamos com <strong>ortomosaicos ou rasters muito grandes</strong>, um dos principais desafios é como armazenar e publicar esses dados com boa performance, sem sobrecarregar o servidor GIS.
</p>
<p>
Uma arquitetura moderna que vem sendo cada vez mais utilizada é baseada em:
</p>
<ul>
<li><a href="https://www.fernandoquadro.com.br/html/2026/03/13/o-que-e-cog-e-por-que-ele-esta-mudando-a-forma-de-publicar-rasters/" target="_blank">Cloud Optimized GeoTIFF (COG)</a></li>
<li>MinIO ou Google Cloud Storage ou Amazon S3 (Object Storage)</li>
<li>GeoServer</li>
</ul>
<p>
Essa combinação permite que o <strong>GeoServer leia diretamente rasters armazenados em object storage</strong>, sem precisar copiá-los para o servidor.
</p>
<p>
Neste post vou mostrar um <strong>passo a passo simples e prático</strong> para implementar essa arquitetura:
</p>
<p><img loading="lazy" decoding="async" src="https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/ChatGPT-Image-11-de-mar.-de-2026-19_22_34.png" alt="" width="1420" height="572" class="aligncenter size-full wp-image-10195" srcset="https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/ChatGPT-Image-11-de-mar.-de-2026-19_22_34.png 1420w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/ChatGPT-Image-11-de-mar.-de-2026-19_22_34-300x121.png 300w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/ChatGPT-Image-11-de-mar.-de-2026-19_22_34-1024x412.png 1024w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/ChatGPT-Image-11-de-mar.-de-2026-19_22_34-768x309.png 768w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/ChatGPT-Image-11-de-mar.-de-2026-19_22_34-600x242.png 600w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2026/03/ChatGPT-Image-11-de-mar.-de-2026-19_22_34-945x381.png 945w" sizes="auto, (max-width: 1420px) 100vw, 1420px" /></p>
<p>
O ponto principal aqui é que o GeoServer não precisa armazenar o raster localmente. Ele apenas acessa o arquivo COG diretamente no storage.
</p>
<p>
<strong>Importante</strong>: O plugin COG (HTTP ou S3) já deve ter sido instalado no GeoServer.
</p>
<h2>1. Converter o raster para COG</h2>
<p>
O primeiro passo é converter o raster tradicional para <strong>Cloud Optimized GeoTIFF (COG)</strong>. Isso pode ser feito utilizando o GDAL.
</p>
<pre>
gdal_translate ortomosaico.tif ortomosaico_cog.tif \
-of COG \
-co COMPRESS=LZW \
-co BLOCKSIZE=512 \
-co BIGTIFF=YES \
-co OVERVIEWS=IGNORE_EXISTING
</pre>
<h3>Parâmetros importantes</h3>
<table>
<thead>
<tr>
<th>Parâmetro</th>
<th>Função</th>
</tr>
</thead>
<tbody>
<tr>
<td>-of COG</td>
<td>gera um Cloud Optimized GeoTIFF</td>
</tr>
<tr>
<td>COMPRESS=LZW</td>
<td>compressão sem perdas</td>
</tr>
<tr>
<td>BLOCKSIZE=512</td>
<td>otimização para leitura em blocos</td>
</tr>
<tr>
<td>BIGTIFF=YES</td>
<td>necessário para arquivos grandes</td>
</tr>
</tbody>
</table>
<h2>2. Verificar se o COG foi criado corretamente</h2>
<p>
Depois da conversão, é importante verificar se o arquivo foi gerado corretamente.
</p>
<pre>
gdalinfo ortomosaico_cog.tif
</pre>
<p>No resultado deve aparecer algo como:</p>
<pre>
LAYOUT=COG
</pre>
<p>E também a presença de <strong>overviews</strong>:</p>
<pre>
Overviews: 28676x21832, 14338x10916, ...
</pre>
<p>
Isso confirma que o arquivo está otimizado para leitura em nuvem.
</p>
<h2>3. Subir o arquivo para o storage (S3 ou MinIO)</h2>
<p>
Agora precisamos enviar o arquivo para um <strong>Object Storage</strong>.
</p>
<p>Você pode utilizar:</p>
<ul>
<li>MinIO (self-hosted)</li>
<li>Amazon S3</li>
<li>Google Cloud Storage</li>
</ul>
<p>
No caso do MinIO, é comum utilizar o cliente <strong>mc</strong>.
</p>
<h3>Instalar o cliente MinIO (caso você não tenha): </h3>
<pre>
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/
</pre>
<h3>Configurar o acesso ao servidor</h3>
<pre>
mc alias set minio http://SEU_SERVIDOR:9000 ACCESS_KEY SECRET_KEY
</pre>
<h3>Enviar o raster para um bucket</h3>
<pre>
mc cp ortomosaico_cog.tif minio/rasters/
</pre>
<p>
Após o upload, o arquivo ficará acessível em algo como:
</p>
<pre>
http://servidor:9000/rasters/ortomosaico_cog.tif
</pre>
<p><!--p>
<strong>Importante:</strong> o bucket precisa permitir leitura pública, ou o GeoServer não conseguirá acessar o raster.
</p-->
<h2>4. Configurar o raster no GeoServer</h2>
<p>
Agora vamos configurar o raster no GeoServer.
</p>
<p>Acesse a interface administrativa:</p>
<pre>
http://seu-servidor:8080/geoserver
</pre>
<h3>Criar um novo Store</h3>
<p>Vá em:</p>
<pre>
Stores → Add new Store
</pre>
<p>Escolha:</p>
<pre>
GeoTIFF / Cloud Optimized GeoTIFF
</pre>
<h3>Informar a URL do COG</h3>
<p>No campo de URL informe o caminho do arquivo:</p>
<pre>
http://servidor:9000/rasters/ortomosaico_cog.tif
</pre>
<p>Salve o store.</p>
<h2>5. Publicar a Layer</h2>
<p>
Após salvar o store, o GeoServer detectará automaticamente o raster.
</p>
<p>Basta clicar em:</p>
<pre>
Publish
</pre>
<p>Configure:</p>
<ul>
<li>Bounding Box</li>
<li>CRS</li>
<li>Nome da layer</li>
</ul>
<p>Depois salve.</p>
<h2>6. Testar o serviço</h2>
<p>
Agora o raster já pode ser acessado via:
</p>
<ul>
<li>WMS</li>
<li>WCS</li>
<li>WMTS</li>
</ul>
<p>Exemplo de endpoint WMS:</p>
<pre>
http://servidor:8080/geoserver/wms
</pre>
<p>
Ou diretamente pelo <strong>Layer Preview</strong> do GeoServer.
</p>
<h2>7. Por que essa arquitetura é interessante?</h2>
<h3>Escalabilidade</h3>
<p>
O storage pode crescer independentemente do GeoServer.
</p>
<h3>Performance</h3>
<p>
O COG permite leitura parcial do raster utilizando <strong>HTTP Range Requests</strong>.<br />
Ou seja, o cliente solicita apenas a parte da imagem que precisa.
</p>
<h3>Integração com cloud</h3>
<p>
A mesma arquitetura funciona com diversos serviços de object storage.
</p>
<ul>
<li>Amazon S3</li>
<li>MinIO</li>
<li>Google Cloud Storage</li>
</ul>
<h2>8. Conclusão</h2>
<p>
A combinação de <strong>COG + Object Storage + GeoServer</strong> é hoje uma das formas mais eficientes de publicar rasters grandes em ambientes WebGIS. Essa abordagem permite:
</p>
<ul>
<li>separar armazenamento e serviço</li>
<li>escalar facilmente</li>
<li>melhorar a performance de acesso aos dados</li>
</ul>
<p></p>
<p>
E o melhor: tudo pode ser implementado utilizando software open source.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.fernandoquadro.com.br/html/2026/03/11/publicando-rasters-com-cog-s3-minio-geoserver/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Como instalar plugins do GeoServer no GeoNode 5</title>
		<link>https://www.fernandoquadro.com.br/html/2026/02/26/como-instalar-plugins-do-geoserver-no-geonode-5-docker/</link>
					<comments>https://www.fernandoquadro.com.br/html/2026/02/26/como-instalar-plugins-do-geoserver-no-geonode-5-docker/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Quadro]]></dc:creator>
		<pubDate>Thu, 26 Feb 2026 21:15:16 +0000</pubDate>
				<category><![CDATA[GIS]]></category>
		<category><![CDATA[GeoNode]]></category>
		<category><![CDATA[GeoServer]]></category>
		<guid isPermaLink="false">https://www.fernandoquadro.com.br/html/?p=10174</guid>

					<description><![CDATA[Prezado leitor, Se você instalou o GeoNode 5 via Docker (GeoNode Project) e precisa adicionar um plugin que não vem na instalação padrão do GeoServer, este guia vai te mostrar como fazer isso da maneira correta e reproduzível. No meu... <a class="more-link" href="https://www.fernandoquadro.com.br/html/2026/02/26/como-instalar-plugins-do-geoserver-no-geonode-5-docker/">Continue Reading &#8594;</a>]]></description>
										<content:encoded><![CDATA[<p>Prezado leitor,</p>
<p>Se você instalou o <strong>GeoNode 5</strong> via Docker (GeoNode Project) e precisa adicionar um plugin que não vem na instalação padrão do <strong>GeoServer</strong>, este guia vai te mostrar como fazer isso da maneira correta e reproduzível.</p>
<p>No meu caso, estou utilizando:</p>
<ul>
<strong></p>
<li>GeoNode 5.0.0</li>
<li>GeoServer 2.27.3</li>
<p></strong>
</ul>
<p>O objetivo é instalar o plugin Resource Browser Tool, que permite navegar e gerenciar arquivos do GeoServer diretamente pela interface web.</p>
<p><strong>1. Baixar o plugin: </strong></p>
<p>O plugin <strong>precisa ser exatamente da mesma versão do GeoServer</strong>. Como estou usando a versão <strong>2.27.3</strong>, o plugin também deve ser <strong>2.27.3</strong>.</p>
<pre>
> cd /home/fernandoquadro/
> wget https://sourceforge.net/projects/geoserver/files/GeoServer/2.27.3/extensions/geoserver-2.27.3-web-resource-plugin.zip
> unzip geoserver-2.27.3-web-resource-plugin.zip
</pre>
<p>Após descompactar, você terá um ou mais arquivos .jar.</p>
<p><strong>2. Copiar o plugin para a pasta do Projeto:</strong></p>
<pre>
> mkdir -p /opt/geonode_custom/my_geonode/docker/geoserver/plugins/resourcebrowser
> cp *.jar /opt/geonode_custom/my_geonode/docker/geoserver/plugins/resourcebrowser
</pre>
<p><strong>3. Alterar o arquivo Dockerfile do GeoServer</strong></p>
<p>A instalação correta do plugin não deve ser feita manualmente dentro do container.<br />
O procedimento adequado é incluir o plugin no processo de build da imagem.</p>
<pre>
> cd /opt/geonode_custom/my_geonode/docker/geoserver
> sudo nano Dockerfile
</pre>
<p>Adicione as seguintes linhas ao final do seu arquivo:</p>
<pre>
# GeoServer Resource Browser Tool (2.27.3)
COPY plugins/resourcebrowser/*.jar \
  /usr/local/tomcat/webapps/geoserver/WEB-INF/lib/
</pre>
<p><strong>4. Recriar a imagem do GeoServer</strong></p>
<pre>
> docker compose build geoserver
> docker compose up -d geoserver
</pre>
<p>Se quiser garantir um rebuild completo, faça:</p>
<pre>
> docker compose down
> docker compose build
> docker compose up -d
</pre>
<p><strong>5. Verificar se o plugin foi instalado</strong></p>
<p>Após executar os passos acima você pode então entrar no GeoServer e verificar se o seu plugin realmente foi instalado. Para isso acesse o painel administrativa em <strong>About &#038; Status → Modules</strong>, se tudo estiver correto, o Resource Browser Tool aparecerá na lista de módulos instalados.</p>
<p>Esse mesmo procedimento pode ser utilizado para instalar qualquer plugin do GeoServer no GeoNode executado via Docker.</p>
<p>Se você ainda não instalou o GeoNode 5, pode conferir o passo a passo completo <a href="https://www.fernandoquadro.com.br/html/2026/02/17/instalacao-do-geonode-5-no-ubuntu-24-04/" target="_blank">clicando aqui</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.fernandoquadro.com.br/html/2026/02/26/como-instalar-plugins-do-geoserver-no-geonode-5-docker/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Instalação do GeoNode 5 no Ubuntu 24.04</title>
		<link>https://www.fernandoquadro.com.br/html/2026/02/17/instalacao-do-geonode-5-no-ubuntu-24-04/</link>
					<comments>https://www.fernandoquadro.com.br/html/2026/02/17/instalacao-do-geonode-5-no-ubuntu-24-04/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Quadro]]></dc:creator>
		<pubDate>Tue, 17 Feb 2026 14:42:25 +0000</pubDate>
				<category><![CDATA[Diversos]]></category>
		<guid isPermaLink="false">https://www.fernandoquadro.com.br/html/?p=10160</guid>

					<description><![CDATA[Prezados leitores, Neste post irei apresentar como você pode instalar o GeoNode 5 via Docker em uma máquina rodando o Ubuntu Linux 24.04. Ao final dessa instalação você estará com uma instância do GeoNode executando no seu localhost. Sem enrolação,... <a class="more-link" href="https://www.fernandoquadro.com.br/html/2026/02/17/instalacao-do-geonode-5-no-ubuntu-24-04/">Continue Reading &#8594;</a>]]></description>
										<content:encoded><![CDATA[<p>Prezados leitores,</p>
<p>Neste post irei apresentar como você pode instalar o GeoNode 5 via Docker em uma máquina rodando o Ubuntu Linux 24.04. Ao final dessa instalação você estará com uma instância do GeoNode executando no seu localhost.</p>
<p>Sem enrolação, vamos aos passos:</p>
<p><strong>1. Instalar os pacotes do S.O</strong></p>
<pre>
> sudo add-apt-repository universe
> sudo apt-get update -y
> sudo apt-get install -y git-core git-buildpackage debhelper devscripts python3.12-dev python3.12-venv virtualenvwrapper
> sudo apt-get install -y apt-transport-https ca-certificates curl lsb-release gnupg gnupg-agent software-properties-common vim
</pre>
<p><strong>2. Adicionar os repositórios do Docker</strong></p>
<pre>
> sudo mkdir -p /etc/apt/keyrings
> curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
> sudo chmod a+r /etc/apt/keyrings/docker.gpg
> echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
</pre>
<p><strong>3. Adicionar os pacotes do Docker</strong></p>
<pre>
> sudo apt-get update -y
> sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose
> sudo apt autoremove --purge
</pre>
<p><strong>4. Adicionar seu usuário ao grupo docker</strong></p>
<pre>
> sudo usermod -aG docker ${USER}
> su ${USER}
</pre>
<p><strong>5. Preparar o ambiente</strong></p>
<pre>
> sudo mkdir -p /opt/geonode_custom/
> sudo usermod -a -G www-data <strong>geonode</strong>
> sudo chown -Rf <strong>geonode</strong>:www-data /opt/geonode_custom/
> sudo chmod -Rf 775 /opt/geonode_custom/
</pre>
<p>Dica: Se o nome do seu usuário não for geonode, substitua pelo nome do seu usuário na linha 2 e 3 acima.</p>
<p><strong>6. Clonar o código fonte</strong></p>
<pre>
> cd /opt/geonode_custom/
> git clone https://github.com/GeoNode/geonode-project.git -b 5.0.0
</pre>
<p>Dica: É importante ressaltar que o número que você passar após o <strong>-b</strong> é na realidade a versão que você quer baixar/instalar do GeoNode</p>
<p><strong>7. Criar uma instância do Django</strong></p>
<pre>
> source /usr/share/virtualenvwrapper/virtualenvwrapper.sh
> mkvirtualenv --python=/usr/bin/python3 my_geonode
> pip install Django==5.2
> django-admin startproject --template=./geonode-project -e py,sh,md,rst,json,yml,ini,env,sample,properties -n monitoring-cron -n Dockerfile my_geonode
> cd /opt/geonode_custom/my_geonode
</pre>
<p>OBS: Chamaremos nossa instância de my_geonode. Você pode alterar o nome conforme desejar.</p>
<p>OBS2: O Django instalado neste virtualenv é usado apenas para gerar a estrutura inicial do projeto. A versão do Django utilizada pelo GeoNode em runtime é definida pela imagem Docker.</p>
<p>No arquivo <strong>src/requirements.txt</strong>, dentro da pasta my_geonode, altere o arquivo para que ele fique da seguinte forma:</p>
<pre>
GeoNode==5.0.0
cachetools>=5.3
</pre>
<p><strong>8. Criar o arquivo .env</strong></p>
<pre>
> python create-envfile.py
</pre>
<p><strong>9. Construa os containers</strong></p>
<pre>
> docker-compose -f docker-compose.yml build --no-cache
</pre>
<p><strong>10. Finalmente execute o container</strong></p>
<pre>
> docker-compose -f docker-compose.yml up -d
</pre>
<p>Agora é só aguardar todos os containers aparecerem como done, e você já pode acessar o GeoNode no seu navegador digitando <a href="http://localhost/" target="_blank">http://localhost/</a></p>
<p>Se você quiser mais detalhes sobre a instalação basta acessar a documentação oficial do GeoNode, <a href="https://docs.geonode.org/en/master/install/basic/index.html">clicando aqui</a>.</p>
<p>Se você precisa instalar o <strong>certificado SSL para poder habilitar o HTTPS no seu GeoNode</strong>, então <a href="https://www.fernandoquadro.com.br/html/2025/06/23/instalacao-do-certificado-ssl-no-geonode/" target="_blank">clique aqui</a> e veja o passo a passo.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.fernandoquadro.com.br/html/2026/02/17/instalacao-do-geonode-5-no-ubuntu-24-04/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Curso de Python com GIS do Zero</title>
		<link>https://www.fernandoquadro.com.br/html/2026/02/11/curso-de-python-com-gis-do-zero/</link>
					<comments>https://www.fernandoquadro.com.br/html/2026/02/11/curso-de-python-com-gis-do-zero/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Quadro]]></dc:creator>
		<pubDate>Wed, 11 Feb 2026 13:37:54 +0000</pubDate>
				<category><![CDATA[GIS]]></category>
		<category><![CDATA[GEOCURSOS]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://www.fernandoquadro.com.br/html/?p=10154</guid>

					<description><![CDATA[Se você trabalha com GIS/QGIS e ainda depende de cliques, processos manuais e retrabalho, chegou a hora de mudar isso. Estão abertas as inscrições para o Curso Python com GIS do Zero, uma formação técnica e prática para quem quer... <a class="more-link" href="https://www.fernandoquadro.com.br/html/2026/02/11/curso-de-python-com-gis-do-zero/">Continue Reading &#8594;</a>]]></description>
										<content:encoded><![CDATA[<p>Se você trabalha com GIS/QGIS e ainda depende de cliques, processos manuais e retrabalho, chegou a hora de mudar isso.</p>
<p>Estão abertas as inscrições para o Curso Python com GIS do Zero, uma formação técnica e prática para quem quer sair do modo operacional e começar a programar o geoprocessamento de verdade.</p>
<p>Aqui você aprende Python aplicado ao GIS, não Python genérico.</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9e0.png" alt="🧠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> O que você vai dominar:</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Python do zero com foco técnico<br />
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Pandas e Geopandas aplicados ao GIS<br />
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Processamento de vetores e rasters (GDAL/OGR)<br />
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Análises espaciais e estatísticas zonais<br />
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> SQL Espacial moderno com DuckDB Spatial<br />
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Automação de processos no QGIS<br />
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Introdução ao desenvolvimento de plugins</p>
<p>Tudo aplicado a problemas reais, como acontece no mercado.</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3af.png" alt="🎯" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Para quem é este curso?</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f539.png" alt="🔹" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Profissionais de GIS e Geoprocessamento<br />
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f539.png" alt="🔹" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Usuários de QGIS que querem evoluir<br />
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f539.png" alt="🔹" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Quem quer ganhar produtividade e escala<br />
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f539.png" alt="🔹" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Quem quer parar de clicar e começar a programar</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Não é curso raso.<br />
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Não é só teoria.<br />
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> É formação técnica aplicada.</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4c5.png" alt="📅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Vagas limitadas</p>
<p>Se você quer transformar a forma como trabalha com GIS, essa é a hora.</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a href="https://geocursos.com.br/python" target="_blank">https://geocursos.com.br/python</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.fernandoquadro.com.br/html/2026/02/11/curso-de-python-com-gis-do-zero/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>GeoServer está morrendo? Uma análise técnica além dos achismos</title>
		<link>https://www.fernandoquadro.com.br/html/2025/12/23/geoserver-esta-morrendo-uma-analise-tecnica-alem-dos-achismos/</link>
					<comments>https://www.fernandoquadro.com.br/html/2025/12/23/geoserver-esta-morrendo-uma-analise-tecnica-alem-dos-achismos/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Quadro]]></dc:creator>
		<pubDate>Tue, 23 Dec 2025 16:29:22 +0000</pubDate>
				<category><![CDATA[GIS]]></category>
		<category><![CDATA[GeoServer]]></category>
		<guid isPermaLink="false">https://www.fernandoquadro.com.br/html/?p=10146</guid>

					<description><![CDATA[Prezado leitor, Nos últimos dias, circulou no LinkedIn um artigo que afirmava que o GeoServer estaria obsoleto e em declínio, caracterizando-o como uma ferramenta pesada e sugerindo que soluções como pg_tileserv e Martin poderiam substituí-lo integralmente. A argumentação apresentada, no... <a class="more-link" href="https://www.fernandoquadro.com.br/html/2025/12/23/geoserver-esta-morrendo-uma-analise-tecnica-alem-dos-achismos/">Continue Reading &#8594;</a>]]></description>
										<content:encoded><![CDATA[<p><strong>Prezado leitor,</strong></p>
<p>Nos últimos dias, circulou no LinkedIn um artigo que afirmava que o GeoServer estaria obsoleto e em declínio, caracterizando-o como uma ferramenta pesada e sugerindo que soluções como pg_tileserv e Martin poderiam substituí-lo integralmente.</p>
<p>A argumentação apresentada, no entanto, baseava-se predominantemente em percepções individuais, sem uma análise técnica mais aprofundada ou consideração dos diferentes contextos de uso. Ao longo deste texto, apresento uma avaliação fundamentada sobre o papel do GeoServer no ecossistema geoespacial atual, demonstrando por que ele permanece uma solução robusta, amplamente utilizada em produção e longe de estar em processo de obsolescência.</p>
<h2>1. pg_tileserv / Martin podem substituir o GeoServer em ambientes complexos?</h2>
<p>
A discussão sobre a substituição do GeoServer por ferramentas como pg_tileserv ou Martin tem ganhado espaço à medida que arquiteturas geoespaciais mais enxutas e orientadas a frontend se popularizam. No entanto, quando analisamos ambientes complexos e institucionais a resposta técnica é clara: essas ferramentas não são substitutos funcionais do GeoServer, mas sim componentes complementares.
</p>
<h2>2. Escopo funcional e vocação das ferramentas</h2>
<p>
pg_tileserv e Martin foram concebidos para resolver um problema específico: a entrega eficiente de dados geoespaciais vetoriais a aplicações web modernas, geralmente por meio de vector tiles ou APIs REST simples, com foco em desempenho, baixa latência e simplicidade operacional. Sua arquitetura stateless, o acoplamento direto ao PostGIS e a ausência de camadas intermediárias fazem dessas ferramentas excelentes escolhas para produtos digitais orientados a UX.
</p>
<p>
O GeoServer, por outro lado, foi projetado como um servidor geoespacial corporativo, voltado à publicação, gestão e interoperabilidade de dados espaciais em ambientes multiusuário e de longo prazo. Seu escopo funcional é deliberadamente mais amplo e atende a requisitos que não são cobertos por servidores de tiles ou APIs minimalistas.
</p>
<h2>3. Governança e ciclo de vida dos dados</h2>
<p>
Em infraestruturas complexas, o desafio central não é apenas servir dados, mas governá-los. Isso inclui:
</p>
<ul>
<li>Publicação controlada de centenas de camadas;</li>
<li>Organização por temas, domínios e responsabilidades institucionais;</li>
<li>Gerenciamento de estilos, projeções e escalas;</li>
<li>Controle de acesso por camada e por serviço;</li>
<li>Auditoria e rastreabilidade.</li>
</ul>
<p>
Ferramentas como pg_tileserv e Martin não oferecem mecanismos nativos para esse tipo de governança. Para alcançar um nível equivalente, seria necessário desenvolver soluções adicionais para catalogação, versionamento, autorização e gestão operacional, deslocando a complexidade do servidor para a aplicação e aumentando o custo de manutenção.
</p>
<h2>4. Padrões OGC e interoperabilidade</h2>
<p>
Ambientes públicos e institucionais dependem fortemente de padrões OGC consolidados, como WMS, WFS e WCS, não apenas por questões técnicas, mas também por exigências legais, normativas e de interoperabilidade. Esses serviços permitem o consumo dos dados por uma ampla variedade de clientes, incluindo QGIS, ArcGIS e sistemas legados.
</p>
<p>
pg_tileserv e Martin não implementam esses padrões e tampouco se propõem a fazê-lo. Ainda que APIs REST e OGC API representem avanços importantes, a substituição completa de serviços OGC clássicos em ambientes consolidados é, na prática, inviável no curto e médio prazo.
</p>
<h2>5. Fluxos operacionais e perfil dos usuários</h2>
<p>
Outro aspecto frequentemente subestimado é o perfil dos usuários responsáveis pela publicação dos dados. Em plataformas complexas, técnicos e analistas utilizam fluxos consolidados, como a publicação direta de camadas a partir do QGIS, sem a necessidade de intervenção de equipes de desenvolvimento ou DevOps.
</p>
<p>
A adoção exclusiva de ferramentas como pg_tileserv ou Martin exigiria mudanças profundas nesses fluxos, demandando maior especialização técnica, automação customizada e novos processos organizacionais, um custo que raramente é justificável em ambientes públicos.
</p>
<h2>6. Escalabilidade: técnica versus institucional</h2>
<p>
É inegável que pg_tileserv e Martin apresentam vantagens claras em termos de escalabilidade técnica e simplicidade operacional. No entanto, em infraestruturas institucionais, a escalabilidade não se limita ao número de requisições por segundo. Ela envolve também:
</p>
<ul>
<li>Continuidade operacional;</li>
<li>Estabilidade a longo prazo;</li>
<li>Facilidade de administração;</li>
<li>Conformidade com padrões e políticas públicas.</li>
</ul>
<p>
Nesse contexto, o GeoServer demonstra sua robustez ao operar de forma estável em produção por anos, atendendo milhões de acessos e grandes volumes de dados, podendo citar como exemplo o GeoSampa, um dos maiores portais do país.
</p>
<h2>7. Arquiteturas complementares como caminho evolutivo</h2>
<p>
A evolução mais consistente para ambientes complexos não passa pela substituição radical do GeoServer, mas pela composição de arquiteturas. Um modelo híbrido, no qual o GeoServer permanece responsável pela governança, interoperabilidade e serviços institucionais, enquanto ferramentas como pg_tileserv ou Martin são utilizadas para a entrega eficiente de dados a aplicações web modernas, tende a oferecer o melhor equilíbrio entre inovação e estabilidade.
</p>
<h2>8. Conclusão</h2>
<p>
pg_tileserv e Martin representam avanços importantes no ecossistema geoespacial e são altamente adequados para determinados cenários. Contudo, em ambientes complexos e institucionais, eles não substituem o GeoServer. O desafio não é escolher entre “antigo” e “moderno”, mas compreender o papel de cada componente e projetar arquiteturas que respeitem tanto as necessidades técnicas quanto organizacionais.
</p>
<p>
A maturidade de uma infraestrutura geoespacial não está em adotar ferramentas minimalistas isoladamente, mas em integrá-las de forma coerente a um ecossistema que exige governança, interoperabilidade e sustentabilidade a longo prazo.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.fernandoquadro.com.br/html/2025/12/23/geoserver-esta-morrendo-uma-analise-tecnica-alem-dos-achismos/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>GeoServer 3: O que vem por aí?</title>
		<link>https://www.fernandoquadro.com.br/html/2025/12/18/geoserver-3-o-que-vem-por-ai/</link>
					<comments>https://www.fernandoquadro.com.br/html/2025/12/18/geoserver-3-o-que-vem-por-ai/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Quadro]]></dc:creator>
		<pubDate>Thu, 18 Dec 2025 19:05:53 +0000</pubDate>
				<category><![CDATA[GIS]]></category>
		<category><![CDATA[GeoServer]]></category>
		<guid isPermaLink="false">https://www.fernandoquadro.com.br/html/?p=10121</guid>

					<description><![CDATA[Prezado leitor, Caso você ainda não tenha acompanhado as últimas novidades do projeto, no primeiro semestre de 2026 a equipe do GeoServer irá disponibilizar a versão 3.0. Mais do que uma simples mudança de numeração, essa nova versão representa uma... <a class="more-link" href="https://www.fernandoquadro.com.br/html/2025/12/18/geoserver-3-o-que-vem-por-ai/">Continue Reading &#8594;</a>]]></description>
										<content:encoded><![CDATA[<p><strong>Prezado leitor,</strong></p>
<p>
Caso você ainda não tenha acompanhado as últimas novidades do projeto, no primeiro semestre de 2026 a equipe do GeoServer irá disponibilizar a <strong>versão 3.0</strong>. </p>
<p>Mais do que uma simples mudança de numeração, essa nova versão representa uma <strong>atualização tecnológica profunda</strong>, essencial para garantir a evolução, a segurança e a sustentabilidade do GeoServer nos próximos anos.
</p>
<p>
A proposta do GeoServer 3 é transformar a forma como você interage com dados geoespaciais, tornando a plataforma <strong>mais rápida, mais intuitiva e mais segura</strong>, tanto para administradores quanto para desenvolvedores e usuários finais.
</p>
<p>
<strong>A principal motivação</strong> por trás do GeoServer 3 é a atualização do <strong>Spring Framework</strong>, que evolui da versão <strong>5.3 para a versão 6</strong>. </p>
<p><img loading="lazy" decoding="async" src="https://www.fernandoquadro.com.br/html/wp-content/uploads/2025/12/spring5-6.png" alt="Evolução do Spring Framework do 5 para o 6" width="803" height="321" class="aligncenter size-full wp-image-10126" srcset="https://www.fernandoquadro.com.br/html/wp-content/uploads/2025/12/spring5-6.png 803w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2025/12/spring5-6-300x120.png 300w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2025/12/spring5-6-768x307.png 768w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2025/12/spring5-6-600x240.png 600w" sizes="auto, (max-width: 803px) 100vw, 803px" /></p>
<p>A adoção de uma versão atual e compatível desse framework web é um fator crítico para a <strong>segurança</strong> e a <strong>manutenibilidade</strong> do GeoServer.
</p>
<p>
A atualização do Spring Framework traz uma série de consequências técnicas importantes:
</p>
<ul>
<li>
		O ambiente do servidor de aplicações passa de <strong>Java Enterprise Edition (Java EE)</strong> para<br />
		<strong>Jakarta Enterprise Edition</strong>, fornecido pelas versões mais recentes do<br />
		<strong>Tomcat 10</strong> e <strong>Jetty 12</strong>.
	</li>
<li>
		O ambiente de execução Java evolui de <strong>Java 11</strong> para <strong>Java 17</strong>. Essa mudança exige a substituição do mecanismo de processamento de imagens <strong>Java Advanced Imaging (JAI)</strong> pelo <strong>ImageN</strong>.
	</li>
<li>
		O sistema de segurança é atualizado para o <strong>Spring Security 6</strong>, o que demanda a<br />
		reescrita dos módulos existentes de <strong>OAuth2</strong> e <strong>OpenID Connect</strong>.
	</li>
</ul>
<p><img loading="lazy" decoding="async" src="https://www.fernandoquadro.com.br/html/wp-content/uploads/2025/12/milestores_gs3.png" alt="Milestones do GeoServer 3" width="1596" height="382" class="aligncenter size-full wp-image-10123" srcset="https://www.fernandoquadro.com.br/html/wp-content/uploads/2025/12/milestores_gs3.png 1596w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2025/12/milestores_gs3-300x72.png 300w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2025/12/milestores_gs3-1024x245.png 1024w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2025/12/milestores_gs3-768x184.png 768w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2025/12/milestores_gs3-1536x368.png 1536w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2025/12/milestores_gs3-600x144.png 600w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2025/12/milestores_gs3-945x226.png 945w" sizes="auto, (max-width: 1596px) 100vw, 1596px" /></p>
<p>
Para viabilizar essas mudanças estruturais, o projeto foi organizado em <strong>três grandes marcos (milestones)</strong>:
</p>
<h3>Milestone 1: Preparação</h3>
<p><center><br />
<img loading="lazy" decoding="async" src="https://www.fernandoquadro.com.br/html/wp-content/uploads/2025/12/gs3-milestone1.png" alt="" width="517" height="417" class="aligncenter size-full wp-image-10138" srcset="https://www.fernandoquadro.com.br/html/wp-content/uploads/2025/12/gs3-milestone1.png 517w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2025/12/gs3-milestone1-300x242.png 300w" sizes="auto, (max-width: 517px) 100vw, 517px" /><br />
</center></p>
<p>
Este marco concentrou a maior parte do trabalho, antecipando tudo o que fosse possível antes da migração efetiva para o Spring Framework 6.
</p>
<p>
Entre as principais atividades realizadas estão:
</p>
<ul>
<li>Grandes atualizações na biblioteca de interface do usuário <strong>Wicket</strong>;</li>
<li>Substituição do mecanismo de processamento de imagens;</li>
<li>Atualização do ambiente de execução para <strong>Java 17</strong>.</li>
</ul>
<p>
Essas alterações foram feitas de forma independente do Spring Framework e da migração para o ambiente Jakarta EE, reduzindo riscos na fase seguinte.
</p>
<p>
Outro ponto de destaque foi a substituição do antigo suporte a OAuth2 por um novo módulo <strong>OAuth2 OpenID Connect</strong>, já disponível para testes com provedores como <strong>Google</strong>, <strong>GitHub</strong>, <strong>Microsoft Azure</strong> e <strong>Keycloak</strong>. </p>
<p>Um avanço importante foi a integração testada com o Keycloak por meio de contêineres de teste, abrindo caminho para o suporte oficial dessa extensão no futuro.
</p>
<p>
Essas entregas já estão disponíveis a partir da versão <strong>GeoServer 2.28.x</strong>, lançada em setembro.
</p>
<h3>Milestone 2: Migração</h3>
<p><center><br />
<img loading="lazy" decoding="async" src="https://www.fernandoquadro.com.br/html/wp-content/uploads/2025/12/gs3-milestone2.png" alt="" width="466" height="409" class="aligncenter size-full wp-image-10139" srcset="https://www.fernandoquadro.com.br/html/wp-content/uploads/2025/12/gs3-milestone2.png 466w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2025/12/gs3-milestone2-300x263.png 300w" sizes="auto, (max-width: 466px) 100vw, 466px" /><br />
</center></p>
<p>
O <strong>Spring Framework 5.3</strong>, utilizado até então pelo GeoServer, atingiu o fim de seu ciclo de vida em agosto de 2023, o que tornou essa etapa de migração especialmente urgente.
</p>
<p>
A migração para o <strong>Spring Framework 6</strong> exigiu uma coordenação cuidadosa envolvendo <strong>nove bases de código</strong>. Para garantir consistência e estabilidade, foi necessário um período de <strong>&#8220;congelamento de código&#8221;</strong> enquanto as atualizações eram realizadas.
</p>
<p>
Esse congelamento impactou diretamente projetos fundamentais do ecossistema, como: <strong>ImageIO, JAI, ImageN, GeoTools, GeoWebCache, GeoServer, GeoFence, GeoServer ACL, MapFish Print</strong> e o <strong>Cloud Native GeoServer</strong>.
</p>
<p>
Dado o nível de impacto, a prioridade foi manter essa fase o mais curta possível. Ao final desse marco, o aplicativo principal do GeoServer já pôde ser executado e testado localmente utilizando o <strong>Jetty</strong>, incluindo módulos que ainda passam por ajustes finais, como o GeoFence.
</p>
<p>
Essa etapa foi concluída <strong>ainda em 2025</strong>.
</p>
<h3>Milestone 3: Entrega</h3>
<p><center><br />
<img loading="lazy" decoding="async" src="https://www.fernandoquadro.com.br/html/wp-content/uploads/2025/12/gs3-milestone3.png" alt="" width="500" height="409" class="aligncenter size-full wp-image-10140" srcset="https://www.fernandoquadro.com.br/html/wp-content/uploads/2025/12/gs3-milestone3.png 500w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2025/12/gs3-milestone3-300x245.png 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /><br />
</center></p>
<p>
Com os projetos principais atualizados e o encerramento do congelamento de código, iniciou-se a fase de <strong>testes de integração</strong> com aplicações downstream e módulos da comunidade.
</p>
<p>
Uma atividade estratégica deste marco é a <strong>refatoração da interface do usuário</strong>, permitindo que os serviços <strong>OGC API</strong> sejam integrados como parte nativa da experiência do GeoServer.
</p>
<p>
Também está previsto um <strong>refresh visual</strong> do tema da aplicação, acompanhado da atualização das imagens de tela e da documentação durante o ciclo de testes.
</p>
<p>
O encerramento deste marco culminará no lançamento oficial do <strong>GeoServer 3.0</strong>, previsto para <strong>março de 2026</strong>.
</p>
<p>
Esse plano de trabalho foi cuidadosamente definido para minimizar impactos na comunidade do GeoServer, reduzindo ao máximo o período em que o código-fonte permanece congelado durante o processo de atualização.
</p>
<p>Fonte: <a href="https://docs.google.com/document/d/1iCqob2R5Zcs9liODq2UGGiOUQhFWQJrjZCJxBVUP5Q4/edit?tab=t.0" target="_blank">GS3 Project Plan</a></p>
<p><strong>E você?</strong> Já estava por dentro de todas essas novidades do GeoServer 3.0?</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.fernandoquadro.com.br/html/2025/12/18/geoserver-3-o-que-vem-por-ai/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Como alterar o contextPath no GeoServer</title>
		<link>https://www.fernandoquadro.com.br/html/2025/11/17/como-alterar-o-contextpath-no-geoserver/</link>
					<comments>https://www.fernandoquadro.com.br/html/2025/11/17/como-alterar-o-contextpath-no-geoserver/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Quadro]]></dc:creator>
		<pubDate>Mon, 17 Nov 2025 12:00:49 +0000</pubDate>
				<category><![CDATA[GIS]]></category>
		<category><![CDATA[GeoServer]]></category>
		<guid isPermaLink="false">https://www.fernandoquadro.com.br/html/?p=10096</guid>

					<description><![CDATA[Em ambientes onde o GeoServer é executado dentro de um contêiner Apache Tomcat, pode surgir a necessidade de alterar o caminho de contexto (contextPath) da aplicação, ou seja, o endereço pelo qual o serviço será acessado. Essa modificação é comum... <a class="more-link" href="https://www.fernandoquadro.com.br/html/2025/11/17/como-alterar-o-contextpath-no-geoserver/">Continue Reading &#8594;</a>]]></description>
										<content:encoded><![CDATA[<p>Em ambientes onde o GeoServer é executado dentro de um contêiner Apache Tomcat, pode surgir a necessidade de alterar o caminho de contexto (contextPath) da aplicação, ou seja, o endereço pelo qual o serviço será acessado.</p>
<p>Essa modificação é comum em cenários de ambientes compartilhados, integrações com outros sistemas, migrações de infraestrutura ou simplesmente para padronizar URLs (por exemplo, mudar de <strong>/geoserver</strong> para <strong>/geoserver-admin</strong> ou <strong>/gis</strong>).</p>
<p>No entanto, antes de fazer essa alteração, é importante revisar as configurações do Tomcat, especialmente no arquivo <strong>server.xml</strong>, e entender a diferença entre deploy automático e manual, garantindo que o GeoServer seja publicado corretamente no novo contexto.</p>
<p>Gostaria de agradecer ao <strong><a href="https://www.osgeo.org/member/mota/" target="_blank">Carlos Eduardo Mota</a></strong>, que foi quem elaborou esse tutorial e enviou gentilmente para publicação neste Blog.</p>
<h3>1) Verificando o <strong>server.xml</strong></h3>
<p>Local do arquivo:</p>
<pre>
$CATALINA_HOME/conf/server.xml
</pre>
<p>No arquivo, observe:</p>
<ul>
<li>Na tag <strong>&lt;Engine&gt;</strong>:
<ul>
<li>Propriedade <strong>name</strong> (geralmente <strong>Catalina</strong>).</li>
<li>Propriedade <strong>defaultHost</strong>.</li>
</ul>
</li>
<li>Na tag <strong>&lt;Host&gt;</strong>:
<ul>
<li>Propriedade <strong>appBase</strong> (pasta onde os apps são implantados, normalmente <strong>webapps</strong>).</li>
<li>Propriedade <strong>autoDeploy</strong> (deve estar <strong>true</strong> para deploy automático).</li>
</ul>
</li>
</ul>
<p><strong>Exemplo:</strong></p>
<pre>
&lt;Engine name="Catalina" defaultHost="localhost"&gt;

    &lt;!-- Configurações de cluster, log e segurança omitidas --&gt;

    &lt;Realm className="org.apache.catalina.realm.LockOutRealm"&gt;
        &lt;Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/&gt;
    &lt;/Realm&gt;

    &lt;Host name="localhost" appBase="webapps"
          unpackWARs="true" autoDeploy="true"&gt;

        &lt;Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &amp;quot;%r&amp;quot; %s %b"/&gt;
    &lt;/Host&gt;
&lt;/Engine&gt;
</pre>
<h3>2) Deploy automático vs. manual</h3>
<p>Por padrão, o GeoServer é implantado automaticamente quando o arquivo <strong>.war</strong> é colocado na pasta definida como <strong>appBase</strong> no <strong>&lt;Host&gt;</strong>, geralmente:</p>
<pre>
$CATALINA_HOME/webapps
</pre>
<p>Exemplo: colocar <strong>meu-app.war</strong> em <strong>webapps/</strong> fará com que ele seja acessível via <strong>/meu-app</strong>.</p>
<p>Se você <strong>não</strong> deseja deploy automático (ou precisa de um contexto customizado), defina o contexto manualmente usando um <strong>arquivo de contexto</strong>.</p>
<h3>3) Deploy manual com arquivo de contexto</h3>
<ol>
<li>Posicione o <strong>.war</strong> (ou o diretório do app já expandido) <strong>fora</strong> da pasta <strong>appBase</strong>.</li>
<li>Crie um arquivo de contexto <strong>.xml</strong> com o nome que deseja usar como <strong>contextPath</strong> do app.</li>
</ol>
<p>Onde criar:</p>
<pre>
$CATALINA_HOME/conf/[EngineName]/[HostName]/
</pre>
<p>Exemplo de caminho real:</p>
<pre>
$CATALINA_HOME/conf/Catalina/localhost/geoserver-admin.xml
</pre>
<p>Conteúdo do arquivo de contexto:</p>
<pre>
&lt;Context docBase="webapps.dist/geoserver" /&gt;
</pre>
<p>Neste exemplo, o contexto será:</p>
<pre>http://localhost:8080/geoserver-admin
</pre>
<p>E o diretório do GeoServer está em:</p>
<pre>
$CATALINA_HOME/webapps.dist/geoserver
</pre>
<p>O diretório <strong>webapps.dist</strong> é fornecido nas imagens de container para colocar webapps para distribuição, e não para deploy automático. É provável que nas instalações clássicas do tomcat não deva existir esse diretório. Nesse caso, é necessário criar esse diretório dentro de $CATALINA_HOME.</p>
<p><strong>Observação importante:</strong> o <em>nome do arquivo</em> (<strong>geoserver-admin.xml</strong>) define o nome do contexto (<strong>/geoserver-admin</strong>) e tem <strong>precedência</strong> sobre qualquer <strong>META-INF/context.xml</strong> incluído no <strong>.war</strong> ou na aplicação.</p>
<p>O arquivo <strong>context.xml</strong> pode ser expandido e ser utilizado para outras finalidades, como predefinir recursos de conexão de banco de dados (os famosos <a href="https://tomcat.apache.org/tomcat-9.0-doc/jndi-resources-howto.html" target="_blank">JNDI</a>), mas isso é assunto para outro post. </p>
<h3>Referências</h3>
<ul>
<li><strong>Tomcat 8</strong>
<ul>
<li><a href="https://tomcat.apache.org/tomcat-8.0-doc/deployer-howto.html#A_word_on_Contexts" target="_blank" rel="noopener">Deployer How-To (Contexts)</a></li>
<li><a href="https://tomcat.apache.org/tomcat-8.0-doc/config/context.html" target="_blank" rel="noopener">Configuração: Context</a></li>
</ul>
</li>
<li><strong>Tomcat 9</strong>
<ul>
<li><a href="https://tomcat.apache.org/tomcat-9.0-doc/deployer-howto.html#A_word_on_Contexts" target="_blank" rel="noopener">Deployer How-To (Contexts)</a></li>
<li><a href="https://tomcat.apache.org/tomcat-9.0-doc/config/context.html" target="_blank" rel="noopener">Configuração: Context</a></li>
</ul>
</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.fernandoquadro.com.br/html/2025/11/17/como-alterar-o-contextpath-no-geoserver/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Salvar a configuração do GeoServer no PostgreSQL com JDBCConfig e JDBCStore</title>
		<link>https://www.fernandoquadro.com.br/html/2025/11/06/salvar-a-configuracao-do-geoserver-no-postgresql-com-jdbcconfig-e-jdbcstore/</link>
					<comments>https://www.fernandoquadro.com.br/html/2025/11/06/salvar-a-configuracao-do-geoserver-no-postgresql-com-jdbcconfig-e-jdbcstore/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Quadro]]></dc:creator>
		<pubDate>Thu, 06 Nov 2025 13:34:28 +0000</pubDate>
				<category><![CDATA[GIS]]></category>
		<category><![CDATA[GeoServer]]></category>
		<guid isPermaLink="false">https://www.fernandoquadro.com.br/html/?p=10066</guid>

					<description><![CDATA[Você sabia que o GeoServer pode armazenar toda a sua configuração (workspaces, stores, layers, styles) em um banco de dados PostgreSQL, em vez de gravar arquivos XML no diretório data_dir? Isso é possível com dois módulos da comunidade: JDBCConfig e... <a class="more-link" href="https://www.fernandoquadro.com.br/html/2025/11/06/salvar-a-configuracao-do-geoserver-no-postgresql-com-jdbcconfig-e-jdbcstore/">Continue Reading &#8594;</a>]]></description>
										<content:encoded><![CDATA[<p>Você sabia que o GeoServer pode armazenar toda a sua<strong> configuração</strong> (workspaces, stores, layers, styles) em um <strong>banco de dados PostgreSQL</strong>, em vez de gravar arquivos XML no diretório data_dir?</p>
<p>Isso é possível com dois módulos da comunidade: <strong>JDBCConfig e JDBCStore</strong>. Apesar de frequentemente usados juntos, eles têm funções diferentes e complementares.</p>
<p><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9e9.png" alt="🧩" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 1. O que é o JDBCConfig</strong></p>
<p>O JDBCConfig é um módulo que permite ao GeoServer salvar toda a configuração do catálogo(metadados) dentro de um banco relacional, como o PostgreSQL.</p>
<p>Por padrão, o GeoServer armazena sua configuração em diversos arquivos XML dentro do diretório data_dir — um para cada workspace, store, camada e estilo. Com o módulo <strong>JDBCConfig</strong>, essas informações deixam de ser gravadas nesses arquivos e passam a ser persistidas diretamente em tabelas no banco de dados, substituindo por completo o backend de configuração baseado em arquivos.</p>
<p><strong>1.1 O que ele armazena</strong></p>
<ul>
<li>Workspaces</li>
<li>DataStores (referências às fontes de dados)</li>
<li>Layers</li>
<li>Styles (metadados, não o conteúdo do arquivo em si)</li>
<li>Configurações globais e de serviços (WMS, WFS, etc.)</li>
</ul>
<p><strong>1.2 Vantagens</strong></p>
<ul>
<li>Melhor escalabilidade: evita o gargalo de leitura/escrita em centenas de XMLs.</li>
<li>Mais segurança em cluster: todas as instâncias compartilham o mesmo catálogo.</li>
<li>Gerenciamento centralizado: fácil backup, versionamento e replicação via banco.</li>
</ul>
<p><strong>1.3 Quando usar</strong></p>
<ul>
<li>Ambientes em cluster (várias instâncias do GeoServer).</li>
<li>Ambientes com muitas camadas e workspaces (centenas ou milhares).</li>
<li>Pode ser usado mesmo em um único servidor, apenas para reduzir I/O de disco e facilitar</li>
</ul>
<p><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f5c2.png" alt="🗂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 2. O que é o JDBCStore</strong></p>
<p>O JDBCStore é outro módulo comunitário que complementa o JDBCConfig. Ele permite armazenar os arquivos reais do data_dir (como estilos .sld, imagens, legendas e uploads) dentro do banco de dados, em vez de no sistema de arquivos.</p>
<p>Diferente do JDBCConfig, que salva metadados e estrutura do catálogo, o JDBCStore salva conteúdo binário (arquivos, blobs).</p>
<p><strong>2.1 O que ele armazena</strong></p>
<ul>
<li>Arquivos de estilos (SLD, CSS)</li>
<li>Imagens usadas em símbolos e legendas</li>
<li>Arquivos de uploads feitos via REST ou UI</li>
<li>Qualquer outro recurso armazenado dentro de data_dir</li>
</ul>
<p><strong>2.2 Vantagens</strong></p>
<ul>
<li>Evita dependência de compartilhamento via NFS em clusters.</li>
<li>Centraliza todos os recursos no banco, junto com o catálogo.</li>
<li>Facilita backup e replicação, basta copiar o banco.</li>
</ul>
<p><strong>2.3 Quando usar</strong></p>
<ul>
<li>Com JDBCConfig, em ambiente clusterizado é ideal.</li>
<li>Sem JDBCConfig, se você quiser apenas armazenar os arquivos no banco e manter a configuração ainda em XML.</li>
<li>Útil também em servidores únicos, se você quiser facilitar deploys e migrações (sem precisar sincronizar pastas de estilos entre máquinas).</li>
</ul>
<p><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 3. Relação e diferenças entre JDBCConfig e JDBCStore</strong></p>
<p>Embora os dois módulos sejam frequentemente mencionados juntos, eles têm propósitos distintos dentro do GeoServer.</p>
<p>O JDBCConfig é responsável por armazenar as configurações do catálogo, ou seja, toda a estrutura de metadados que descreve o funcionamento do GeoServer, os workspaces, as conexões com bancos de dados, as camadas e os estilos associados. Ele substitui o modelo tradicional baseado em arquivos XML, gravando essas informações diretamente em tabelas no banco de dados.</p>
<p>Já o JDBCStore atua em outro nível: ele armazena o conteúdo físico dos arquivos que normalmente ficam no data_dir. Isso inclui estilos (.sld, .css), imagens, legendas e qualquer outro arquivo binário usado pelo GeoServer. Em vez de deixar esses recursos no sistema de arquivos, o JDBCStore os grava como blobs dentro do banco.</p>
<p>Os dois módulos podem funcionar independentemente. Você pode usar apenas o JDBCConfig, mantendo os arquivos (como SLDs) ainda no disco ou apenas o JDBCStore, guardando os arquivos no banco, mas deixando o catálogo em XML.</p>
<p>No entanto, o uso conjunto dos dois traz o máximo de benefícios: a configuração e os recursos do GeoServer passam a ser totalmente centralizados e sincronizados no banco de dados, eliminando a necessidade de um diretório compartilhado via NFS.</p>
<p>Resumindo:</p>
<ul>
<li>O JDBCConfig guarda o “quem é quem” (a estrutura de configuração).</li>
<li>O JDBCStore guarda o “o que é” (os arquivos e recursos reais).</li>
<li>Usados juntos, eliminam completamente a necessidade de um data_dir compartilhado, tornando o GeoServer mais robusto e escalável em ambientes distribuídos.</li>
</ul>
<p><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2699.png" alt="⚙" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 4. Como instalar o JDBCConfig e o JDBCStore no GeoServer 2.28.0</strong></p>
<p><strong>4.1 Baixar os módulos</strong></p>
<p>Acesse a página de Community Modules da sua versão: <a href="https://geoserver.org/release/2.28.x/" target="_blank">https://geoserver.org/release/2.28.x/</a></p>
<p>Baixe os arquivos:</p>
<p>geoserver-2.28.x-jdbcconfig-plugin.zip<br />
geoserver-2.28.x-jdbcstore-plugin.zip</p>
<p>Extraia os .jar e copie para:</p>
<pre>
GEOSERVER_HOME/WEB-INF/lib/
</pre>
<p><strong>4.2 Criar o banco no PostgreSQL</strong></p>
<p>Crie um novo banco vazio, por exemplo:</p>
<pre>
CREATE DATABASE geoserver_catalog;
CREATE USER geoserver_user WITH PASSWORD 'senha_segura';
GRANT ALL PRIVILEGES ON DATABASE geoserver_catalog TO geoserver_user;
</pre>
<p><strong>4.3 Configurar o JDBCConfig</strong></p>
<p>Após o primeiro restart do GeoServer com o módulo instalado, será criada a pasta:</p>
<pre>
data_dir/jdbcconfig/
</pre>
<p>Dentro dela há um arquivo de exemplo <strong>jdbcconfig.properties.postgres</strong>. Edite-o e configure conforme abaixo:</p>
<pre>
enabled=true
initdb=true
import=true
...
username=geoserver_user
password=senha_segura
jdbcUrl=jdbc:postgresql://localhost:5432/geoserver_catalog
</pre>
<p>Salve o arquivo como <strong>jdbcconfig.properties</strong>, reinicie o GeoServer e observe no log, se tudo estiver certo, ele criará as tabelas automaticamente e importará sua configuração XML atual para o banco.</p>
<p><strong>4.4 Configurar o JDBCStore</strong></p>
<p>Após instalar o módulo jdbcstore, um diretório semelhante será criado:</p>
<pre>
data_dir/jdbcstore/
</pre>
<p>Edite o arquivo jdbcstore.properties (também há um .postgres de exemplo):</p>
<pre>
enabled=true
initdb=true
...
username=geoserver_user
password=senha_segura
jdbcUrl=jdbc:postgresql://localhost:5432/geoserver_catalog
</pre>
<p>Reinicie o GeoServer novamente.</p>
<p><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9e0.png" alt="🧠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 5. Conclusão</strong></p>
<p>O uso do JDBCConfig e do JDBCStore traz uma série de benefícios, especialmente em ambientes de alta disponibilidade ou clusterizados.</p>
<p>Eles permitem que toda a configuração e os recursos do GeoServer sejam armazenados de forma transacional, centralizada e sincronizada dentro de um banco de dados relacional.</p>
<p>Mas mesmo em ambientes sem cluster, esses módulos podem ser vantajosos para quem busca:</p>
<ul>
<li>Simplificar backups e migrações (basta exportar o banco);</li>
<li>Reduzir I/O de disco em instalações muito grandes;</li>
<li>Facilitar o versionamento da configuração.</li>
</ul>
<p>E você leitor, conhecia esses módulos do GeoServer? O que achou? Deixe seu comentário, vou gostar de saber sua opinião.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.fernandoquadro.com.br/html/2025/11/06/salvar-a-configuracao-do-geoserver-no-postgresql-com-jdbcconfig-e-jdbcstore/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>GeoNode + IA: Chatbot para consulta de dados espaciais</title>
		<link>https://www.fernandoquadro.com.br/html/2025/10/15/geonode-ia-chatbot-para-consulta-de-dados-espaciais/</link>
					<comments>https://www.fernandoquadro.com.br/html/2025/10/15/geonode-ia-chatbot-para-consulta-de-dados-espaciais/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Quadro]]></dc:creator>
		<pubDate>Wed, 15 Oct 2025 12:00:52 +0000</pubDate>
				<category><![CDATA[GIS]]></category>
		<category><![CDATA[GeoNode]]></category>
		<category><![CDATA[IA]]></category>
		<guid isPermaLink="false">https://www.fernandoquadro.com.br/html/?p=10034</guid>

					<description><![CDATA[Imagine poder conversar com o seu GeoNode como se fosse um assistente técnico: “Mostre os municípios com população acima de 50 mil.” “Liste as camadas relacionadas a meio ambiente publicadas em 2024.” “Quais áreas de risco estão dentro da zona... <a class="more-link" href="https://www.fernandoquadro.com.br/html/2025/10/15/geonode-ia-chatbot-para-consulta-de-dados-espaciais/">Continue Reading &#8594;</a>]]></description>
										<content:encoded><![CDATA[<p>Imagine poder conversar com o seu <strong>GeoNode </strong>como se fosse um assistente técnico:</p>
<p>“Mostre os municípios com população acima de 50 mil.”<br />
“Liste as camadas relacionadas a meio ambiente publicadas em 2024.”<br />
“Quais áreas de risco estão dentro da zona urbana de Florianópolis?”</p>
<p>Essas consultas, que normalmente exigiriam acesso ao banco ou ao painel do GeoNode, podem ser respondidas <strong>em segundo</strong>s por um <strong>chatbot integrado com IA</strong>.</p>
<p>A ideia deste post é mostrar como criar um assistente geoespacial inteligente, capaz de:</p>
<ul>
<li>Compreender perguntas em linguagem natural;</li>
<li>Traduzir em chamadas à API do GeoNode (ou SQL/PostGIS);</li>
<li>Retornar respostas estruturadas (tabelas, nomes de camadas, metadados, links);</li>
<li>E até gerar mapas dinâmicos a partir das consultas.</li>
</ul>
<p><strong>1. O papel do GeoNode como fonte de conhecimento geoespacial</strong></p>
<p>O GeoNode expõe suas informações por meio de uma API REST poderosa:</p>
<ul>
<li><strong>/api/v2/datasets/</strong> → lista de camadas;</li>
<li><strong>/api/v2/maps/</strong> → mapas compostos;</li>
<li><strong>/api/v2/documents/</strong> → relatórios e anexos;</li>
<li><strong>/api/v2/datasets/{id}/</strong> → metadados detalhados de uma camada.</li>
</ul>
<p>Com essas rotas, é possível consultar qualquer informação sobre os dados publicados, autores, datas, categorias, palavras-chave, links WMS/WFS e muito mais.</p>
<p>O desafio é como traduzir uma pergunta humana em uma sequência de chamadas a essa API? A resposta é, usando IA generativa como intérprete.</p>
<p>A IA funciona como um “tradutor semântico” entre o usuário e o GeoNode. Ela interpreta o que foi pedido e decide:</p>
<ul>
<li>Qual endpoint da API deve ser consultado;</li>
<li>Quais filtros aplicar (categoria, data, palavra-chave, etc.);</li>
<li>Como formatar a resposta para o usuário.</li>
</ul>
<p>Além disso, a IA pode resumir os metadados retornados, explicando o contexto da camada em linguagem natural.</p>
<p><strong>2. Chatbot + GeoNode + IA</strong></p>
<p>Vamos montar um exemplo funcional em Python.</p>
<pre>
import requests
from openai import OpenAI

# Configurações
GEONODE_URL = "http://localhost:8000/api/v2/datasets/"
GEONODE_USER = "admin"
GEONODE_PASS = "geonode"
MODEL = "gpt-4o-mini"

# Inicializa cliente OpenAI
client = OpenAI()

# Entrada do usuário
pergunta = "Liste as camadas de saneamento publicadas em 2024."

# Prompt para IA gerar consulta API
prompt = f"""
Você é um assistente que interpreta perguntas sobre um GeoNode.
Gere a URL completa da API a ser consultada, com base na pergunta abaixo.
URL base: {GEONODE_URL}
Pergunta: {pergunta}
Exemplo de resposta esperada:
GET http://localhost:8000/api/v2/datasets/?keywords__slug=saneamento&date__year=2024
"""

# Chamada à API da OpenAI
resposta = client.chat.completions.create(
    model=MODEL,
    messages=[{"role": "user", "content": prompt}]
)

# Extrai URL
consulta = resposta.choices[0].message.content.strip().replace("GET ", "")
print("URL gerada pela IA:\n", consulta)

# 2. Executar chamada à API do GeoNode
r = requests.get(consulta, auth=(GEONODE_USER, GEONODE_PASS))
if r.status_code == 200:
    data = r.json().get("results", [])
    print(f"\n{len(data)} camadas encontradas:\n")
    for layer in data:
        title = layer.get("title", "Sem título")
        category = layer.get("category", {}).get("gn_description", "Sem categoria")
        print(f"- {title} ({category})")
else:
    print("Erro na requisição:", r.status_code, r.text)

</pre>
<p>Após a execução do script você terá a seguinte resposta: </p>
<p>URL gerada pela IA:<br />
http://localhost:8000/api/v2/datasets/?keywords__slug=saneamento&#038;date__year=2024</p>
<p>3 camadas encontradas:<br />
&#8211; Sistema de Esgotamento Sanitário (Infraestrutura)<br />
&#8211; Pontos de Abastecimento de Água (Saneamento)<br />
&#8211; Zonas de Proteção de Mananciais (Meio Ambiente)</p>
<p>A IA traduziu a intenção da pergunta em uma consulta REST real, executou a requisição e retornou os resultados de forma legível.</p>
<p>Além de listar as camadas, a <strong>IA pode analisar e descrever</strong> o que foi encontrado.</p>
<pre>
descricoes = "\n".join([f"{l['title']}: {l['abstract']}" for l in data])

prompt_explica = f"""
Gere um resumo amigável das camadas retornadas abaixo, destacando a utilidade
de cada uma para análises de planejamento urbano.
{descricoes}
"""

resumo = openai.ChatCompletion.create(
    model=MODEL,
    messages=[{"role": "user", "content": prompt_explica}]
)

print("\n Resumo gerado pela IA:\n")
print(resumo.choices[0].message.content)
</pre>
<p>No caso desse script, você teria a seguinte resposta:</p>
<p>“As camadas de saneamento abrangem sistemas de abastecimento, coleta e proteção de mananciais.<br />
Juntas, permitem identificar áreas com déficit de infraestrutura hídrica e orientar o planejamento urbano.”</p>
<p><strong>3. Aplicações práticas</strong></p>
<p>Você pode evoluir os scripts acima para um chatbot completo. Para isso basta encapsular essa lógica em uma API Flask ou interface Web que permita conversas em tempo real:</p>
<ul>
<li>O usuário digita perguntas em texto (“Quais camadas são de meio ambiente?”);</li>
<li>A IA gera a consulta e executa no GeoNode;</li>
<li>A resposta é retornada em formato legível ou como mapa interativo embutido (via WMS).</li>
</ul>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Dica: usando o endpoint layer[&#8220;ows&#8221;], é possível gerar um link direto de visualização do WMS retornado.</p>
<p>Além disso você pode aplicar esse conceito do ChatBot para transformar seu GeoNode através de:</p>
<ul>
<li>Atendimento automático em portais WebGIS corporativos;</li>
<li>Busca semântica de dados espaciais por tema ou localização;</li>
<li>Consultas técnicas acessíveis a gestores não especialistas;</li>
<li>Assistentes geoespaciais integrados com Telegram, WhatsApp ou ChatGPT API.</li>
</ul>
<p><strong>4. Conclusão</strong></p>
<p>O GeoNode deixa de ser apenas um catálogo de dados geoespaciais e se transforma em um sistema de informação conversacional, onde qualquer pessoa pode obter respostas ou gerar mapas a partir de simples perguntas.</p>
<p>Integrar IA + GeoNode é o primeiro passo para construir portais WebGIS realmente inteligentes, acessíveis e colaborativos.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.fernandoquadro.com.br/html/2025/10/15/geonode-ia-chatbot-para-consulta-de-dados-espaciais/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Compilar o GDAL com MrSID no SuSe Linux</title>
		<link>https://www.fernandoquadro.com.br/html/2025/10/14/compilar-o-gdal-com-mrsid-no-suse-linux/</link>
					<comments>https://www.fernandoquadro.com.br/html/2025/10/14/compilar-o-gdal-com-mrsid-no-suse-linux/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Quadro]]></dc:creator>
		<pubDate>Tue, 14 Oct 2025 16:10:28 +0000</pubDate>
				<category><![CDATA[GIS]]></category>
		<category><![CDATA[GDAL]]></category>
		<category><![CDATA[GeoServer]]></category>
		<guid isPermaLink="false">https://www.fernandoquadro.com.br/html/?p=10047</guid>

					<description><![CDATA[Prezados leitores, Nesses últimos dias precisei instalar o GDAL e o MrSID em uma máquina que rodava o SuSe Linux Enterprise Server 15 SP6 (SLES). Como a biblioteca libgdaljava não estava disponível eu precisei compilar tudo na mão. Acabei passando... <a class="more-link" href="https://www.fernandoquadro.com.br/html/2025/10/14/compilar-o-gdal-com-mrsid-no-suse-linux/">Continue Reading &#8594;</a>]]></description>
										<content:encoded><![CDATA[<p>Prezados leitores,</p>
<p>Nesses últimos dias precisei instalar o GDAL e o MrSID em uma máquina que rodava o SuSe Linux Enterprise Server 15 SP6 (SLES). Como a biblioteca libgdaljava não estava disponível eu precisei compilar tudo na mão. Acabei passando por alguns perrengues, mas no final consegui compilar e habilitar tudo no GeoServer. Vou compartilhar o passo a passo, caso alguém esteja passando pelo mesmo problema:</p>
<p><strong>1. Instalar SDK do MrSID</strong></p>
<p>Para compilar o MrSID é necessário baixar o seu SDK no site da Extensis. A versão utilizada nesse tutorial foi: MrSID DSDK 9.5.5.5244 &#8211; rhel9.x86-64.gcc1131</p>
<pre>
> wget https://bin.extensis.com/download/developer/MrSID_DSDK-9.5.5.5244-rhel9.x86-64.gcc1131.zip
</pre>
<p>Agora vamos extrair e mover o SDK para a pasta /opt:</p>
<pre>
> sudo unzip MrSID_DSDK-9.5.5.5244-rhel9.x86-64.gcc1131.zip -d /opt/MrSID/
> cd /opt/MrSID
> sudo chown root:root -R MrSID/
> sudo ln -sfn /opt/MrSID/MrSID_DSDK-9.5.5.5244-rhel9.x86-64.gcc1131 /opt/MrSID/current
> sudo ldconfig
</pre>
<p><strong>2. Instalação do GDAL</strong></p>
<p>O primeiro passa foi atualizar e habilitar os repositórios adicionais no SLES:</p>
<pre>
> sudo SUSEConnect --product sle-module-development-tools/15.6/x86_64
> sudo zypper refresh
</pre>
<p>Depois foi necessário instalar as dependências básicas para compilação:</p>
<pre>
> sudo zypper install gcc gcc-c++ gcc13 gcc13-c++ make cmake ninja \
  libtool automake autoconf git curl wget unzip bison flex swig
> sudo zypper install unzip zip tar which htop net-tools iproute2 ant
</pre>
<p>E também as dependências de bibliotecas geoespaciais:</p>
<pre>
> sudo zypper install proj proj-devel geos geos-devel sqlite3 sqlite3-devel \
  libtiff-devel libjpeg8-devel libpng16-devel libcurl-devel
</pre>
<p>E por último para evitar erros na hora de rodar o make install, instalei o Python + Numpy:</p>
<pre>
> sudo zypper install python311 python311-devel python311-numpy python311-pip
> python3.11 -m pip install --user --upgrade pip
> python3.11 -m pip install --user "numpy==1.26.4"
</pre>
<p>Agora vamos baixar e preparar o GDAL para a compilação. No nosso exemplo estamos usando o GDAL 3.10.1:</p>
<pre>
> wget https://download.osgeo.org/gdal/3.10.1/gdal-3.10.1.tar.gz
> tar -xvzf gdal-3.10.1.tar.gz
> cd gdal-3.10.1
> mkdir build && cd build
</pre>
<p>E necessário também apontar o compilador para o gcc13/g++13 no ambiente de build</p>
<pre>
> export CC=/usr/bin/gcc-13
> export CXX=/usr/bin/g++-13
> SWIG_BIN=$(command -v swig || command -v swig4)
> NUMPY_INC=$(python3.11 -c 'import numpy; print(numpy.get_include())')
> JAVA_HOME=$(dirname "$(dirname "$(readlink -f "$(which javac)")")")
</pre>
<p>Chegou a hora, vamos compilar o GDAL com suporte ao MrSID e JPEG2k usando o CMake e o Ninja, veja:</p>
<pre>
> cmake -G "Ninja" .. \
  -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_INSTALL_PREFIX=/usr/local \
  -DCMAKE_INSTALL_LIBDIR=lib \
  -DBUILD_SHARED_LIBS=ON \
  -DGDAL_ENABLE_PLUGINS=ON \
  -DBUILD_PYTHON_BINDINGS=ON \
  -DBUILD_JAVA_BINDINGS=ON \           
  -DGDAL_USE_GEOTIFF_INTERNAL=ON \
  -DGDAL_HIDE_INTERNAL_SYMBOLS=OFF \
  -DGDAL_ENABLE_DRIVER_MRSID_PLUGIN=ON \
  -DGDAL_ENABLE_DRIVER_MRSID=ON \
  -DGDAL_ENABLE_DRIVER_JP2MRSID=ON \
  -DCMAKE_INSTALL_RPATH="/usr/local/lib:/usr/local/lib64:/usr/local/lib/jni" \
  -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \
  -DMRSID_LIBRARY=/opt/MrSID/current/Raster_DSDK/lib/libltidsdk.so \
  -DMRSID_INCLUDE_DIR=/opt/MrSID/current/Raster_DSDK/include \
  -DPython3_EXECUTABLE=/usr/bin/python3.11 \
  -DPython3_NumPy_INCLUDE_DIRS="${NUMPY_INC}" \
  -DSWIG_EXECUTABLE="${SWIG_BIN}" \
  -DJAVA_HOME="${JAVA_HOME}"

> ninja -j"$(nproc)"
> sudo ninja install
</pre>
<p>Verifique se a biblioteca <strong>libgdalalljni.so</strong> foi criada:</p>
<pre>
> ldd /usr/local/lib/jni/libgdalalljni.so | grep gdal
</pre>
<p>Caso a lib não tenha sido criado, você precisa criá-la, pois ela é essencial para a integração com o GeoServer, então você pode criar da seguinte maneira:</p>
<pre>
> ninja gdalalljni
> sudo ldconfig
</pre>
<p>Vamos atualiza o cache das bibliotecas:</p>
<pre>
> echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/gdal.conf
> echo "/usr/local/lib/jni" | sudo tee /etc/ld.so.conf.d/gdal-jni.conf
> echo "/opt/MrSID/current/Raster_DSDK/lib" | sudo tee /etc/ld.so.conf.d/mrsid.conf
> sudo ldconfig
</pre>
<p>Agora vamos verificar se está tudo correto, pra isso execute os comandos abaixo:</p>
<pre>
> gdalinfo --version
> gdalinfo --formats | grep -Ei 'mrsid|jp2mrsid'
> ldd /usr/local/lib/jni/libgdalalljni.so | grep gdal
</pre>
<p>Após executar os passos acima, as saídas abaixo indicam que todo o processo correu bem.</p>
<pre>
  GDAL 3.10.1, released 2025/01/08
  MrSID -raster- (rov): Multi-resolution Seamless Image Database (MrSID) (*.sid)
  JP2MrSID -raster- (rov): MrSID JPEG2000 (*.jp2)
  libgdal.so.36 => /usr/local/lib/libgdal.so.36 (0x00007fdcbb400000)
</pre>
<p>Agora para fnalizar é só você habilitar no GeoServer, para isso basta adicionar as seguintes linhas no seu arquivo de inicialização do GeoServer:</p>
<pre>
-DGDAL_DATA=/usr/local/share/gdal
-Djava.library.path=/usr/local/lib:/usr/local/lib/jni:/opt/MrSID/current/Raster_DSDK/lib
</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://www.fernandoquadro.com.br/html/2025/10/14/compilar-o-gdal-com-mrsid-no-suse-linux/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>GeoServer + IA: geração automática de camadas de heatmap</title>
		<link>https://www.fernandoquadro.com.br/html/2025/10/14/geoserver-ia-geracao-automatica-de-camadas-de-heatmap/</link>
					<comments>https://www.fernandoquadro.com.br/html/2025/10/14/geoserver-ia-geracao-automatica-de-camadas-de-heatmap/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Quadro]]></dc:creator>
		<pubDate>Tue, 14 Oct 2025 12:00:42 +0000</pubDate>
				<category><![CDATA[GIS]]></category>
		<category><![CDATA[GeoServer]]></category>
		<category><![CDATA[IA]]></category>
		<guid isPermaLink="false">https://www.fernandoquadro.com.br/html/?p=10028</guid>

					<description><![CDATA[Os mapas de calor (heatmaps) são uma das formas mais intuitivas de visualizar densidade de ocorrências geográficas, seja para representar crimes, atendimentos de saúde, pontos de coleta de resíduos ou eventos climáticos. No GeoServer, podemos gerar mapas de calor usando... <a class="more-link" href="https://www.fernandoquadro.com.br/html/2025/10/14/geoserver-ia-geracao-automatica-de-camadas-de-heatmap/">Continue Reading &#8594;</a>]]></description>
										<content:encoded><![CDATA[<p>Os <strong>mapas de calor (heatmaps)</strong> são uma das formas mais intuitivas de<strong> visualizar densidade de ocorrências geográficas</strong>, seja para representar crimes, atendimentos de saúde, pontos de coleta de resíduos ou eventos climáticos.</p>
<p>No GeoServer, podemos gerar mapas de calor usando o WMS Heatmap Rendering Transform, mas configurar isso manualmente para dezenas de camadas pode ser trabalhoso.</p>
<p>Neste post, vamos mostrar como automatizar esse processo com Python + IA, criando um pipeline que:</p>
<ul>
<li>Analisa automaticamente seus dados espaciais;</li>
<li>Gera os parâmetros ideais do heatmap (raio, cores, intensidade);</li>
<li>Publica o estilo e a camada automaticamente no GeoServer;</li>
<li>Pode ser aplicado a qualquer dataset de pontos no PostGIS.</li>
</ul>
<p><strong>1. O conceito de heatmap no GeoServer</strong></p>
<p>O GeoServer suporta a geração de heatmaps a partir de camadas de pontos usando o processo de renderização “vec:Heatmap” dentro de um estilo SLD.</p>
<p>Exemplo básico de configuração manual:</p>
<pre>&lt;RasterSymbolizer&gt;
  &lt;Geometry&gt;
    &lt;ogc:PropertyName&gt;geom&lt;/ogc:PropertyName&gt;
  &lt;/Geometry&gt;
  &lt;Opacity&gt;0.6&lt;/Opacity&gt;
  &lt;ColorMap type=&quot;ramp&quot; extended=&quot;true&quot;&gt;
    &lt;ColorMapEntry color=&quot;#0000FF&quot; quantity=&quot;0&quot; opacity=&quot;0&quot;/&gt;
    &lt;ColorMapEntry color=&quot;#00FF00&quot; quantity=&quot;0.5&quot; opacity=&quot;0.7&quot;/&gt;
    &lt;ColorMapEntry color=&quot;#FF0000&quot; quantity=&quot;1&quot; opacity=&quot;1&quot;/&gt;
  &lt;/ColorMap&gt;
&lt;/RasterSymbolizer&gt;
</pre>
<p>O problema é que definir manualmente raio, opacidade e escala de cores exige tentativas e erros. É aí que você pode utilizar a IA para automatizar essa etapa.</p>
<p><strong>2. Onde entra a IA</strong></p>
<p>A IA pode atuar para:</p>
<ol>
<li>
      <strong>Analisar a densidade e distribuição dos pontos</strong><br />
      <span>(via amostra SQL do PostGIS);</span>
    </li>
<li>
      <strong>Sugerir automaticamente</strong>:</p>
<ul>
<li>Raio ideal para suavização do heatmap;</li>
<li>Paleta de cores coerente com o contexto <em>(ex.: segurança, saúde, meio ambiente)</em>;</li>
<li>Limites de intensidade <em>(quantidade mínima/máxima de ocorrências)</em>;</li>
</ul>
</li>
<li>
      <strong>Gerar o SLD completo</strong> com os parâmetros otimizados.
    </li>
</ol>
<p><strong>3. PostGIS + Python + IA + GeoServer</strong></p>
<p>A seguir, um exemplo completo de automação, do banco ao GeoServer que:</p>
<ul>
<li>Conecta-se ao banco PostGIS e coleta estatísticas da camada (contagem e extensão).</li>
<li>Envia essas informações à IA, que gera um SLD completo com o transform “vec:Heatmap”.</li>
<li>Publica automaticamente o estilo no GeoServer via REST API.</li>
<li>O resultado pode ser aplicado imediatamente na camada eventos_ocorrencias.</li>
</ul>
<pre>
import psycopg2
import openai
import requests

# Configurações
DB_NAME = "gisdb"
DB_USER = "gis"
DB_PASS = "123"
DB_HOST = "localhost"

GEOSERVER_URL = "http://localhost:8080/geoserver/rest/styles"
GEOSERVER_USER = "admin"
GEOSERVER_PASS = "geoserver"

LAYER_NAME = "eventos_ocorrencias"
STYLE_NAME = "heatmap_eventos"

# 1. Amostrar dados para análise
conn = psycopg2.connect(f"dbname={DB_NAME} user={DB_USER} password={DB_PASS} host={DB_HOST}")
cur = conn.cursor()
cur.execute(f"SELECT COUNT(*), ST_Extent(geom) FROM {LAYER_NAME};")
total, bbox = cur.fetchone()

# 2. Gerar estilo Heatmap com IA
prompt = f"""
Crie um estilo SLD para gerar um heatmap no GeoServer.
Use o transform 'vec:Heatmap' com parâmetros otimizados.
Contexto:
- Camada: {LAYER_NAME}
- Total de pontos: {total}
- Extensão espacial: {bbox}
- O mapa representa ocorrências de eventos.
A paleta de cores deve ir de azul (baixa densidade) a vermelho (alta densidade).
"""

resposta = openai.ChatCompletion.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": prompt}]
)

sld_xml = resposta.choices[0].message.content

# 3. Publicar estilo no GeoServer
headers = {"Content-type": "application/vnd.ogc.sld+xml"}
r = requests.post(
    f"{GEOSERVER_URL}?name={STYLE_NAME}",
    data=sld_xml.encode("utf-8"),
    headers=headers,
    auth=(GEOSERVER_USER, GEOSERVER_PASS)
)

if r.status_code in [200, 201]:
    print(f"Estilo '{STYLE_NAME}' publicado com sucesso!")
else:
    print("Erro ao publicar estilo:", r.status_code, r.text)

</pre>
<p>A saída gerada pelo script será:</p>
<pre>&lt;StyledLayerDescriptor version=&quot;1.0.0&quot;&gt;
  &lt;NamedLayer&gt;
    &lt;Name&gt;eventos_ocorrencias&lt;/Name&gt;
    &lt;UserStyle&gt;
      &lt;Title&gt;Heatmap de Ocorrências&lt;/Title&gt;
      &lt;FeatureTypeStyle&gt;
        &lt;Transformation&gt;
          &lt;ogc:Function name=&quot;vec:Heatmap&quot;&gt;
            &lt;ogc:Function name=&quot;parameter&quot;&gt;
              &lt;ogc:Literal&gt;weightAttr&lt;/ogc:Literal&gt;
              &lt;ogc:Literal&gt;&lt;/ogc:Literal&gt;
            &lt;/ogc:Function&gt;
            &lt;ogc:Function name=&quot;parameter&quot;&gt;
              &lt;ogc:Literal&gt;radiusPixels&lt;/ogc:Literal&gt;
              &lt;ogc:Literal&gt;20&lt;/ogc:Literal&gt;
            &lt;/ogc:Function&gt;
          &lt;/ogc:Function&gt;
        &lt;/Transformation&gt;
        &lt;Rule&gt;
          &lt;RasterSymbolizer&gt;
            &lt;Opacity&gt;0.7&lt;/Opacity&gt;
            &lt;ColorMap type=&quot;ramp&quot;&gt;
              &lt;ColorMapEntry color=&quot;#0000FF&quot; quantity=&quot;0&quot; opacity=&quot;0&quot;/&gt;
              &lt;ColorMapEntry color=&quot;#00FF00&quot; quantity=&quot;0.5&quot; opacity=&quot;0.7&quot;/&gt;
              &lt;ColorMapEntry color=&quot;#FF0000&quot; quantity=&quot;1&quot; opacity=&quot;1&quot;/&gt;
            &lt;/ColorMap&gt;
          &lt;/RasterSymbolizer&gt;
        &lt;/Rule&gt;
      &lt;/FeatureTypeStyle&gt;
    &lt;/UserStyle&gt;
  &lt;/NamedLayer&gt;
&lt;/StyledLayerDescriptor&gt;
</pre>
<p>A IA gera não só as cores, mas também parâmetros adaptados ao tamanho da amostra (por exemplo, ajustando o raio se a camada tiver muitos ou poucos pontos).</p>
<p>Você pode evoluir esse fluxo para:</p>
<ul>
<li>Rodar diariamente e gerar heatmaps atualizados com novos dados;</li>
<li>Integrar ao GeoNode, atualizando automaticamente o estilo da camada;</li>
<li>Usar IA para escolher paletas temáticas (ex.: “vermelho–amarelo” para calor humano, “verde–azul” para vegetação).</li>
</ul>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Dica: para heatmaps temporais, combine com filtros SQL por data e gere um estilo dinâmico para cada período (ex.: “ocorrências_2025_01.sld”).</p>
<p><strong>4. Conclusão</strong></p>
<p>A combinação de PostGIS + IA + GeoServer permite criar pipelines geoespaciais realmente inteligentes capazes de analisar, gerar e publicar visualizações complexas de forma automática.</p>
<p>Esse tipo de automação é especialmente útil em projetos de monitoramento ambiental, urbano e operacional, onde o volume de dados cresce rapidamente. Veja alguns benefícios:</p>
<ul>
<li>Heatmaps automáticos e personalizados sem ajustes manuais.</li>
<li>IA adaptando parâmetros de renderização conforme o dataset.</li>
<li>Integração total com GeoServer via REST API.</li>
<li>Atualização contínua, ideal para dashboards geoespaciais em tempo real.</li>
</ul>
<p>Gostou desse post? Achou ele útil? Então que tal deixar um comentário ?</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.fernandoquadro.com.br/html/2025/10/14/geoserver-ia-geracao-automatica-de-camadas-de-heatmap/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>PostGIS + IA: Automatizando análises espaciais</title>
		<link>https://www.fernandoquadro.com.br/html/2025/10/13/postgis-ia-automatizando-analises-espaciais/</link>
					<comments>https://www.fernandoquadro.com.br/html/2025/10/13/postgis-ia-automatizando-analises-espaciais/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Quadro]]></dc:creator>
		<pubDate>Mon, 13 Oct 2025 12:00:11 +0000</pubDate>
				<category><![CDATA[GIS]]></category>
		<category><![CDATA[IA]]></category>
		<category><![CDATA[PostGIS]]></category>
		<guid isPermaLink="false">https://www.fernandoquadro.com.br/html/?p=10021</guid>

					<description><![CDATA[O PostGIS é, sem dúvida, o coração de qualquer infraestrutura WebGIS moderna. Ele transforma o PostgreSQL em um verdadeiro motor de análise espacial, capaz de executar desde consultas simples até operações complexas de geoprocessamento. Mas o que acontece quando combinamos... <a class="more-link" href="https://www.fernandoquadro.com.br/html/2025/10/13/postgis-ia-automatizando-analises-espaciais/">Continue Reading &#8594;</a>]]></description>
										<content:encoded><![CDATA[<p>O <strong>PostGIS</strong> é, sem dúvida, o coração de qualquer infraestrutura WebGIS moderna.<br />
Ele transforma o PostgreSQL em um verdadeiro motor de análise espacial, capaz de executar desde consultas simples até operações complexas de geoprocessamento.</p>
<p>Mas o que acontece quando combinamos o poder do PostGIS com a <strong>Inteligência Artificial (IA)</strong>? A resposta é simples e poderosa:<strong> análises espaciais automatizadas</strong>, executadas a partir de comandos em linguagem natural — sem precisar escrever SQL manualmente para cada consulta.</p>
<p>Imagine perguntar: “Quais bairros estão a menos de 500 metros dos rios?” ou “Quantos pontos de coleta existem por zona de drenagem?”</p>
<p>E o sistema traduzir isso automaticamente em SQL espacial, executar no PostGIS e retornar o resultado.</p>
<p>Neste post, você vai ver como isso é possível usando IA generativa + PostGIS, com exemplos práticos que podem ser aplicados em pipelines WebGIS reais.</p>
<p><strong>1. A base: Consultas espaciais no PostGIS</strong></p>
<p>O PostGIS fornece um conjunto extenso de funções espaciais, como:</p>
<ul>
<li><strong>ST_Within</strong>(geomA, geomB) → verifica se uma geometria está dentro de outra;</li>
<li><strong>ST_Distance</strong>(geomA, geomB) → mede a distância entre objetos;</li>
<li><strong>ST_Intersects</strong>(geomA, geomB) → identifica interseções;</li>
<li><strong>ST_Buffer</strong>(geom, raio) → cria zonas de influência;</li>
<li><strong>ST_Union</strong>(geom) → agrega polígonos em uma única geometria.</li>
</ul>
<p>Essas funções são poderosas, mas escrever consultas SQL complexas pode ser demorado, especialmente em análises exploratórias.</p>
<p><strong>2. Onde entra a IA</strong></p>
<p>A IA atua como uma camada de tradução inteligente: ela entende o que o usuário quer (em linguagem natural) e gera o SQL equivalente em PostGIS.</p>
<p>Assim, é possível automatizar:</p>
<ul>
<li>Consultas ad hoc (“quero saber quantos imóveis estão próximos de escolas”);</li>
<li>Relatórios recorrentes;</li>
<li>Geração de scripts de análise complexa (buffer + interseção + agregação);</li>
<li>Pipeline de integração com GeoServer e GeoNode.</li>
</ul>
<p><strong>3. IA + PostGIS + Python</strong></p>
<p>O fluxo completo é simples:</p>
<ul>
<li>O usuário faz uma pergunta em texto.</li>
<li>A IA interpreta e gera o SQL espacial.</li>
<li>O script executa o SQL no PostGIS e retorna o resultado.</li>
</ul>
<p>Veja como fica o script:</p>
<pre>
import psycopg2
import openai
import pandas as pd

# Configurações
DB = {"dbname": "gisdb", "user": "gis", "password": "123", "host": "localhost"}
MODEL = "gpt-4o-mini"

# Conectar ao PostGIS
conn = psycopg2.connect(**DB)
cur = conn.cursor()

# Entrada em linguagem natural
pergunta = "Liste os bairros que estão a menos de 500 metros dos rios."

# Prompt para IA gerar SQL
prompt = f"""
Você é um assistente especializado em PostGIS.
Com base na pergunta abaixo, gere uma consulta SQL válida para PostgreSQL/PostGIS.
As tabelas disponíveis são:
- bairros (id, nome, geom)
- rios (id, nome, geom)
Pergunta: {pergunta}
"""

resposta = openai.ChatCompletion.create(
    model=MODEL,
    messages=[{"role": "user", "content": prompt}]
)

sql = resposta.choices[0].message.content.strip()
print(" SQL gerado pela IA:\n", sql)

# Executar consulta no banco
cur.execute(sql)
rows = cur.fetchall()

# Exibir resultados
df = pd.DataFrame(rows, columns=["bairro"])
print("\n Bairros próximos dos rios:\n", df)

</pre>
<p>O resultado desse script será uma lista com os bairros próximos 500 metros dos rios. </p>
<p>A IA compreendeu a intenção e construiu o SQL espacial correto sem que o usuário precisasse saber SQL.</p>
<p><strong>4. Na prática</strong></p>
<p>Podemos transformar esse conceito em uma ferramenta real de automação:</p>
<ul>
<li>Um chatbot geoespacial conectado ao PostGIS, que responde perguntas e executa consultas automaticamente.</li>
<li>Um relatório inteligente, onde as queries são geradas dinamicamente.</li>
<li>Um backend WebGIS que recebe comandos em texto e alimenta camadas no GeoServer.</li>
</ul>
<p>Por Exemplo:</p>
<p>“Crie um buffer de 1000 metros ao redor das escolas e publique o resultado no GeoServer.”</p>
<p>A IA gera a tabela no banco (CREATE TABLE buffer_escolas AS SELECT ST_Buffer(geom, 1000)) e faz a chamada REST API do GeoServer para publicar a nova camada. Tudo em um único fluxo automatizado. </p>
<p>Você pode ir além e usar a IA para:</p>
<ul>
<li>Gerar relatórios automatizados em texto (HTML ou PDF) com gráficos e mapas;</li>
<li>Detectar análises espaciais recorrentes e agendá-las;</li>
<li>Explicar resultados de forma compreensível para gestores não técnicos.</li>
</ul>
<p>Exemplo de prompt para explicação:</p>
<p>“Explique o resultado da consulta SQL abaixo em linguagem simples e escreva um resumo técnico.”</p>
<p>A IA retorna algo como: “Foram identificados 12 bairros localizados a menos de 500 metros de rios. Essa análise é útil para estudos de vulnerabilidade a inundações e planejamento urbano.”</p>
<p><strong>5. Conclusão</strong></p>
<p>Combinar IA com PostGIS é um passo natural na evolução das análises geoespaciais. Com poucos ajustes, é possível transformar consultas em linguagem natural em SQLs complexos, prontas para execução abrindo caminho para dashboards e sistemas WebGIS inteligentes.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.fernandoquadro.com.br/html/2025/10/13/postgis-ia-automatizando-analises-espaciais/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>GeoNode + IA: enriquecimento automático de metadados</title>
		<link>https://www.fernandoquadro.com.br/html/2025/10/08/geonode-ia-enriquecimento-automatico-de-metadados/</link>
					<comments>https://www.fernandoquadro.com.br/html/2025/10/08/geonode-ia-enriquecimento-automatico-de-metadados/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Quadro]]></dc:creator>
		<pubDate>Wed, 08 Oct 2025 12:00:29 +0000</pubDate>
				<category><![CDATA[GIS]]></category>
		<category><![CDATA[GeoNode]]></category>
		<category><![CDATA[IA]]></category>
		<guid isPermaLink="false">https://www.fernandoquadro.com.br/html/?p=10008</guid>

					<description><![CDATA[O GeoNode é hoje uma das plataformas mais completas de catálogos e portais WebGIS de código aberto. Ele centraliza camadas, mapas, documentos e metadados em um ambiente colaborativo. Mas existe um ponto crítico em qualquer infraestrutura GeoNode: A qualidade e... <a class="more-link" href="https://www.fernandoquadro.com.br/html/2025/10/08/geonode-ia-enriquecimento-automatico-de-metadados/">Continue Reading &#8594;</a>]]></description>
										<content:encoded><![CDATA[<p>O GeoNode é hoje uma das <strong>plataformas mais completas</strong> de catálogos e portais WebGIS de código aberto. Ele centraliza camadas, mapas, documentos e metadados em um ambiente colaborativo.</p>
<p>Mas existe um ponto crítico em qualquer infraestrutura GeoNode:<strong> A qualidade e a completude dos metadados</strong>.</p>
<p>Sem bons metadados, o portal perde valor: os dados se tornam difíceis de localizar, interpretar e reutilizar. E o problema é bem conhecido, quem nunca publicou uma camada com descrição genérica tipo “dados de teste” ou “importado do PostGIS”?</p>
<p>A boa notícia é que, com o apoio da Inteligência Artificial (IA), é possível automatizar grande parte do processo de enriquecimento de metadados, tornando o GeoNode mais inteligente e autodescritivo.</p>
<p><strong>1. O desafio dos metadados no GeoNode</strong></p>
<p>Ao publicar uma camada, o GeoNode gera automaticamente informações básicas como nome, resumo, bounding box, SRC. Mas não consegue:</p>
<ul>
<li>Criar descrições detalhadas do conteúdo;</li>
<li>Gerar palavras-chave contextuais;</li>
<li>Escrever resumos técnicos e analíticos;</li>
<li>Padronizar a linguagem entre diferentes camadas.</li>
</ul>
<p>Isso deixa o catálogo inconsistente, especialmente quando diferentes analistas publicam dados com estilos e linguagens diferentes.</p>
<p>É exatamente esse tipo de trabalho repetitivo e semântico que uma IA generativa pode resolver com perfeição.</p>
<p><strong>2. Como a IA pode ajudar:</strong></p>
<p>Com um modelo de linguagem (LLM) como o GPT, podemos:</p>
<ol>
<li>
    <strong>Analisar o nome da camada, atributos e amostras de dados;</strong>
  </li>
<li>
    <strong>Gerar automaticamente:</strong></p>
<ul>
<li>Descrição detalhada (“O que essa camada representa e por que é importante”);</li>
<li>Palavras-chave (keywords) baseadas no conteúdo;</li>
<li>Sugestões de categoria temática (ex.: “meio ambiente”, “infraestrutura”, “demografia”);</li>
<li>Texto de resumo padronizado.</li>
</ul>
</li>
<li>
    <strong>Enviar esses metadados diretamente para o GeoNode via API.</strong>
  </li>
</ol>
<p><strong>3. GeoNode + IA + Python</strong></p>
<p>Vamos montar um pipeline automatizado que:</p>
<ul>
<li>Consulta os metadados existentes via API do GeoNode;</li>
<li>Gera descrições e palavras-chave com IA;</li>
<li>Atualiza o registro da camada no catálogo.</li>
</ul>
<p>Veja como ficaria esse script:</p>
<pre>
import requests
import openai

# Configurações do GeoNode (GeoNode 4.x usa /api/v2/datasets/)
GEONODE_URL = "http://localhost:8000/api/v2/datasets/"
GEONODE_USER = "admin"
GEONODE_PASS = "geonode"

# Configuração da IA
MODEL = "gpt-4o-mini"
# coloque sua chave de API do OpenAI em OPENAI_API_KEY antes de rodar
openai.api_key = "YOUR_OPENAI_API_KEY"

# 1. Obter lista de camadas (datasets)
r = requests.get(GEONODE_URL, auth=(GEONODE_USER, GEONODE_PASS), headers={"Accept":"application/json"})
r.raise_for_status()
layers = r.json().get("results", [])

for layer in layers:
    title = layer.get("title")
    # GeoNode pode usar 'abstract' ou 'description' dependendo da configuração; pegamos ambos
    abstract = layer.get("abstract", "") or layer.get("description", "")
    keywords = layer.get("keywords", []) or []

    # 2. Gerar enriquecimento com IA
    prompt = f"""
    Analise o título e o resumo abaixo e gere:
    1. Uma descrição aprimorada do dado (3 a 4 linhas);
    2. 5 palavras-chave relevantes;
    3. Categoria temática sugerida.
    ---
    Título: {title}
    Resumo atual: {abstract}
    Palavras-chave atuais: {keywords}
    """

    resposta = openai.ChatCompletion.create(
        model=MODEL,
        messages=[{"role": "user", "content": prompt}]
    )

    enriquecido = resposta.choices[0].message.content
    print(f"\nCamada: {title}\n{enriquecido}\n")

    # 3. Atualizar camada no GeoNode (opcional)
    # Atualiza o campo 'abstract' (GeoNode 4.x aceita PATCH /api/v2/datasets/{id}/)
    payload = {"abstract": enriquecido}
    update = requests.patch(
        f"{GEONODE_URL}{layer['id']}/",
        json=payload,
        auth=(GEONODE_USER, GEONODE_PASS),
        headers={"Content-Type": "application/json", "Accept": "application/json"}
    )

    if update.status_code in [200, 202]:
        print("Metadados atualizados com sucesso.")
    else:
        print("Erro ao atualizar:", update.status_code, update.text)

</pre>
<p>Em resumo: </p>
<ul>
<li>O script percorre todas as camadas publicadas.</li>
<li>Para cada uma, envia o título e resumo atual à IA.</li>
<li>A IA retorna um texto padronizado e enriquecido, junto com keywords.</li>
<li>O script atualiza a camada via API REST do GeoNode.</li>
</ul>
<p>O resultado é um catálogo muito mais coerente, padronizado e informativo sem depender de preenchimento manual.</p>
<p><strong>4. Exemplo prático</strong></p>
<p>Camada original:</p>
<ul>
<li><strong>Título:</strong> “Limite municipal SC”</li>
<li><strong>Resumo:</strong> “Limites administrativos.”</li>
</ul>
<p>Após enriquecimento com IA:</p>
<p><strong>Descrição aprimorada:</strong><br />
  Esta camada representa os limites municipais oficiais do estado de Santa Catarina, derivados de bases cartográficas oficiais. Pode ser utilizada para análises de planejamento territorial, gestão pública e integração de dados geoespaciais de infraestrutura.</p>
<p><strong>Palavras-chave sugeridas:</strong><br />
  limites, municípios, cartografia oficial, Santa Catarina, administração pública</p>
<p><strong>Categoria:</strong> Governança / Administração Pública</p>
<p>Em segundos, o dado fica <strong>muito mais informativo.</strong></p>
<p>Podemos ir além: se as camadas do GeoNode vêm do PostGIS, o script pode extrair informações diretas do banco:</p>
<ul>
<li>Nomes e tipos de campos (geometry, text, numeric);</li>
<li>Contagem de registros;</li>
<li>Amostra de valores (ex.: primeiros 10 nomes de municípios);</li>
</ul>
<p>Esses dados podem ser enviados à IA para gerar descrições ainda mais precisas, contextualizadas com base no conteúdo real da tabela.</p>
<p><strong>5. Conclusão</strong></p>
<p>Integrar IA ao GeoNode transforma o portal em uma plataforma muito mais inteligente, descritiva e autônoma. Você passa a ter metadados consistentes, atrativos e úteis para quem consome os dados sem depender de preenchimento manual.</p>
<p>Além disso pode ter os seguintes benefícios práticos:</p>
<ul>
<li>Automação completa do enriquecimento de metadados.</li>
<li>Padronização linguística e semântica entre camadas.</li>
<li>Melhor desempenho de busca dentro do GeoNode.</li>
<li>Economia de tempo na curadoria de dados.</li>
<li>Catálogo inteligente, com IA atuando como “editor automático” de conteúdo.</li>
</ul>
<p>Gostou desse post? Deixe um comentário dando sua opinião.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.fernandoquadro.com.br/html/2025/10/08/geonode-ia-enriquecimento-automatico-de-metadados/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>GeoServer + IA: otimização de estilos SLD com algoritmos generativos</title>
		<link>https://www.fernandoquadro.com.br/html/2025/10/07/geoserver-ia-otimizacao-de-estilos-sld-com-algoritmos-generativos/</link>
					<comments>https://www.fernandoquadro.com.br/html/2025/10/07/geoserver-ia-otimizacao-de-estilos-sld-com-algoritmos-generativos/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Quadro]]></dc:creator>
		<pubDate>Tue, 07 Oct 2025 12:00:02 +0000</pubDate>
				<category><![CDATA[GIS]]></category>
		<category><![CDATA[GeoServer]]></category>
		<category><![CDATA[IA]]></category>
		<guid isPermaLink="false">https://www.fernandoquadro.com.br/html/?p=10004</guid>

					<description><![CDATA[Prezados leitores, Quem trabalha com GeoServer sabe que definir estilos SLD (Styled Layer Descriptor) é uma das tarefas mais importantes e, ao mesmo tempo, pode ser bastante trabalhosa. Um estilo mal configurado pode deixar o mapa confuso, pesado ou até... <a class="more-link" href="https://www.fernandoquadro.com.br/html/2025/10/07/geoserver-ia-otimizacao-de-estilos-sld-com-algoritmos-generativos/">Continue Reading &#8594;</a>]]></description>
										<content:encoded><![CDATA[<p>Prezados leitores,</p>
<p>Quem trabalha com GeoServer sabe que definir estilos SLD (Styled Layer Descriptor) é uma das tarefas mais importantes e, ao mesmo tempo, pode ser bastante trabalhosa.</p>
<p>Um estilo mal configurado pode deixar o mapa confuso, pesado ou até inutilizável.</p>
<p>Já um estilo bem planejado torna os dados claros, comunicativos e eficientes.</p>
<p>O problema:<br />
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Criar estilos manualmente exige tempo, conhecimento de XML e testes repetitivos.<br />
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Definir cores adequadas para diferentes atributos (população, uso do solo, altimetria) é sempre um desafio.</p>
<p>É nesse ponto que a Inteligência Artificial (IA) pode transformar o jogo. Combinando o GeoServer REST API com modelos generativos (IA), é possível:</p>
<ul>
<li>Gerar paletas de cores automáticas e consistentes.</li>
<li>Criar estilos dinâmicos adaptados ao tipo de dado.</li>
<li>Automatizar a publicação de SLDs, economizando tempo e reduzindo erros.</li>
</ul>
<p><strong>2. Onde entra a IA</strong></p>
<p>A IA pode atuar em diferentes etapas:</p>
<ul>
<li><strong>Geração de paletas de cores automáticas</strong> → sugerindo cores distintas, legíveis e com contraste.</li>
<li><strong>Sugestão de simbologia</strong> → identificar o tipo de dado (ponto, linha, polígono) e propor estilos adequados.</li>
<li>Automação de SLD → gerar automaticamente o XML completo a partir de metadados da camada.</li>
<li><strong>Explicação/documentação</strong> → IA pode comentar o estilo gerado, explicando a lógica.</li>
</ul>
<p><strong>3. Na prática: GeoServer + Python + IA</strong></p>
<p>Para ajudar na criação de estilos automatizados, o nosso script vai buscar as classes distintas no banco para que a IA possa gerar automaticamente um SLD completo e válido, e na sequencia esse SLD ser publicado no GeoServer via API Rest, ou seja, tudo automatizado com zero edição manual no XML.</p>
<pre>
import psycopg2
import openai
import requests

# Configurações
DB_NAME = "gisdb"
DB_USER = "gis"
DB_PASS = "123"
DB_HOST = "localhost"

GEOSERVER_URL = "http://localhost:8080/geoserver/rest/styles"
GEOSERVER_USER = "admin"
GEOSERVER_PASS = "geoserver"

LAYER_NAME = "camada_uso_solo"
FIELD_NAME = "uso_solo"
STYLE_NAME = "uso_solo_auto"

# 1. Coletar classes distintas no PostGIS
conn = psycopg2.connect(f"dbname={DB_NAME} user={DB_USER} password={DB_PASS} host={DB_HOST}")
cur = conn.cursor()
cur.execute(f"SELECT DISTINCT {FIELD_NAME} FROM {LAYER_NAME};")
classes = [row[0] for row in cur.fetchall()]

# 2. Pedir à IA paleta + SLD
prompt = f"""
Gere um SLD válido (XML) para a camada {LAYER_NAME},
usando o atributo {FIELD_NAME} como regra de simbologia.
Classes encontradas: {classes}.
Use uma paleta de cores HEX contrastante, acessível e semântica:
- água = azul
- floresta = verde
- urbano = cinza/vermelho
- solo exposto = laranja
- agrícola = amarelo
"""

resposta = openai.ChatCompletion.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": prompt}]
)

sld_xml = resposta.choices[0].message.content

# 3. Publicar estilo no GeoServer
headers = {"Content-type": "application/vnd.ogc.sld+xml"}
r = requests.post(
    f"{GEOSERVER_URL}?name={STYLE_NAME}",
    data=sld_xml.encode("utf-8"),
    headers=headers,
    auth=(GEOSERVER_USER, GEOSERVER_PASS)
)

if r.status_code in [200, 201]:
    print(f"Estilo '{STYLE_NAME}' publicado com sucesso!")
else:
    print("Erro ao publicar estilo:", r.status_code, r.text)
</pre>
<p>Esse processo pode ser facilmente acoplado a um pipeline de publicação de dados:</p>
<ul>
<li>Cada vez que uma nova camada for publicada → o script roda.</li>
<li>Ele gera e publica o estilo de forma automática.</li>
<li>Você garante consistência visual em todo o projeto WebGIS.</li>
</ul>
<p><strong>4.  Benefícios práticos</strong></p>
<ul>
<li>Simbologia automática e inteligente.</li>
<li>Redução drástica no tempo gasto criando estilos.</li>
<li>Padronização visual em múltiplas camadas.</li>
<li>IA atuando como assistente cartográfico.</li>
</ul>
<p><strong>5. Conclusão</strong></p>
<p>Com esse pipeline, você transforma o trabalho de estilização no GeoServer em um processo rápido, automatizado e padronizado, deixando para a IA a parte mais repetitiva e demorada.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.fernandoquadro.com.br/html/2025/10/07/geoserver-ia-otimizacao-de-estilos-sld-com-algoritmos-generativos/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>PostGIS + IA: detecção automática de anomalias em dados espaciais</title>
		<link>https://www.fernandoquadro.com.br/html/2025/10/06/postgis-ia-deteccao-automatica-de-anomalias-em-dados-espaciais/</link>
					<comments>https://www.fernandoquadro.com.br/html/2025/10/06/postgis-ia-deteccao-automatica-de-anomalias-em-dados-espaciais/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Quadro]]></dc:creator>
		<pubDate>Mon, 06 Oct 2025 12:00:31 +0000</pubDate>
				<category><![CDATA[GIS]]></category>
		<category><![CDATA[IA]]></category>
		<category><![CDATA[PostGIS]]></category>
		<guid isPermaLink="false">https://www.fernandoquadro.com.br/html/?p=9986</guid>

					<description><![CDATA[Prezados leitores, Quem trabalha com bancos de dados geoespaciais sabe que garantir a qualidade dos dados é um dos maiores desafios. Camadas com geometrias duplicadas, sobreposições ilegais, gaps inesperados ou atributos fora do padrão podem comprometer análises, visualizações e publicações... <a class="more-link" href="https://www.fernandoquadro.com.br/html/2025/10/06/postgis-ia-deteccao-automatica-de-anomalias-em-dados-espaciais/">Continue Reading &#8594;</a>]]></description>
										<content:encoded><![CDATA[<p>Prezados leitores,</p>
<p>Quem trabalha com bancos de dados geoespaciais sabe que garantir a qualidade dos dados é um dos maiores desafios. Camadas com geometrias duplicadas, sobreposições ilegais, gaps inesperados ou atributos fora do padrão podem comprometer análises, visualizações e publicações WebGIS.</p>
<p>É aí que entra a combinação de PostGIS + Inteligência Artificial (IA). O PostGIS já oferece funções poderosas para validação e topologia, mas com a ajuda da IA podemos automatizar diagnósticos, detectar padrões e até sugerir correções.</p>
<p>Neste post, você vai aprender como montar um pipeline para:</p>
<ul>
<li>Detectar inconsistências geométricas com SQL espacial.</li>
<li>Usar IA para classificar/explicar os erros.</li>
<li>Automatizar relatórios e alertas em tempo real.</li>
</ul>
<p><strong>1. Validação com PostGIS</strong></p>
<p>O PostGIS traz funções fundamentais para validar geometrias:</p>
<ul>
<li>ST_IsValid(geom) → checa se a geometria é válida.</li>
<li>ST_IsSimple(geom) → detecta autointersecções.</li>
<li>ST_DumpPoints(geom) → útil para analisar vértices.</li>
<li>ST_Overlaps, ST_Intersects, ST_Within → testam relações espaciais.</li>
</ul>
<p>Exemplo: detectando geometrias inválidas</p>
<pre>
SELECT id, ST_IsValidReason(geom) AS motivo
FROM camadas
WHERE NOT ST_IsValid(geom);
</pre>
<p>Aqui já temos um diagnóstico básico, mas a saída costuma ser técnica (ex.: Self-intersection at or near point).</p>
<p><strong>2. Onde entra a IA</strong></p>
<p>A IA pode atuar em três níveis:</p>
<ul>
<li><strong>Interpretação</strong> → traduzir mensagens técnicas (ST_IsValidReason) para linguagem clara para o usuário. Ex.: &#8220;Self-intersection&#8221; → &#8220;A geometria tem um polígono que se cruza consigo mesmo, possivelmente um erro de digitalização&#8221;.</li>
<li><strong>Classificação de anomalias</strong> → identificar o tipo mais comum de erro em um dataset (gaps, duplicatas, sobreposição, atributos ausentes).</li>
<li><strong>Sugestão de correções</strong> → propor SQL ou operações geoespaciais para corrigir automaticamente (ex.: ST_Buffer(geom,0) para auto-correção simples de polígonos).</li>
</ul>
<p><strong>3. Na prática: PostGIS + Python + IA</strong></p>
<p>Suponha que você tem uma tabela bairros de Floripa no PostGIS e quer validar as geometrias. Veja abaixo a consulta:</p>
<pre>
SELECT id, nome, ST_IsValid(geom) AS valido,
       ST_IsValidReason(geom) AS motivo
FROM bairros_floripa
WHERE NOT ST_IsValid(geom);
</pre>
<p>O Resultado seria:</p>
<p><img loading="lazy" decoding="async" src="https://www.fernandoquadro.com.br/html/wp-content/uploads/2025/10/tabela_resultado_bairros_floripa_600.png" alt="" width="600" height="150" class="aligncenter size-full wp-image-9999" srcset="https://www.fernandoquadro.com.br/html/wp-content/uploads/2025/10/tabela_resultado_bairros_floripa_600.png 600w, https://www.fernandoquadro.com.br/html/wp-content/uploads/2025/10/tabela_resultado_bairros_floripa_600-300x75.png 300w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>Agora vamos criar um script Python que vai utilizar a IA para automatizar a melhorar esse processo com uma mensagem mais clara para o usuário:</p>
<pre>
import psycopg2
import openai  # ou outro modelo LLM

# Conexão PostGIS
conn = psycopg2.connect("dbname=gisdb user=gis password=123 host=localhost")
cur = conn.cursor()
cur.execute("""
    SELECT id, nome, ST_IsValidReason(geom) 
    FROM bairros_floripa WHERE NOT ST_IsValid(geom)
""")

erros = cur.fetchall()

for e in erros:
    id_, nome, motivo = e
    prompt = f"""
    Explique de forma simples o erro em uma geometria espacial:
    Erro detectado: {motivo}
    Contexto: Bairro {nome} (ID {id_}).
    """
    explicacao = openai.ChatCompletion.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": prompt}]
    )
    print(f"{nome}: {explicacao.choices[0].message.content}")
</pre>
<p>O resultado esperado do script acima é o seguinte:</p>
<p>“Bairro Centro: A geometria está com uma autointersecção. Isso acontece quando o polígono se cruza, criando áreas inválidas. Sugestão: aplique ST_Buffer(geom,0) para corrigir.”</p>
<div style="border-left: 4px solid #f39c12; padding: 10px; background-color: #fff3e0; margin: 10px 0;">
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Importante: essa técnica (do Buffer) resolve muitos casos, mas não todos. Em situações mais complexas, é melhor passar por revisão manual.
</div>
<p><strong>4. Automação contínua</strong></p>
<p>Podemos transformar isso em um pipeline automatizado:</p>
<ul>
<li><strong>Trigger no PostGIS</strong> → cada vez que um dado for inserido/atualizado, roda ST_IsValid.</li>
<li><strong>Armazenar logs em tabela auxiliar</strong> → erros_validacao(id, camada, motivo, data).</li>
<li><strong>Script Python + IA</strong> gera relatórios automáticos semanais (PDF/HTML).</li>
<li><strong>Integração com GeoServer/GeoNode</strong> → impedir publicação de camadas com erros graves.</li>
</ul>
<p><strong>5. Benefícios práticos</strong></p>
<ul>
<li><strong>Menos tempo</strong> gasto revisando dados manualmente.</li>
<li><strong>Garantia</strong> de que camadas publicadas no GeoServer/GeoNode estão <strong>consistentes</strong>.</li>
<li>Processo contínuo de <strong>validação</strong>, sem depender só de auditorias pontuais.</li>
<li><strong>IA como aliada</strong> na interpretação e automação de relatórios.</li>
</ul>
<p><strong>6. Conclusão</strong></p>
<p>A integração entre PostGIS e IA é uma das formas mais inteligentes de elevar a qualidade e confiabilidade de dados geoespaciais.<br />
Com isso, você consegue:</p>
<ul>
<li>Detectar anomalias automaticamente.</li>
<li>Explicar erros de forma compreensível para o usuário final.</li>
<li>Propor correções rápidas, inclusive automatizadas.</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.fernandoquadro.com.br/html/2025/10/06/postgis-ia-deteccao-automatica-de-anomalias-em-dados-espaciais/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Curso de WebGIS com inscrições abertas</title>
		<link>https://www.fernandoquadro.com.br/html/2025/10/02/curso-de-webgis-com-inscricoes-abertas/</link>
					<comments>https://www.fernandoquadro.com.br/html/2025/10/02/curso-de-webgis-com-inscricoes-abertas/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Quadro]]></dc:creator>
		<pubDate>Thu, 02 Oct 2025 14:10:20 +0000</pubDate>
				<category><![CDATA[GIS]]></category>
		<category><![CDATA[GeoNode]]></category>
		<category><![CDATA[GeoServer]]></category>
		<category><![CDATA[PostGIS]]></category>
		<guid isPermaLink="false">https://www.fernandoquadro.com.br/html/?p=9982</guid>

					<description><![CDATA[Prezado leitor, A Geocursos está com inscrições abertas para uma nova turma do Curso WebGIS: Crie Mapas Interativos na Web, sem precisar programar! Aprenda a disponibilizar dados espaciais na internet com uma plataforma WebGIS através de mapas interativos, dashboards, geostories,... <a class="more-link" href="https://www.fernandoquadro.com.br/html/2025/10/02/curso-de-webgis-com-inscricoes-abertas/">Continue Reading &#8594;</a>]]></description>
										<content:encoded><![CDATA[<p>Prezado leitor,</p>
<p>A <a href="https://geocursos.com.br/" target="_blank">Geocursos</a> está com inscrições abertas para uma nova turma do Curso WebGIS: Crie Mapas Interativos na Web, sem precisar programar!</p>
<p>Aprenda a disponibilizar dados espaciais na internet com uma plataforma WebGIS através de mapas interativos, dashboards, geostories, tudo isso com controle de acesso por nível de usuários e grupos.</p>
<p>Nesse curso você irá aprender:</p>
<ul>
<li>Criar seus próprios bancos da dados geográficos</li>
<li>Realizar consultas e análises espaciais no banco de dados</li>
<li>Padrões da OGC (WMS, WFS, WCS, WPS)</li>
<li>Criar simbologias no padrão SLD </li>
<li>Criar mapas interativos</li>
<li>Criar dashboards a partir de seus dados geográficos</li>
<li>Apresentar seus dados de uma forma mais profissional com o GeoStories</li>
<li>Realizar a manutenção das informações diretamente pelo QGIS</li>
<li>Como publicar seus dados em um ambiente de produção (na nuvem)</li>
</ul>
<p>O curso é ideal para estudantes e profissionais de GIS, Geografia, Engenharia, Meio Ambiente, Planejamento Urbano e TI.</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cd.png" alt="📍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Aulas práticas | <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4bb.png" alt="💻" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Ferramentas livres | <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4ca.png" alt="📊" class="wp-smiley" style="height: 1em; max-height: 1em;" /> SIG na Web</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Inscreva-se e leve seus dados espaciais para o mundo online!</p>
<p>Acesse: <a href="https://geocursos.com.br/webgis" target="_blank">https://geocursos.com.br/webgis</a><br />
WhatsApp: <a href="https://whats.link/geocursos" target="_blank">https://whats.link/geocursos</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.fernandoquadro.com.br/html/2025/10/02/curso-de-webgis-com-inscricoes-abertas/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>GeoServer WPS: Clip, Union e Nearest na Prática</title>
		<link>https://www.fernandoquadro.com.br/html/2025/09/16/geoserver-wps-clip-union-e-nearest-na-pratica/</link>
					<comments>https://www.fernandoquadro.com.br/html/2025/09/16/geoserver-wps-clip-union-e-nearest-na-pratica/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Quadro]]></dc:creator>
		<pubDate>Tue, 16 Sep 2025 12:00:06 +0000</pubDate>
				<category><![CDATA[GIS]]></category>
		<category><![CDATA[GeoServer]]></category>
		<category><![CDATA[WPS]]></category>
		<guid isPermaLink="false">https://www.fernandoquadro.com.br/html/?p=9972</guid>

					<description><![CDATA[O GeoServer, por meio do módulo Web Processing Service (WPS), não é apenas uma ferramenta de publicação de dados geoespaciais — ele também permite executar análises espaciais diretamente pela Web. Neste post, vamos explorar três processos essenciais para qualquer profissional... <a class="more-link" href="https://www.fernandoquadro.com.br/html/2025/09/16/geoserver-wps-clip-union-e-nearest-na-pratica/">Continue Reading &#8594;</a>]]></description>
										<content:encoded><![CDATA[<p>O GeoServer, por meio do módulo Web Processing Service (WPS), não é apenas uma ferramenta de publicação de dados geoespaciais — ele também permite executar análises espaciais diretamente pela Web.</p>
<p>Neste post, vamos explorar três processos essenciais para qualquer profissional de GIS:</p>
<ul>
<li><strong>Clip </strong>(recorte espacial)</li>
<li><strong>Union</strong> (união de geometrias)</li>
<li><strong>Nearest </strong>(análise de vizinhança)</li>
</ul>
<p>Essas operações, quando dominadas, abrem caminho para fluxos de trabalho robustos em monitoramento ambiental, planejamento urbano, saneamento e diversas outras áreas.</p>
<p><strong>1. Clip: Recortando Dados Espaciais</strong></p>
<p>O Clip é usado para recortar uma camada com base na geometria de outra. É muito útil quando você precisa trabalhar apenas com dados de uma região específica.</p>
<p>Suponha que você tenha uma camada nacional de hidrografia e deseja analisar apenas os rios que passam pelo estado de São Paulo.</p>
<p>Request de execução (WPS Execute):</p>
<pre>
&lt;wps:Execute service="WPS" version="1.0.0"
    xmlns:wps="http://www.opengis.net/wps/1.0.0"
    xmlns:ows="http://www.opengis.net/ows/1.1"
    identifier="gs:Clip"&gt;

  &lt;wps:DataInputs&gt;
    &lt;wps:Input&gt;
      &lt;ows:Identifier&gt;features&lt;/ows:Identifier&gt;
      &lt;wps:Reference mimeType="text/xml"
          xlink:href="http://localhost:8080/geoserver/wfs"
          method="POST"&gt;
        &lt;wps:Body&gt;
          &lt;wfs:GetFeature service="WFS" version="1.0.0"
              xmlns:wfs="http://www.opengis.net/wfs"&gt;
            &lt;wfs:Query typeName="workspace:rios_brasil"/&gt;
          &lt;/wfs:GetFeature&gt;
        &lt;/wps:Body&gt;
      &lt;/wps:Reference&gt;
    &lt;/wps:Input&gt;

    &lt;wps:Input&gt;
      &lt;ows:Identifier&gt;clip&lt;/ows:Identifier&gt;
      &lt;wps:Reference mimeType="text/xml"
          xlink:href="http://localhost:8080/geoserver/wfs"
          method="POST"&gt;
        &lt;wps:Body&gt;
          &lt;wfs:GetFeature service="WFS" version="1.0.0"
              xmlns:wfs="http://www.opengis.net/wfs"&gt;
            &lt;wfs:Query typeName="workspace:estado_sp"/&gt;
          &lt;/wfs:GetFeature&gt;
        &lt;/wps:Body&gt;
      &lt;/wps:Reference&gt;
    &lt;/wps:Input&gt;
  &lt;/wps:DataInputs&gt;

  &lt;wps:ResponseForm&gt;
    &lt;wps:RawDataOutput mimeType="application/json"&gt;
      &lt;ows:Identifier&gt;result&lt;/ows:Identifier&gt;
    &lt;/wps:RawDataOutput&gt;
  &lt;/wps:ResponseForm&gt;
&lt;/wps:Execute&gt;
</pre>
<p>Esse request retorna apenas os rios contidos dentro do polígono de São Paulo, em formato GeoJSON.</p>
<p><strong>2. Union: Combinando Camadas e Geometrias</strong></p>
<p>O Union permite integrar duas ou mais camadas em uma única saída, preservando atributos e geometrias. É muito usado para cruzar informações espaciais de diferentes fontes.</p>
<p>Imagine que você tem camadas de áreas de preservação e áreas urbanizadas, e precisa identificar interseções ou criar uma camada consolidada.</p>
<p>Exemplo de Request:</p>
<pre>
&lt;wps:Execute service="WPS" version="1.0.0"
    xmlns:wps="http://www.opengis.net/wps/1.0.0"
    xmlns:ows="http://www.opengis.net/ows/1.1"
    identifier="JTS:union"&gt;

  &lt;wps:DataInputs&gt;
    &lt;wps:Input&gt;
      &lt;ows:Identifier&gt;geom1&lt;/ows:Identifier&gt;
      &lt;wps:Data&gt;
        &lt;wps:ComplexData mimeType="application/wkt"&gt;&lt;![CDATA[
          POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))
        ]]&gt;&lt;/wps:ComplexData&gt;
      &lt;/wps:Data&gt;
    &lt;/wps:Input&gt;

    &lt;wps:Input&gt;
      &lt;ows:Identifier&gt;geom2&lt;/ows:Identifier&gt;
      &lt;wps:Data&gt;
        &lt;wps:ComplexData mimeType="application/wkt"&gt;&lt;![CDATA[
          POLYGON((5 5, 15 5, 15 15, 5 15, 5 5))
        ]]&gt;&lt;/wps:ComplexData&gt;
      &lt;/wps:Data&gt;
    &lt;/wps:Input&gt;
  &lt;/wps:DataInputs&gt;

  &lt;wps:ResponseForm&gt;
    &lt;wps:RawDataOutput mimeType="application/gml+xml"&gt;
      &lt;ows:Identifier&gt;result&lt;/ows:Identifier&gt;
    &lt;/wps:RawDataOutput&gt;
  &lt;/wps:ResponseForm&gt;
&lt;/wps:Execute&gt;
</pre>
<p>O resultado é um polígono unificado que representa a soma das áreas fornecidas.</p>
<p><strong>3. Nearest: Identificando o Elemento Mais Próximo</strong></p>
<p>O processo Nearest é essencial para análises de vizinhança. Ele encontra a feição mais próxima de um ponto ou conjunto de pontos.</p>
<p>Agora vamos supor que precisamos encontrar o hospital mais próximo de um acidente registrado em tempo real ou identificar a estação de tratamento de água mais próxima de uma comunidade rural.</p>
<p>Exemplo de Request</p>
<pre>
&lt;wps:Execute service="WPS" version="1.0.0"
    xmlns:wps="http://www.opengis.net/wps/1.0.0"
    xmlns:ows="http://www.opengis.net/ows/1.1"
    identifier="gs:Nearest"&gt;

  &lt;wps:DataInputs&gt;
    &lt;wps:Input&gt;
      &lt;ows:Identifier&gt;features&lt;/ows:Identifier&gt;
      &lt;wps:Reference mimeType="text/xml"
          xlink:href="http://localhost:8080/geoserver/wfs"
          method="POST"&gt;
        &lt;wps:Body&gt;
          &lt;wfs:GetFeature service="WFS" version="1.0.0"
              xmlns:wfs="http://www.opengis.net/wfs"&gt;
            &lt;wfs:Query typeName="workspace:hospitais"/&gt;
          &lt;/wfs:GetFeature&gt;
        &lt;/wps:Body&gt;
      &lt;/wps:Reference&gt;
    &lt;/wps:Input&gt;

    &lt;wps:Input&gt;
      &lt;ows:Identifier&gt;point&lt;/ows:Identifier&gt;
      &lt;wps:Data&gt;
        &lt;wps:ComplexData mimeType="application/wkt"&gt;&lt;![CDATA[
          POINT(-46.6333 -23.5505)
        ]]&gt;&lt;/wps:ComplexData&gt;
      &lt;/wps:Data&gt;
    &lt;/wps:Input&gt;
  &lt;/wps:DataInputs&gt;

  &lt;wps:ResponseForm&gt;
    &lt;wps:RawDataOutput mimeType="application/json"&gt;
      &lt;ows:Identifier&gt;result&lt;/ows:Identifier&gt;
    &lt;/wps:RawDataOutput&gt;
  &lt;/wps:ResponseForm&gt;
&lt;/wps:Execute&gt;
</pre>
<p>O retorno é o hospital mais próximo do ponto fornecido.</p>
<p><strong>4. Boas Práticas e Observações</strong></p>
<ul>
<li>O desempenho das operações depende do volume de dados. Prefira recortes prévios ou filtros WFS antes de chamar o WPS.</li>
<li>Para grandes análises (Union de muitos polígonos ou Nearest em bases massivas), utilize execução assíncrona.</li>
<li>Combine o WPS com clientes como QGIS ou bibliotecas Python (OWSLib, GeoPandas) para integrar análises em fluxos automatizados.</li>
<li>Sempre valide as geometrias antes do Union, pois polígonos inválidos podem gerar erros.</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.fernandoquadro.com.br/html/2025/09/16/geoserver-wps-clip-union-e-nearest-na-pratica/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
