class: center, middle, inverse, title-slide .title[ # Geocodificação e Preparação de Bases ] .subtitle[ ## Unidade 5 | Tópicos Especiais Mercadológicos: Geomarketing ] .author[ ### Prof.ª Renata Oliveira ] .institute[ ### CEFET-MG – Departamento de Ciências Sociais Aplicadas ] .date[ ### Outubro 2026 ] --- layout: true <div class="my-footer"> <span> <a href="https://places.education" target="_blank">https://places.education</a> </span> </div> --- --- class: center, middle # Geocodificação .large[ Geocodificar é converter **endereços textuais** em **coordenadas geográficas** (latitude/longitude) — o passo que transforma listas de clientes em mapas. ] --- ## Agenda — Unidade 5 (6h / 2 encontros) **Encontro 9 (4h)** - Conceito e métodos de geocodificação - Padronização de endereços brasileiros - APIs gratuitas e pagas: ViaCEP, Nominatim, Google - Georreferenciamento vs. geocodificação **Encontro 10 (2h)** - Limpeza e tratamento de inconsistências - Integração de tabelas espaciais - QGIS: plugin MMQGIS para geocodificação em lote - Atividade prática: geocodificar lista de clientes --- ## Geocodificação direta e reversa .pull-left[ **Geocodificação direta:** Endereço → Coordenadas ``` "Av. Afonso Pena, 1000, BH, MG" ↓ lat: -19.9220, lon: -43.9388 ``` **Geocodificação reversa:** Coordenadas → Endereço/Local ``` lat: -19.9208, lon: -43.9365 ↓ "CEFET-MG Campus II, Contagem" ``` ] .pull-right[ **Diferença principal:** - A geocodificação direta localiza um endereço no mapa - A geocodificação reversa identifica o endereço associado a um ponto - As duas operações dependem da qualidade da base de referência ] --- ## Por que geocodificar? - Cadastros de clientes registram **endereços**, não coordenadas - Dados de NF-e, CRM e ERP raramente chegam espacializados - Cruzamentos espaciais exigem **latitude e longitude** .tip[ No Brasil, o **CEP** é uma variável amplamente disponível, mas não garante precisão no número do imóvel. ] --- ## Padronização de endereços — limpeza inicial .your-turn[ **Na Calculadora de Campos do QGIS:** 1. Carregar a planilha de clientes: *Camada → Adicionar Camada → Adicionar Camada de Texto Delimitado* (CSV com coluna `endereco`) 2. Abrir a tabela de atributos e clicar no ícone de **Calculadora de Campos** (ábaco) 3. Marcar "Criar um novo campo": nome `end_limpo`, tipo **Texto (string)**, comprimento 255 4. Expressão para maiúsculas, remoção de pontuação e espaços duplicados: ``` trim(regexp_replace(upper("endereco"), '[.,/-]', ' ')) ``` ] --- ## Padronização de endereços — abreviações .your-turn[ **Na Calculadora de Campos do QGIS:** 1. Criar o campo `end_padrao` para expandir abreviações comuns, encadeando `regexp_replace`: ``` regexp_replace(regexp_replace("end_limpo", '^R ', 'RUA '), '^AV ', 'AVENIDA ') ``` 2. Repetir a lógica para outras abreviações de bairro e cidade, como "BH" → "BELO HORIZONTE" 3. Conferir uma amostra na tabela de atributos 4. Usar `end_padrao` como coluna de endereço no MMQGIS ] --- ## ViaCEP — consulta e preenchimento .your-turn[ **O ViaCEP complementa o endereço, mas não gera coordenadas:** 1. Para cada CEP da lista, acessar no navegador: `https://viacep.com.br/ws/<CEP>/json/` (ex.: `viacep.com.br/ws/30130170/json/`) 2. Copiar os campos retornados — `logradouro`, `bairro`, `localidade` e `uf` — para as colunas correspondentes da planilha de clientes (CSV), antes de abri-la no QGIS 3. Carregar a planilha completa: *Camada → Adicionar Camada → Adicionar Camada de Texto Delimitado* ] --- ## ViaCEP — endereço completo .your-turn[ **Na Calculadora de Campos:** 1. Criar o campo `endereco_completo` concatenando as colunas: ``` concat("logradouro", ' ', "numero", ' ', "bairro", ' ', "localidade", '/', "uf") ``` 2. Conferir se número, município e UF aparecem em todos os registros 3. Usar `endereco_completo` como coluna de entrada no MMQGIS → *Geocode CSV with Web Service* ] --- ## Nominatim — configuração no MMQGIS .your-turn[ **Configuração inicial:** 1. *MMQGIS → Geocode → Geocode CSV with Web Service* 2. Em **Input CSV File**, selecionar a planilha com a coluna `endereco_completo` 3. Em **Web Service**, escolher **Nominatim (OpenStreetMap)** — gratuito, não exige chave de API 4. Selecionar a coluna de endereço no campo **Address Field** 5. Em **Output Shapefile**, definir onde salvar a camada de pontos resultante e o SRC de saída (SIRGAS 2000, EPSG:4674) ] --- ## Nominatim — execução e revisão .your-turn[ **Processamento:** 1. Clicar em **Apply** e aguardar o processamento 2. Respeitar o limite de **1 requisição por segundo** exigido pelo Nominatim 3. Conferir a camada de endereços geocodificados 4. Abrir a camada `_notfound`, com os registros que falharam 5. Corrigir os endereços e reenviar apenas os casos necessários ] --- ## Google Maps API — configuração .your-turn[ **Opção paga no MMQGIS:** 1. Obter uma chave de API em `console.cloud.google.com` → *APIs & Services → Library → Geocoding API → Enable* e depois *Credentials → Create API Key* 2. *MMQGIS → Geocode → Geocode CSV with Web Service* 3. Em **Web Service**, selecionar **Google Maps** 4. Colar a chave de API no campo **API Key** 5. Selecionar a coluna de endereço completo em **Address Field** e definir o arquivo de saída ] --- ## Comparação entre serviços 1. Executar a geocodificação no Google Maps API 2. Comparar a taxa de sucesso e a precisão com o Nominatim 3. Consultar a política de preços vigente antes de processar a base | API | Custo | Limite gratuito | Precisão | |-----|-------|----------------|----------| | Nominatim (OSM) | Gratuito | 1 req/s | Boa | | ViaCEP | Gratuito | Sem limite | Somente CEP | | Google Maps | Pago | 200 USD/mês grátis | Excelente | | OpenCage | Pago | 2.500/dia gratuito | Muito boa | --- ## Validação — coordenadas ausentes .your-turn[ **Na camada geocodificada:** 1. Na camada de pontos geocodificados, abrir a tabela de atributos e usar **Selecionar feições usando uma expressão** com: ``` "lat" IS NULL OR "lon" IS NULL ``` 2. Separar os registros selecionados para revisão, preservando a base original 3. Corrigir o endereço ou marcar a justificativa da falha ] --- ## Validação — localização no município .your-turn[ 1. Baixar o limite municipal do IBGE e carregar via *Camada → Adicionar Camada Vetorial* 2. Caixa de ferramentas Processing → **Extract by location**: - Camada de entrada: pontos geocodificados válidos - Camada de comparação: limite do município (BH) - Predicado espacial: **intersecta / dentro (within)** 3. Executar para obter os pontos dentro do município 4. Comparar a contagem com a camada original 5. Revisar os pontos externos como candidatos a erro ] --- ## Integração espacial — configuração .your-turn[ **Associação de cada cliente ao setor censitário:** 1. Baixar a Malha de Setores Censitários 2022 do IBGE (shapefile/GeoPackage) para o município e carregar via *Camada → Adicionar Camada Vetorial* 2. Caixa de ferramentas Processing → **"Join attributes by location"** 3. Configurar: - Camada de entrada: clientes geocodificados e validados (dentro do município) - Camada de junção: setores censitários - Predicado geométrico: **está contido (within)** - Campos a copiar da camada de junção: `CD_SETOR`, `NM_BAIRRO` (ou equivalentes) - Tipo de junção: **um a um (um registro por feição de entrada)** ] --- ## Integração espacial — resultado .your-turn[ 1. Executar **Join attributes by location** 2. Conferir se cada cliente recebeu `CD_SETOR` e `NM_BAIRRO` 3. Abrir a tabela de atributos 4. Usar **Mostrar Estatísticas Resumidas** em `NM_BAIRRO` 5. Comparar a contagem de clientes por bairro ] .tip[ "Join attributes by location" é o equivalente espacial de um JOIN de SQL — associa cada ponto ao polígono que o contém. ] --- ## MMQGIS — preparação .your-turn[ **Instalação e entrada:** 1. Instalar plugin: *Complementos → Gerenciar → buscar "MMQGIS" → Instalar* 2. *MMQGIS → Geocode → Geocode CSV with Web Service* 3. Configurar: - Arquivo CSV com coluna de endereço completo - Serviço: **Nominatim** (gratuito) ou **Google** (necessita API key) - Coluna de endereço: selecionar - SRC saída: SIRGAS 2000 (4674) ] --- ## MMQGIS — processamento .your-turn[ 1. Clicar em **Apply** e aguardar o processamento 2. Conferir a camada de pontos gerada 3. Identificar os registros sem correspondência 4. Revisar o endereço completo e repetir somente os casos corrigidos **Dica:** Concatenar logradouro + número + bairro + cidade + estado antes de importar. ] --- ## Atividade prática — cenário e dados .your-turn[ **"Geocodificando clientes de uma loja"** *(50 min)* **Cenário:** Uma loja de material de construção em BH quer mapear seus 50 maiores clientes para identificar clusters de demanda. **Dados fornecidos:** `dados/clientes_loja.csv` — planilha com 50 clientes fictícios (id, nome, CEP, valor_anual) distribuídos em bairros de BH, pronta para importar no QGIS. ] --- ## Atividade prática — tarefas .your-turn[ **"Geocodificando clientes de uma loja"** *(50 min)* 1. Geocodificar via MMQGIS (Nominatim), completando com ViaCEP quando necessário 2. Mapear no QGIS com simbologia **Graduada** (tamanho do ponto ∝ valor_anual) 3. Identificar bairros com maior concentração de clientes (Join attributes by location + estatísticas resumidas) 4. Sugerir onde abrir segundo depósito ] --- ## Resolução — geocodificação .your-turn[ **Etapa 1:** 1. Importar `dados/clientes_loja.csv` via *Camada → Adicionar Camada → Adicionar Camada de Texto Delimitado* (ainda sem geometria) 2. Na Calculadora de Campos, criar `endereco_completo` concatenando `cep` com `'Belo Horizonte, MG, Brasil'` 3. *MMQGIS → Geocode → Geocode CSV with Web Service*, serviço **Nominatim**, coluna `endereco_completo` 4. Conferir os registros geocodificados e revisar a camada `_notfound` ] --- ## Resolução — simbologia e exportação .your-turn[ **Etapa 2:** 1. Na camada de pontos, abrir *Propriedades → Simbologia → Graduado*: - Valor: `valor_anual` - Método: **tamanho do símbolo** (não cor) - Classificação: 5 classes por Quebras Naturais (Jenks) 2. Definir a cor do marcador, por exemplo `#E9AFA3` 3. Ativar rótulos com o nome do cliente em *Propriedades → Rótulos* 4. Opcional: usar **qgis2web** para exportar um mapa Leaflet interativo ] --- ## Conceitos-chave — preparação e serviços ✅ **Geocodificação** converte endereços em coordenadas — passo fundamental ✅ **Padronização** do endereço antes da geocodificação reduz erros ✅ Nominatim (gratuito) + Google (pago) cobrem a maioria dos casos --- ## Conceitos-chave — validação e QGIS ✅ **Validação espacial** ("Extract by location") detecta coordenadas erradas ✅ **MMQGIS** permite geocodificação em lote diretamente no QGIS --- ## Referências - ViaCEP API: [viacep.com.br](https://viacep.com.br) - Nominatim (OSM): [nominatim.org](https://nominatim.org) - Google Maps Platform: [developers.google.com/maps/documentation/geocoding](https://developers.google.com/maps/documentation/geocoding) - OpenCage Geocoder: [opencagedata.com](https://opencagedata.com) - MMQGIS Plugin: [michaelminn.net/linux/mmqgis](http://michaelminn.net/linux/mmqgis) - SEBASTIÃO, A. **A crescente importância da privacidade e segurança no geomarketing**. Amazon, 2023. .footnote[ [github.com/retaoliveira/geomarketing_05_geocodificacao](https://github.com/retaoliveira/geomarketing_05_geocodificacao) ]
×