Tag: data visualization

  • Coletando Malha Municipal do Brasil no IBGE

    O Objetivo aqui será plotar dados das fronteiras das regiões brasileiras através de arquivos shapefiles coletados do IBGE.

    A página web onde os links foram encontrados é este aqui e os últimos disponíveis são de 2021.

    Importando bibliotecas do Python

    from datetime import datetime
    
    #necessárias para o download dos arquivos
    import requests
    
    #necessárias para processas os dados geoespaciais
    import pandas as pd
    import geopandas as gpd
    import matplotlib.pyplot as plt
    

    Definindo os dados

    Neste artigo, construimos um dicionário com os links que encontramos no site do IBGE.

    arquivos = {
        'brasil': 'https://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2021/Brasil/BR/BR_Pais_2021.zip',
        'rga':'https://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2021/Brasil/BR/BR_RG_Intermediarias_2021.zip',
        'rgi':'https://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2021/Brasil/BR/BR_RG_Imediatas_2021.zip',
        'rgme':'https://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2021/Brasil/BR/BR_Mesorregioes_2021.zip',
        'rgmi':'https://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2021/Brasil/BR/BR_Microrregioes_2021.zip',
        'uf': 'https://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2021/Brasil/BR/BR_UF_2021.zip',
        'mun': 'https://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2021/Brasil/BR/BR_Municipios_2021.zip'
    }

    Baixando arquivos

    for i in arquivos:
        arquivo = i+".zip"
        remote_url = arquivos[i]
        
        print("Coletando: "+remote_url)
        data = requests.get(remote_url)
        with open("./inputs/"+arquivo, 'wb') as file:
            file.write(data.content)

    Plotando as Regiões brasileiras

    Agora que baixamos todos os arquivos, vamos plotar alguns exemplos

    Arquivo de Estados (UF)

    df = gpd.read_file('zip://inputs/uf.zip')
    df.head()
    df[df['NM_REGIAO']=='Nordeste'].plot()

    Municípios

    df = gpd.read_file('zip://inputs/mun.zip')
    df.head()
    df[df['SIGLA']=='MG'].plot(column="NM_MUN",cmap="YlGnBu")

    Para ver o notebook:


  • Coletando Dados de Cobertura da Anatel

    Neste Post criaremos scripts em python para coletar e processar dados geoespaciais de cobertura das Operadoras disponibilizados publicamente pela Anatel.

    Baixaremos todos os arquivos das operadoras e consolidaremos em um único arquivo geoespacial, acrescentaremos algumas colunas para enriquecer os dados iniciais.

    A Anatel disponibiliza os dados de cobertura das operadoras neste link aqui.

    Carregando bibliotecas

    Utilizaremos as bibliotecas Request e BeautifulSoup para coletar os dados que baixaremos via html pois precisaremos buscar por tags e classes no HTML

    Utilizaremos a biblioteca geopandas para analisar e salvar os dados processados.

    from datetime import datetimeimport reimport requestsfrom bs4 import BeautifulSoupfrom urllib.request import Request, urlopenimport pandas as pdimport geopandas as gpd
    Carregando bibliotecas

    Baixando página da Anatel

    BASE_URL="http://sistemas.anatel.gov.br"req = Request(BASE_URL+ "/se/public/cmap.php")html_page = urlopen(req)soup = BeautifulSoup(html_page, "lxml")
    Baixando página da Anatel

    Iremos armazenar os dados dos links em um Dataframe identificando operadora, tecnologia e a última data de atualização conforme informado pela Anatel.

    columns=['texto','operadora','tecnologia','last_update','url','arquivo']df = pd.DataFrame(columns=columns)#Loop que encontra todas as Tags <li> da página da Anatelfor link in soup.find_all("li"):	#Coleta do nome do arquivo detectando a div entidade        texto = link.find("div",{"class":"tec_entidade"})        #Coleta da data de atualização pela tag small    last_update = link.find("small")        #Coleta do link do arquivo para download via tag <div> e <a>    url = link.find("div",{"class":"download_shp"}).find("a")        #limpando e dividindo texto    if texto:        texto = texto.getText()        tecnologia = texto.split("_")[0].upper()        operadora = texto.split("_")[1].upper()            #limpando o campo data    if last_update:        last_update = last_update.getText().split(":")[1].split(")")[0].strip()        last_update = datetime.strptime(last_update, "%d/%m/%Y")        #tratando URL    if url:        url = link.find("div",{"class":"download_shp"}).find("a").get("href")    row = [texto,operadora,tecnologia,last_update,url,None]        df.loc[len(df)] = row
    #filtrar apenas linhas cuja url não é vaziafor index,row in df[df['url'].notna()].iterrows():        #construindo nome do arquivo para salvar em disco    arquivo = row['operadora']+"_"+row['tecnologia']+".zip"    df.loc[index,'arquivo'] = arquivo        #construindo url de download    remote_url = BASE_URL + row['url']        #download do arquivo    print("Coletando: "+remote_url)    data = requests.get(remote_url)    with open("./inputs/"+arquivo, 'wb') as file:        file.write(data.content)

    Abrindo arquivos e consolidando dados num arquivo único

    listdf = []for index,row in df[df['url'].notna()].iterrows():    gdf = geopandas.read_file('zip://inputs/'+row['arquivo'])    gdf= gdf.explode()    gdf['operadora'] = row['operadora']    gdf['tecnologia'] = row['tecnologia']    gdf['last_update'] = row['last_update']    gdf['tecnologia'] = row['tecnologia']    listdf.append(gdf.copy())    rdf = gpd.GeoDataFrame(pd.concat( listdf, ignore_index=True))rdf.to_file("cobertura.geojson", driver='GeoJSON')