Qual Era O Nome Da Cidade - Qual era o antigo nome da cidade de Salvador?
Qual era o antigo nome da cidade de Salvador?

Como descobrir qual era o nome da cidade usando dados geoespaciais brutos

Muita gente quando pergunta qual era o nome da cidade está lidando com um arquivo CSV cheio de coordenadas e sem nenhuma referência de lugar. O problema é mais comum do que parece. Chega um banco de dados sujo, com latitude e longitude soltas, e você precisa transformar isso em algo legível.

qual era o nome da cidade

Vou explicar como eu resolvi isso na prática, não a teoria de livro. Usei o geopandas combinado com a base do Natural Earth, que é gratuita e relativamente atualizada. A abordagem é simples em teoria: você sobrepõe pontos a polígonos de municípios e extrai o nome. Na prática, os dados nunca se encaixam perfeitamente. Minha primeira tentativa foi usar o Google Maps Geocoding API reverso. Funciona bem para endereços, mas com coordenadas soltas de levantamentos antigos, a API devolve nada ou dá erro de limite. Eu gastei quase três horas nessa armadilha antes de mudar de estratégia. O limite gratuito é generoso no início, mas qualquer lote maior que 10 mil registros cai no rate limit de forma silenciosa. A API retorna respostas parciais e seu script continua rodando como se estivesse funcionando.

Eu migrei para uma solução offline. O pacote geopandas com o shapefile de municípios do IBGE (para o Brasil) ou do Natural Earth (para uso internacional) resolve o problema sem depender de internet. O código básico é:

👉 Clique no botão abaixo para saber mais sobre o assunto!

import geopandas as gpd
from shapely.geometry import Point

gdf_coords = gpd.GeoDataFrame(
    {'cidade': ['?'] * len(df)},
    geometry=[Point(xy) for xy in zip(df['longitude'], df['latitude'])],
    crs="EPSG:4326"
)

municipios = gpd.read_file("caminho/para/shp/municipios.shp")
resultado = gpd.sjoin(gdf_coords, municipios, how="left", predicate="within")

Aqui vai o detalhe que ninguém avisa: a função sjoin com predicate="within" falha miseravelmente quando um ponto cai exatamente na divisa entre dois municípios. Você acaba com nomes duplicados ou valores nulos. Eu corrigi isso usando predicate="intersects" e depois fazendo um filtro de distância mínima. Se o ponto estiver a menos de 50 metros da divisa, eu escolho o município cujo centro está mais próximo. Outro problema real são os CRS (Sistemas de Referência de Coordenadas). Se seus pontos estiverem em um datum diferente do shapefile, o sjoin não vai reclamar, mas vai devolver resultados errados. Sempre verifique com .crs em ambos os DataFrames antes de executar o join. No meu caso, os dados originais estavam em SAD69 e o shapefile em WGS84. Um .to_crs() simples resolveu, mas sem essa verificação eu teria perdido meio dia.

Para quem precisa de velocidade com grandes volumes, o approccio mais eficiente é usar o módulo rtree junto com o geopandas. Um index espacial reduz o tempo de sobreposição de cerca de 45 minutos para aproximadamente 8 minutos num conjunto de 50 mil pontos em máquinas padrão de escritório. A diferença é brutal. Se você não consegue rodar localmente por alguma restrição de infraestrutura, a alternativa é a API do OpenStreetMap Nominatim. É gratuita e não precisa de chave, mas tem política de uso rigorosa. Cada requisição precisa ter um User-Agent identificado, e fazer mais de uma requisição por segundo trava seu IP. Eu fiz um scraper que processa lotes de 100 coordenadas com intervalo de 1.1 segundos entre cada lote. Consegue resolver cerca de 5.000 pontos por hora de forma estável.

Um aviso importante: nenhum método resolve cidades que não existem mais no mapa atual. Se você está rastreando antigas localidades, cidades que mudaram de nome após revisões administrativas ou assentamentos Desaparecidos, vai precisar cruzar com bases históricas como o IBGE histórico ou o GEONames com dados arquivados. A solução técnica é a mesma, só que o dataset de referência muda completamente. O que mais causa dor de cabeça não é a ferramenta em si, é a qualidade dos dados de entrada. Coordenadas com zeros, latitudes acima de 90, valores invertidos de lat e lon. Antes de qualquer processamento, sempre rode uma validação básica: verifique limites, detecte swap entre latitude e longitude comparando com a distribuição geográfica esperada, e remova outliers óbvios. Isso economiza horas de debugging depois.

Se o seu cenário é específico e nenhuma dessas abordagens se encaixa, o caminho mais direto é mapear primeiro o que você tem, identificar os gaps nos dados e escolher a ferramenta que cobre esses gaps sem improvisação. O nome da cidade é só o resultado final de um processo que depende quase inteiramente de quão limpos são os dados que você começa com.