diff --git a/etc/data/ibge/geoftp.ibge.gov.br/organizacao_territorial/divisao_territorial/2009/dtb_05_05_2009.zip b/etc/data/ibge/geoftp.ibge.gov.br/organizacao_territorial/divisao_territorial/2009/dtb_05_05_2009.zip new file mode 100644 index 0000000..6a85756 Binary files /dev/null and b/etc/data/ibge/geoftp.ibge.gov.br/organizacao_territorial/divisao_territorial/2009/dtb_05_05_2009.zip differ diff --git a/etc/data/ibge/leiame.txt b/etc/data/ibge/leiame.txt new file mode 100644 index 0000000..7e8b42a --- /dev/null +++ b/etc/data/ibge/leiame.txt @@ -0,0 +1,56 @@ +21/05/2012 + +Procedimento para importação de dados públicos obtidos do IBGE. + +- Tabela de Municípios: + Disponível desde 1940, foi atualizada a cada década entre os anos +1940 e 2000 e depois anualmente até a última atualização em 2009 (este +parágrafo foi escrito em maio de 2012). + + A atualização mais recente, portanto, é do ano de 2009. Considerando +que o formato de publicação tem variado bastante, o roteiro abaixo é +específico para os dados referentes ao ano 2009. + +- Procedimentos e instruções: + +1. Questões óbvias como configuração de PROXY são omitidas por não serem +relacionadas ao procedimento. +2. O diretório-base de referência no projeto é o raiz do projeto conforme +foi exportado do repositório, referenciado por $ +3. O URL-base de obtenção dos dados é: + + ftp://geoftp.ibge.gov.br + +4. Tornar o diretório corrente para: + + $/SIGI/trunk/etc/data/ibge + +5. Baixar o arquivo de 2009. O comando executado com sucesso considerando a +configuração da intranet do Interlegis na data corrente - maio de 2012 - é: + + wget -r --no-proxy ftp://geoftp.ibge.gov.br/organizacao_territorial/divisao_territorial/2009/ organizacao_territorial/divisao_territorial/2009 + +(o comando acima criará o caminho local "geoftp.ibge.gov.br/organizacao_territorial/divisao_territorial/2009/") + +6. Torne corrente o caminho onde o arquivo de 2009 está baixado: + + cd geoftp.ibge.gov.br/organizacao_territorial/divisao_territorial/2009 + +7. Expanda o arquivo obtido: + + unzip dtb_05_05_2009.zip + +8. Converta o arquivo expandido para o formato "CSV": + + xls2csv DTB_05_05_2009.xls > DTB_05_05_2009.csv + +9. Volte para o diretório-base do IBGE: + + $/SIGI/trunk/etc/data/ibge + +10. Execute o script de importação, cuja documentação dos processos encontra-se +nos fontes: + + sigi-import-ibge-2009.sh geoftp.ibge.gov.br/organizacao_territorial/divisao_territorial/2009/DTB_05_05_2009.csv + + diff --git a/etc/data/ibge/sigi-import-ibge-2009.py b/etc/data/ibge/sigi-import-ibge-2009.py new file mode 100644 index 0000000..a1ccfb3 --- /dev/null +++ b/etc/data/ibge/sigi-import-ibge-2009.py @@ -0,0 +1,36 @@ +import sys, csv + +_root_dict = None + +def getUFdict( root, ufid ): + return( root[ ufid ] ) + +def getCidadesDict( macrodict, microid ): + if macrodict = None: + return( None ) + microdoct = macrodict[ '__children' ] + if microdict = None: + microdict = {} + macrodict[ '__children' ] = microdict + +def main( ): + arquivo = open( 'geoftp.ibge.gov.br/organizacao_territorial/divisao_territorial/2009/DTB_05_05_2009.csv', 'r' ) + # despreza o cabecalho + arquivo.readline( ) + + lnum=0 + csv_reader = csv.reader( arquivo, delimiter=',', quotechar='"' ) + for registro in csv_reader: + if uf[ registro[ 0 ] ] = None: + uf[ registro[ 0 ] ] = {} + uf[ registro[ 0 ] ][ 'nome' ] = registro[ 1 ] + uf[ registro[ 0 ] ][ 'macrorregioes' ] = {} +# print "lnum: %s - %s" % ( lnum, registro ) + lnum = lnum + 1 + if lnum >= 10: + break + +if __name__ = "__main__": + main( ) + dumpdicts( ) + diff --git a/etc/data/ibge/sigi-import-ibge-2009.sh b/etc/data/ibge/sigi-import-ibge-2009.sh new file mode 100644 index 0000000..f64ac59 --- /dev/null +++ b/etc/data/ibge/sigi-import-ibge-2009.sh @@ -0,0 +1,148 @@ +#!/bin/sh + +arquivo_csv="" + +# Caso a variavel _DEBUG nao tenha sido preparada externamente, +# assumir que o default é sem DEBUG +if [ -z "${_DEBUG}" ] +then + _DEBUG="0" +fi + +# Default verboso +if [ -z "${_VERBOSE}" ] +then + _VERBOSE="1" +fi + +PrintDebug( ) +{ + # para a mensagem ser mostrada, _DEBUG deve ser configurada + # e o valor deve ser diferente de "0" + if [ -n "${_DEBUG}" -a "${_DEBUG}" -ne "0" ] + then + echo "$@" + fi +} + +PrintHelp( ) +{ + PrintDebug `basename "${0}"` " -- importa tabelas de cidades do IBGE" + PrintDebug "Opcoes aceitas:" + PrintDebug " arquivo_csv=[caminho]" + PrintDebug " informa o caminho para o arquivo no formato 2009" + PrintDebug " _DEBUG=[debug]" + PrintDebug " 0 para nao mostrar mensagens, 1 para mostrar" +} + +PrintMessage( ) +{ + # para a mensagem NAO ser mostrada, _VERBOSE deve ser configurada + # e o valor deve ser "0" + if [ -z "${_VERBOSE}" -o "${_VERBOSE}" -ne "0" ] + then + echo "$@" + fi +} + +while [ "${#}" -gt 0 ] +do + if echo "${1}" | grep "=" 2>&1 > /dev/null + then + PrintDebug "Argumento de configuracao: \"${1}\"" + eval "${1}" + else + PrintDebug "Argumento desconhecido: \"${1}\"" + PrintHelp + exit 1 + fi + + shift +done + +if [ -z "${arquivo_csv}" ] +then + PrintDebug "ERRO: informe o arquivo de importacao." + PrintHelp + exit 2 +fi + +if [ ! -f "${arquivo_csv}" ] +then + PrintDebug "ERRO: o arquivo de importacao nao existe ou nao pode ser acessado (\"${arquivo_csv}\")." + PrintHelp + exit 3 +fi + +if [ ! -r "${arquivo_csv}" ] +then + PrintDebug "ERRO: o arquivo de importacao nao pode ser lido (\"${arquivo_csv}\")." + PrintHelp + exit 4 +fi + +# filtrar o arquivo original para area de trabalho, por +# UF, Mesorregiao, Microrregiao, Municipio e depois executar +# os scripts Python para atualização do banco + +nome_base=sigi_ibge_import +niveis="uf macrorregiao microrregiao municipio" +for nivel in $niveis +do + eval "arquivo_${nivel}=/tmp/${nome_base}.${nivel}.csv" +done + +# arquivo_uf=/tmp/${nome_base}.uf.csv +# arquivo_macrorregiao=/tmp/${nome_base}.macrorregiao.csv +# arquivo_microrregiao=/tmp/${nome_base}.microrregiao.csv +# arquivo_municipio=/tmp/${nome_base}.municipio.csv + +exec 3< "${arquivo_csv}" 4> "${arquivo_uf}" 5> "${arquivo_macrorregiao}" 6> "${arquivo_microrregiao}" 7> "${arquivo_municipio}" + +lnum=0 + +PrintMessage "Iniciando leitura dos dados..." + +read linha <&3 +while read linha <&3 +do + lnum=$(($lnum + 1)) + if [ $(($lnum % 100)) -eq 0 ] + then + PrintMessage -n "${lnum} " + fi + echo "$linha" | cut -s -d, -f1,2 >&4 + echo "$linha" | cut -s -d, -f1,3,4 >&5 + echo "$linha" | cut -s -d, -f1,3,5,6 >&6 + echo "$linha" | cut -s -d, -f1,3,5,7,8 >&7 + if [ "${lnum}" -ge 1000 ] + then + break + fi +done + +PrintMessage "\n${lnum} registros processados" + +# fecha os descritores de saida +exec 4>&- 5>&- 6>&- 7>&- + +for nivel in $niveis +do + eval "arq_in=/tmp/${nome_base}.${nivel}.csv" + eval "arq_out=/tmp/${nome_base}.${nivel}.csv.tmp" + sort < $arq_in > $arq_out + uniq < $arq_out > $arq_in + rm $arq_out +done + +ifs="$IFS" +IFS=" +" +for l in `wc -l /tmp/${nome_base}*` +do + PrintDebug $l +done +IFS="$ifs" + +# Processar arquivos: INSERT ou UPDATE no banco +