====== Alfredo Acosta ======
{{:bie5782:01_curso_atual:alunos:trabalho_final:alfredoacosta:12102017-49-9.png?200|}}
Doutorando em Epidemiología aplicada as zoonoses, FMVZ, USP
O título da minha tese é: '//Avaliação do sistema de vigilância para peste suína clássica do Equador.
Proposta de sistema de vigilância baseado em risco//', orientado pelo professor Fernando Ferreira.
[[http://leb.fmvz.usp.br/pt-br]]
===== Meus exercicios =====
Linque para a página com os meus exercícios resolvidos [[.:exec]]
===== Proposta de trabalho final =====
==== I Plano A: Reporte padronizado de vacinação ====
{{ :bie5782:01_curso_atual:alunos:trabalho_final:alfredoacosta:guayas3.jpg?200|}}
=== Contextualização ===
A Agencia de regulação e controle fito zoo sanitário e uma organização adscrita ao Ministério de Agricultura do Equador, nas suas competências tem a execução e fiscalização do Projeto de erradicação de Peste suína clássica (PSC). A PSC e uma das principais doenças infecciosas dos suínos domésticos, não tem cura e eventualmente causa a morte do animal infetado, sua erradicação se baseia em prevenção mediante vacinação e remoção sistemática dos animais infetados.
No Equador se tem implementado um proceso de vacinação obrigatória para seu controle, para isso se tem um sistema de registro de atestados de vacina, numa base de dados (PostgreSQL) com uma interface desenvolvida em código PHP, reportes dinâmicos ainda não foram desenvolvidos. Atualmente se baseiam em análise de reportes excel mediante filtros e tabela dinâmicas tanto nos funcionários públicos, como professionais autorizados que tem aceso aos reportes.
Para o controle do processo, são definidos no inicio do ano, metas baseadas na população existente e vacinada (baseados na mais alta vacinação histórica registrada), são registrados os atestados de vacina (50.000 por ano), e o respetivo seguimento e controle em cada órgão estadual (24 províncias) quem a sua vez fazem o controle nos municípios (221 cantones) e 1024 parroquias (mínima unidade territorial). 330 Fiscais agropecuários Veterinários e Agrônomos fiscalizam o avance das metas usando reportes da cobertura de vacina em cada unidade territorial, e uns 100 credenciados privados para o que é usado vários reportes de avance de cobertura, semanais, mensuais e anuais (Exemplo1).
Ao introduzir um banco de dados (que se encontra padronizado desde o servidor), a função responderia a pergunta Qual é o status (porcentagem de avanço) de imunização neste período e neste território. Mostrando um reporte PDF com a informação proporcionada e analisada.
=== Planejamento da função ===
Entrada: vac(''arquivo'', ''territorio'', ''ordem'')
* ''arquivo'' = Nome do arquivo em formato excel (class: dataframe).
* ''territorio'' = Análise territorial (class: list, 3 fatores [provincia, canton ou parroquia]).
* ''ordem'' = Alfabético ou ranking (class: list, 2 fatores [alf, rank]).
=== Verificando os parâmetros:===
* arquivo = É um arquivo .xlsx com 20 colunas validadas os nomes originais das colunas. Se não escreve: “O arquivo deve ser o original baixado desde reportes do sistema GUIA”.
* territorio = Somente 3 opções são aceitas para análise territorial. Se não escreve: “Só podem ser feitos analises para Provincia, Cantón ou Parroquia (pro, can ou par são aceitos)”
* order = Somente duas opções. Se não escreve: “Só aceito alfab = alfabético ou rank = ranking”.
- Um objeto meta fornecido antecipadamente debe rá vir como fonte de dados dentro da função.
==== Pseudo-código =====
- Avalia se o arquivo fornecido é um xlsx com o número de colunas (20) especificado e os nomes de colunas padronizadas.
- Importa o arquivo como um dataframe de nome ''dados''.
- Cria um data frame do nome ''resultv'' com N fileiras, e 3 colunas UT (executado, meta, porcentagem), prenche tudo com NAs.
- Calcula o número de N fileiras de acordo com o UT número de unidades territoriais do parâmetro territorio + um com o total.
- Cria um objeto ''porcentagem'' e salva a divisão da soma do numero de animais vacinados do objeto dados pela soma do numero de animais vacinados no objeto meta por cada UT. Valida a existência do nome de cada UT antes de fazer a divisão.
- Salva do objeto ''result'' com um match por nomes da UT meta com dados.
- Ordena os valores do objeto ''result'' de acordo com o parâmetro order alfabético das UT ou numérico da porcentagem.
- Cria um objeto ''range'' com a resta do tempo em dias do primeiro e última data encontradas na coluna data de registro e salva tambem as duas datas.
- Cria um objeto ''data'' com data e hora do fim do processo.
- Cria um objeto ''timestamp'' com o tempo de análise desde a importação ate a geração do PDF.
===Saída:===
* Cria um gráfico de barras no eixo X os nomes da UT, eixo Y a ''porcentagem''.
* Exporta em PDF o nome do archivo proporcionado, os parâmetros de entrada da função, o objeto range, o dataframe result o gráfico a data do reporte e o timestamp.
=== Links ===
[[http://www.agrocalidad.gob.ec/proyecto-de-control-y-erradicacion-de-peste-porcina-clasica-ppc/
]]
[[https://guia.agrocalidad.gob.ec/agrodb/ingreso.php]]
Exemplo 1
{{:bie5782:01_curso_atual:alunos:trabalho_final:alfredoacosta:vac.png?200|}}
==== II Plano B: Mapa dinâmico de movimentação animal ====
===Contextualização===
O controle da movimentação animal e um processo mandatório padronizado ao redor do mundo no qual todos os animais de produção (bovinos, suínos, aves, equinos e outros), para se mobilizar precisam de um atestado no qual indique sua condição sanitária.
Os atestados de mobilização são salvos, mas em geral não se tem visualização padrado dos dados registrados. Uma análise gráfica feita com mapas das densidades por localização da origem e destino dos animais poderia ser bem útil para analisar tendências de movimentações ou lugares de maior densidade. Isto para melhorar controles baseados nas tendências deses movimentos ou simplesmente para saber espacialmente onde foram movimentados.
Mapas são feitos a través de programas de geoprocessamento como ARCGIS ou QGIS mas, um mapa com densidades como no proporcionado no exemplo(2) demora em fazer unos 20-30 minutos em pessoal experiente ou dificilmente seriam feitos pelos propietários dos animais.
A função pretende traçar o movimento de animais de produção em diferentes escalas espaciais, fornecendo ao usuário de um resumo estatístico e mapas em escala apropriada registrando as movimentações dos animais.
A estatística descritiva ''mstats'' vai analisar o : total de atestados, animais, lotes, media de animais por atestado e media de animais e lotes por atestado por unidade territorial, summary do número de animais.
=== Planejamento da função ===
**Entrada: ''mov''(''arquivo'',''divter'',''dir'',''tipo'',''especie'')**
* ''arquivo'' = Nome do arquivo em formato csv (class: dataframe).
* ''divter'' = Divisão territorial (class: list, 3 fatores [d1, d2 ou d3]).
* ''dir'' = Direção do movimento (class: list, 2 fatores [from, to]).
* ''tipo'' = Animais ou lotes movimentados (class: list, 2 fatores [animais, lotes])
* ''especie'' = Tipo de espécie de animais (class: list, [aves, bovinos, suínos, caprinos]
===Verificando os parâmetros:===
* arquivo = csv contendo:
-Número de atestado.
-Data do atestado.
-3 divisões territoriais origem e 3 divisões territoriais destino (estado, microrregião, municipio), (states, counties, municipalities) ou (Provincias, cantones, parroquias).
-Número de animais movimentados.
-Especie movimentada.
Se não escreve: “O arquivo deve ter os parametros requeridos”.
* divter = Somente 3 opções são aceitas para análise territorial. Se não escreve: “as opções de territorios disponíveis são t1, t2 ou t3”.
* dir = Somente duas opções. Se não escreve: “só analiso origem ou destino”.
* tipo = Somente duas opções. Se não escreve: “analiso unicamente animais ou lotes”.
* especie = Quatro opções. Se não escreve: “as opcões animais disponveis são aves, bovinos, suínos, caprinos”.
===Pseudo-código:===
- Avalia se o arquivo fornecido é um csv com 9 colunas e os nomes de colunas padronizadas (indicadas no help).
- Importa o arquivo como um dataframe de nome ''dados''.
- Cria um data frame do nome ''resultm'', colnames [Divisão_territorial, n_animais, n_lotes, Código_divisão].
- Prenche ''resultm'' com o resultado da soma de todos os animais consolidados ao número de divisão territorial escolhida, se o parâmetro tipo é animais.
- Prenche ''resultm'' com o resultado da conta única do número de atestado consolidados ao número de UT escolhido, se o parâmetro tipo é lote.
- Prenche ''resultm'' com o código da divisão territorial[t1], fazendo uma comparação do nome de divisão territorial contida no arquivo shp com o nome da divisão territorial do ''resultm[Divisão_territorial]''.
- Prenche ''resultm'' com o código da divisão territorial[t2], fazendo uma comparação do nome de divisão territorial contida no arquivo shp com o nome da divisão territorial do ''resultm[Divisão_territorial t1+t2]''.
- Prenche ''resultm'' com o código da divisão territorial[t3], fazendo uma comparação do nome de unidade territorial contida no arquivo shp com o nome da unidade territorial do ''resultm[Unidade_Territorial t1+t2+t3]''.
- Cria um data.frame do nome ''mstats'' com informação descritiva e estatísticas incluindo as informações indicadas na contextualização.
- Carrega o shape com unidades territoriais de acordo com a escolha do usuario de ''divter'' e salva como objeto ''shp''.
- Cria um objeto ''grapm'' e representa graficamente os dados de ''resultm'' num mapa com coloração de escala de 4 níveis de cor, baseado no shape.
- Cria um objeto ''range'' com a resta do tempo em dias do primeiro e última data encontrada na coluna data do df. Salva tambem as duas datas.
- Cria um objeto ''data'' com data e hora do fim do processo.
- Cria um objeto ''timestamp'' com o tempo de análise desde a importação ate a geração do PDF.
===Saída:===
* Exporta o grafico ''gramp'' com as unidades territoriais preenchidas de acordo com a escala de 4 níveis de cor por densidade de número de animais ou lotes movimentados ''resultm'' para a unidade territorial selecionada.
* Exporta em PDF o nome do arquivo proporcionado, os parâmetros de entrada da função, o objeto range, o objeto grapm a ''data'', ''mstats'' e o ''timestamp''.
===III Referências===
Exemplo 2
{{:bie5782:01_curso_atual:alunos:trabalho_final:alfredoacosta:mapa.png?200|}}
----
^nome^projeto^ email^telefone^
|Alfredo| | alfredoacosta@usp.br|~~~~~|
Olá Alfredo,
Você estruturou bem ambas as propostas de funções, apresentou bem os argumentos de entrada e as saídas das mesmas. Achei muito legal que ambas as funções pretendem verificar que os parâmetros de entrada estejam nos formatos certos e retornem mensagem de erro para os usuários. E também achei bem legal os pseudo-códigos. Contudo, ambas as propostas têm uma deficiência crítica, e é que elas são muito específicas. Da forma como você as contextualiza e as apresenta dá para entender que suas propostas irão apenas resolver os problemas destacados por você, não mais disso. Um ponto importante da função que vocês devem criar é a capacidade de resolver problemas amplos, dentre os quais problemas na sua área de atuação devem ser apenas um exemplo do que a função pode fazer. Ou seja, mesmo que sua função se encaixe dentro de um contexto acadêmico específico, a aplicabilidade da tarefa que desenvolverá deve abranger diversos problemas da área. Sugiro você dar uma olhada de novo aos "Passos para uma boa proposta" explicitados para o [[http://ecologia.ib.usp.br/bie5782/doku.php?id=bie5782:01_curso_atual:alunos:trabalho_final:start|Trabalho final]]. Veja que não estou pedindo para você trocar suas propostas, de fato gostei mais da B por exemplo. Mas reformule suas propostas de forma que a aplicabilidade das funções seja mais abrangente. --- //[[gustavo.a.agudelo@gmail.com|Gustavo Agudelo]] 2018/05/10 11:34//
--- //[[aleadalardo@gmail.com|Alexandre Adalardo de Oliveira]] 2018/05/18 10:39//
Caro Alfredo,
Concordo com o Gustavo que ambas as propostas estão muito bem colocadas e apresentadas. Apesar de serem específicas a um problema, são desafios interessantes de implementação de atividades repetitiva que pode ser útil. Pode seguir com aquela que tiver mais interesse.
----
----
====== Mapa dinâmico de movimentação animal ======
{{:bie5782:01_curso_atual:alunos:trabalho_final:alfredoacosta:funcao_mov.r|}}
mov <- function(arquivo,divter,dir,tipo,map) {
t1i <- Sys.time() #00 Contando o tempo da funcao
#Requiring package
require(ggplot2, quietly = F)
require(readxl, quietly = F)
require(raster, quietly = F)
require(tidyverse, quietly = F)
require(leaflet, quietly = F)
require(webshot, quietly = F)
require(htmlwidgets, quietly = F)
# A Validacao de argumentos ----
if(divter != "t1" && divter != "t2" && divter !="t3") #01 Verifica se divter foi inserido corretamente
{
stop("divter so pode ser t1, t2 ou t3") #2 indica os valores permitidos
}
if(dir != "o" && dir != "d") #3 Verifica se dir foi inserido corretamente
{
stop("dir so pode ser 'o' ou 'd' (origem ou destino)" ) #4 Indica os valores permitidos
}
if(tipo != "a" && tipo !="l") #5 Verifica se tipo foi inserido corretamente
{
stop("tipo so pode ser 'a' ou 'l' (animais ou lotes)") #6 indica os valores permitidos
}
if(map != "q" && map != "qq") # 7 Verifica se opcoes do mapa foram inseridas corretamente
{
stop("map so pode ser 'q', 'qq'(quantidade, quartil)") #8 indica os valores permitidos
}
#B Validacoes no arquivo ----
m <- readxl::read_excel(path = arquivo,
col_types = c("text", "text", "text",
"text", "text", "text",
"text", "numeric","date"))# 9 carrego o arquivo fornecido para validacoes
m <<- m
#10 crio um dataframe com as clases correctas para comparacao
a <- data.frame(as.character("a"), as.character("b"), as.character("c"),
as.character("d"), as.character("e"), as.character("f"),
as.character("g"), as.numeric('5'), as.Date("2018-01-01"),
stringsAsFactors = FALSE)
if(!sapply(a, class) == sapply(m, class)) #11 Compara as variaveis do arquivo fornecido com as do exemplo
{
stop("Suas 9 variavels, tem que ser no formato especificado na ajuda") #12 Indica as variaveis
}
#C Somando e agregando animais dependendo dos territorios origen ----
if(divter=="t1" && dir=="o" && tipo=="a") #13 Especificando argumentos para somas
{
result <- aggregate(x= m[ ,8], by=m[ ,2], FUN=sum) #14 somatoria de animais t1 e origem }
}
if(divter=="t2" && dir=="o" && tipo=="a") #15 Especificando argumentos para somas
{
result <- aggregate(x= m[ ,8], by=m[ ,3], FUN=sum) #16 somatoria de animais t2 e origem
}
if(divter=="t3" && dir=="o" && tipo=="a") #17 Especificando argumentos para somas
{
result <- aggregate(x= m[ ,8], by=m[ ,4], FUN=sum) #18 somatoria de animais t3 e origem
}
#D Somando e agregando animais dependendo dos territorios destino ----
if(divter=="t1" && dir=="d" && tipo=="a") #19 Especificando argumentos para somas
{
result <- aggregate(x= m[ ,8], by=m[ ,5], FUN=sum) #20 somatoria de animais t1 e destino
}
if(divter=="t2" && dir=="d" && tipo=="a") #21 Especificando argumentos para somas
{
result <- aggregate(x= m[ ,8], by=m[ ,6], FUN=sum)#22 somatoria de animais t2 e destino
}
if(divter=="t3" && dir=="d" && tipo=="a") #23 Especificando argumentos para somas
{
result <- aggregate(x= m[ ,8], by=m[ ,7], FUN=sum)#24 somatoria de animais t3 e destino
}
#E Contando e agregando lotes dependendo dos territorios origen ----
if(divter=="t1" && dir=="o" && tipo=="l") #25 Especificando argumentos para conta de lotes
{
result <- aggregate(x= m[ ,8], by=m[ ,2], FUN=NROW) #26 Contagem dos lotes t1 e origem
}
if(divter=="t2" && dir=="o" && tipo=="l") #27 Especificando argumentos para conta de lotes
{
result <- aggregate(x= m[ ,8], by=m[ ,3], FUN=NROW) #28 Contagem dos lotes t2 de origem
}
if(divter=="t3" && dir=="o" && tipo=="l") #29 Especificando argumentos para conta de lotes
{
result <- aggregate(x= m[ ,8], by=m[ ,4], FUN=NROW) #30 Contagem dos lotes t3 de origem
}
#F Contando e agregando lotes dependendo dos territorios destino ----
if(divter=="t1" && dir=="d" && tipo=="l") #31 Especificando argumentos para conta de lotes
{
result <- aggregate(x= m[ ,8], by=m[ ,5], FUN=NROW) #32 Contagem dos lotes t1 de origem
}
if(divter=="t2" && dir=="d" && tipo=="l") #33 Especificando argumentos para conta de lotes
{
result <- aggregate(x= m[ ,8], by=m[ ,6], FUN=NROW) #34 Soma os animais t2 de origem
}
if(divter=="t3" && dir=="d" && tipo=="l") #35 Especificando argumentos para conta de lotes
{
result <- aggregate(x= m[ ,8], by=m[ ,7], FUN=NROW) #36 Soma os animais t3 de origem
}
# E Fazendo mapa para t1
if(divter == 't1')#37 Se e t1 muda o colname para t1
{
colnames(result) <- c("t1","cantidad") #38 muda o nome da coluna para nao confundir
ec1 <- getData("GADM", country = "ecuador", level = 1)#39 baixa o mapa para t1
#40 elimino carateres especiais do resultado para poder fazer match correcto entre dados e mapa
result$t1 <- gsub("á","a", result$t1)
result$t1 <- gsub("é","e", result$t1)
result$t1 <- gsub("í","i", result$t1)
result$t1 <- gsub("ó","o", result$t1)
result$t1 <- gsub("ú","u", result$t1)
#41 elimino caracteres especiais do data frame
ec1@data$NAME_1 <- gsub("á","a", ec1@data$NAME_1)
ec1@data$NAME_1 <- gsub("é","e", ec1@data$NAME_1)
ec1@data$NAME_1 <- gsub("í","i", ec1@data$NAME_1)
ec1@data$NAME_1 <- gsub("ó","o", ec1@data$NAME_1)
ec1@data$NAME_1 <- gsub("ú","u", ec1@data$NAME_1)
#42 Comparo dados do mapa com os dos dados do result de obter match mantenho o valor se nao aplicar NA
### e importante conhecer os NA, que sao territorios que nao tem dados.
result <- data.frame(t1 = setdiff(ec1@data$NAME_1, result$t1),
cantidad = NA,
stringsAsFactors = FALSE) %>% bind_rows(result)
# 43 Crio no data do shape as quantidades para usarlas na projeccao do mapa
ec1@data$cantidad <- result$cantidad[match(ec1@data$NAME_1, result$t1)]
ec1 <<- ec1 #44 envia o shape file para o global enviroment
}
if(divter == 't1' && map == "q")#45 Se e mapa solicitado e por quantidade
{
#46 meus colores de paleta calculados por numero de animais
mypal <- colorNumeric(palette = "viridis", na.color = "#ffffff", domain = ec1@data$cantidad)
map <- leaflet() %>% #47 Apertura ambiente grafico html
addProviderTiles("OpenStreetMap.Mapnik") %>%#48 Apertura open maps
setView(lat = -1.7, lng = -78.5, zoom = 7) %>%#49 Localiza o mapa
addPolygons(data = ec1, stroke = FALSE, smoothFactor = 0.5, fillOpacity = 0.7, #50 Agrega poligonos e define opacidades
fillColor = ~ mypal(ec1@data$cantidad),#51 Prence cores do shape de acordo a quantidade
popup = paste("Terr: ", ec1$NAME_1, "
",#52 Pop-up dados de territorio
"Quantidade: ", ec1@data$cantidad, "
")) %>%#53 Pop-up quantidade
addLegend(position = "bottomleft", pal = mypal, values = ec1@data$cantidad,#54 Posicao da legenda, paleta e dados
title = "Quantidade", opacity = 0.7)# 55 Legenda e opacidade
}
if(divter == 't1' && map == "qq")# 56 Se o mapa e solicitado por quartis
{
mypal <- colorQuantile(palette = "viridis", na.color = "#ffffff", domain = ec1@data$cantidad)#57 muda as cores de paleta para calculo com quartis
#58 Usa as mesmas opcoes para os graficos dos outros territorios
map <- leaflet() %>% #58 Apertura ambiente grafico html
addProviderTiles("OpenStreetMap.Mapnik") %>%#59 Apertura open maps
setView(lat = -1.7, lng = -78.5, zoom = 7) %>% #60 Localiza o mapa
addPolygons(data = ec1, stroke = FALSE, smoothFactor = 0.5, fillOpacity = 0.7, #61 Agrega poligonos e define opacidades
fillColor = ~mypal(ec1@data$cantidad), #62 Prence cores do shape de acordo a quantidade
popup = paste("Terr: ", ec1$NAME_1, "
", #63 Pop-up dados de territorio
"Quant: ", ec1@data$cantidad, "
")) %>% #64 Pop-up quantidades
addLegend(position = "bottomleft", pal = mypal, values = ec1@data$cantidad,#65 Posicao da legenda, paleta e dados
title = "Quartis", opacity = 0.7)#66 Lenda e opacidade
}
# F Fazendo mapa para t2
if(divter == 't2')#67 Se e t1 muda o colname para t1
{
colnames(result) <- c("t2","cantidad") #68 muda o nome da coluna para nao confundir
ec2 <- getData("GADM", country = "ecuador", level = 2)#69 baixa o mapa para t2
#70 elimino carateres especiais do resultado t2 para poder fazer match correcto entre dados e mapa
result$t2 <- gsub("á","a", result$t2)
result$t2 <- gsub("é","e", result$t2)
result$t2 <- gsub("í","i", result$t2)
result$t2 <- gsub("ó","o", result$t2)
result$t2 <- gsub("ú","u", result$t2)
#71 elimino carateres especiais do mapa para poder fazer match correcto entre dados e mapa
ec2@data$NAME_2 <- gsub("á","a", ec2@data$NAME_2)
ec2@data$NAME_2 <- gsub("é","e", ec2@data$NAME_2)
ec2@data$NAME_2 <- gsub("í","i", ec2@data$NAME_2)
ec2@data$NAME_2 <- gsub("ó","o", ec2@data$NAME_2)
ec2@data$NAME_2 <- gsub("ú","u", ec2@data$NAME_2)
#72 Comparo o data do mapa com os dos dados e de nao encontrar algum aplicar NA
result <- data.frame(t2 = setdiff(ec2@data$NAME_2, result$t2),
cantidad = NA,
stringsAsFactors = FALSE) %>% bind_rows(result)
#73 Envio cantidades dato para o shape
ec2@data$cantidad <- result$cantidad[match(ec2@data$NAME_2, result$t2)]
ec2 <<- ec2 #74 envia o mapa para o global enviroment
}
if(divter == 't2' && map == "q")#75 Se e mapa solicitado e por quantidade
{
#76 Colores de paleta calculados por numero de animais
mypal <- colorNumeric(palette = "viridis", na.color = "#ffffff", domain = ec2@data$cantidad)
#77 Usa as mesmas opcoes para os graficos dos outros territorios desde #47
map <- leaflet() %>% #78 Apertura ambiente grafico html
addProviderTiles("OpenStreetMap.Mapnik") %>% #79 define proveedor open maps
setView(lat = -1.7, lng = -78.5, zoom = 7) %>% #80 Localiza o mapa
addPolygons(data = ec2, stroke = FALSE, smoothFactor = 0.5, fillOpacity = 0.7, #81 Agrega poligonos e define opacidades
fillColor = ~mypal(ec2@data$cantidad),#82 Prence cores do shape de acordo a quantidade
popup = paste("Terr: ", ec2@data$NAME_2, "
",#83 Pop-up dados de territorio
"Quant: ", ec2@data$cantidad, "
")) %>% #84 Pop-up quantidades
addLegend(position = "bottomleft", pal = mypal, values = ec2@data$cantidad,#85 Posicao da legenda, paleta e dados
title = "Quantidade", opacity = 0.7) #86 Lenda e opacidade
}
if(divter == 't2' && map == "qq") #87 Se o mapa e solicitado por quartis
{
mypal <- colorQuantile(palette = "viridis", na.color = "#ffffff", domain = ec2@data$cantidad) #88 muda os colores de paleta para calculo com quartis
map <- leaflet() %>% #88 Abre ambiente grafico html
addProviderTiles("OpenStreetMap.Mapnik") %>% #89 Apertura open maps
setView(lat = -1.7, lng = -78.5, zoom = 7) %>% #90 Localiza o mapa
addPolygons(data = ec2, stroke = FALSE, smoothFactor = 0.5, fillOpacity = 0.7, #91 Agrega poligonos e define opacidades
fillColor = ~mypal(ec2@data$cantidad), #100 Prence cores do shape de acordo a quantidade
popup = paste("Terr: ", ec2@data$NAME_2, "
", #101 Pop-up dados de territorio
"Quant: ", ec2@data$cantidad, "
")) %>% #102 Pop-up quantidades
addLegend(position = "bottomleft", pal = mypal, values = ec2@data$cantidad,#103 Posicao da legenda, paleta e dados
title = "Quartis", opacity = 0.7) #104 Lenda e opacidade
}
# G Fazendo mapa para t3
if(divter == 't3') #105 Se e t1 muda o colname para t1
{
colnames(result) <- c("t3","cantidad") #106 muda o nome da coluna t3 para nao confundir
ec3 <- getData("GADM", country = "ecuador", level = 3) #107 baixa o mapa para t3
#108 elimino carateres especiais do resultado t3 para poder fazer match correcto entre dados e mapa
result$t3 <- gsub("á","a", result$t3)
result$t3 <- gsub("é","e", result$t3)
result$t3 <- gsub("í","i", result$t3)
result$t3 <- gsub("ó","o", result$t3)
result$t3 <- gsub("ú","u", result$t3)
#109 elimino carateres especiais do mapa para poder fazer match correcto entre dados e mapa
ec3@data$NAME_3 <- gsub("á","a", ec3@data$NAME_3)
ec3@data$NAME_3 <- gsub("é","e", ec3@data$NAME_3)
ec3@data$NAME_3 <- gsub("í","i", ec3@data$NAME_3)
ec3@data$NAME_3 <- gsub("ó","o", ec3@data$NAME_3)
ec3@data$NAME_3 <- gsub("ú","u", ec3@data$NAME_3)
#110 Comparo o data do mapa com os dos dados e de nao encontrar algum aplicar NA
result <- data.frame(t3 = setdiff(ec3@data$NAME_3, result$t3),
cantidad = NA,
stringsAsFactors = FALSE) %>% bind_rows(result)
#111 Envio cantidades dato para o shape
ec3@data$cantidad <- result$cantidad[match(ec3@data$NAME_3, result$t3)]
ec3 <<- ec3#112 envia o mapa para o global enviroment
}
if(divter == 't3' && map == "q")#113 Se e mapa solicitado e por quantidade
{
#114 meus colores de paleta calculados por numero de animais
mypal <- colorNumeric(palette = "viridis", na.color = "#ffffff", domain = ec3@data$cantidad)
map <- leaflet() %>% #115 Apertura ambiente grafico html
addProviderTiles("OpenStreetMap.Mapnik") %>% #116 Apertura open maps
setView(lat = -1.7, lng = -78.5, zoom = 7) %>% #117 Localiza o mapa
addPolygons(data = ec3, stroke = TRUE, weight = 0.3, smoothFactor = 0.5, fillOpacity = 0.4, #118 Agrega poligonos e define opacidades
fillColor = ~mypal(ec3@data$cantidad),#119 Prence cores do shape de acordo a quantidade
popup = paste("Terr: ", ec3@data$NAME_3, "
",#120 Pop-up dados de territorio
"Quant: ", ec3@data$cantidad, "
")) %>%#121 Pop-up quantidades
addLegend(position = "bottomleft", pal = mypal, values = ec3@data$cantidad,#122 Posicao da legenda, paleta e dados
title = "Quantidade", opacity = 0.4) #123 Legenda e opacidad
}
if(divter == 't3' && map == "qq")# 124 Se o mapa e solicitado por quartis
{
mypal <- colorQuantile(palette = "viridis", na.color = "#ffffff", domain = ec3@data$cantidad)#125 muda os colores de paleta para calculo com quartis
map <- leaflet() %>% #126 Apertura ambiente grafico html
addProviderTiles("OpenStreetMap.Mapnik") %>% #127 Apertura open maps
setView(lat = -1.7, lng = -78.5, zoom = 7) %>% #128 Localiza o mapa
addPolygons(data = ec3, stroke = TRUE, weight = 0.3, smoothFactor = 0.5, fillOpacity = 0.4, #129 Agrega poligonos e define opacidades
fillColor = ~mypal(ec3@data$cantidad), #130 Prence cores do shape de acordo a quantidade
popup = paste("Terr: ", ec3@data$NAME_3, "
", #131 Pop-up dados de territorio
"Quant: ", ec3@data$cantidad, "
")) %>% #132 Pop-up quantidades
addLegend(position = "bottomleft", pal = mypal, values = ec3@data$cantidad,#133 Posicao da legenda, paleta e dados
title = "Quartis", opacity = 0.4) #134 Lenda e opacidade
}
#G Mostra dados no console
cat("mov (1) -- Os territorios sem valores numericos (NA's) sao:") #135 Etiqueta
cat("\n") #136 line break
print(result[is.na(result$cantidad), ]) #137 Mostra dados do #135
result <<- result #138 Envia para o global enviroment os valores calculados
print(map)#139 Mostra o mapa na janela grafica
t1f <- Sys.time() #140 Registra o tempo final da corrida da funcao
tt1 <- t1f - t1i #141 Diferenca de tempos entre inicial e final
cat("\n") #142 line break
cat("mov (2) -- O tempo total utilizado na analise foi: ") #143 Etiqueta
print(round(tt1,1)) #144 Mostra no console, tempo utilizado na corrida da funcao
cat("\n") #144 line break
cat("mov (3) -- Presione nos territorios do mapa para saber os valores numericos.") #145 Etiqueta
cat("\n")#146 line break
cat("mov (4) -- Um arquivo (txt), imagem (png) e um site (html) foram salvos na pasta de trabalho com mais informacoes") #147 Etiqueta
cat("\n") #148 line break
cat("mov (5) -- Obrigado por usar mov() !! ") #149 Etiqueta
cat("\n") #150 line break
#H Exporta mapa como png
saveWidget(map, "mov_mapa.html", selfcontained = FALSE) #150 Cria um temp html para salvar uma imagem
webshot::webshot("mov_mapa.html","mov_mapa.png", zoom = 2)#151 Salva a imagem como png
# I Exporta arquivo txt com resumo dos analises
sink("mov_dados.txt") #152 funcao para escrever texto
cat("RESUMO ANALISE DE MOVIMENTACAO ANIMAL")#153 Etiqueta
cat("\n") #154 line break
cat("\n")#155 line break
cat("\n") #156 line break
cat("RESUMO DO BANCO CONFERIDO") # 157 Etiqueta
cat("\n")# 158 line break
cat("Data do primeiro registro encontrado: ") #159 etiqueta
range <- summary(m$`Fecha Inicio Vigencia`) #160 Resumen de datas do arquivo
class(range) <-class(m$`Fecha Inicio Vigencia`) #161 asigno a mesma clase do df para que se mostre como data (POSIXct)
print(range[1]) #162 Mostro a data menor
cat("\n")# 163 line break
cat("Data do ultimo registro encontrado: ") #164 Etiqueta
print(range[6]) #165 Mostro a date maior
cat("\n") #166 line break
cat("Faixa de atestados analizados: ") #167 Etiqueta
print(round(range[6]-range[1]),2) #168 Tempo de diferenca entre atestados registrados
cat("\n") #169 line break
cat("Numero de atestados analizados: ") #170 Etiqueta
print(length(m$`Número Certificado`))#171 Quantidade de GTA analizadas
cat("\n")#172 line break
cat("Numero de animais movimentados: ") #173 Etiqueta
print(sum(m$Cantidad)) #174 Quantidade de animais movilizados
cat("\n") #175 line break
cat('Media de animais por atestado: ') #176 Etiqueta
round(sum(m$Cantidad)/length(m$`Número Certificado`),0)#177 Promedio animais por atestado
cat("\n")#178 line break
print("Resumo do numero de animais movimentados: ") #179 Etiqueta
summary(m$Cantidad) #180 Resumo do numero de animais movilizados
cat("\n")#181 line break
cat("\n")#182 line break
cat("RESUMO DOS RESULTADOS") #183 Etiqueta
cat("\n")#184 line break
cat("Resumo das quantidades movimentadas por territorios (NA's=territorios sem informacao): ")
cat("\n") #185 line break
print(summary(result$cantidad)) #186 resultados
cat("\n")#187 line break
cat("\n")#188 line break
cat("\n")#189 line break
cat("Data de execucao do analisis:") #190
print(t1f <- Sys.time()) #191 Registra o tempo final da corrida da funcao
cat("\n")#192 line break
cat("\n")#193 line break
cat("\n")#194 line break
cat("Nome dos territorios sem informacao") #195 etiqueta
print(result[is.na(result$cantidad), ]) #196 Territorios sem informacoes
cat("\n")#197 line break
cat("Territorios ordenados com informacao") #198 etiqueta
print(count(result[!is.na(result$cantidad), ]))# 199 Imprime os que nao sao NA
print(result[order(result$cantidad,decreasing=TRUE), ]) #200 Territorios ordenados por seu numero de animais
cat("\n")#201 line break
sink() #202 fecha dispositivo
} #203 fim da funcao
mov("arquivo.xlsx",divter="t1",dir="d",tipo = "l", map = "qq")
----
----
====== Help ======
mov package:unknown R Documentation
Mapa dinâmico de movimentação animal
-Description
Esta função gera caraterização espacial dos animais e lotes de animais movimentados em
origem ou destino. A função traça o movimento de animais de produção em tres escalas
espaciais territoriais, fornecendo uma visualização HTML dinâmica e interativa dos
registros de movimentação no nivel nacional e local.
-Usage
function(arquivo,divter,dir,tipo,map)
-Arguments
x Nome do arquivo em formato xlsx, contendo os registros a serem analizados em
9 colunas.
divter Um caracter indicando a divisão territorial na cual sera plotados os dados.
"t1", "t2" ou "t3". Sendo as divisões territoriais dos países em geral nesta
ordem de maior a menor.
dir Um caracter indicando ao mapa a forma de representar a direção da movimentação.
Sendo "o" origem ou "d" para destino.
tipo Um caracter indicando se seram plotados o numero de atestados ou lotes de animais
ou os animais contidos neses lotes. Sendo "a" animais e "l" para lotes.
map Um caracter indicando o de representação por quantidade ou por quartis. Sendo "q"
para quantidade ou "qq" para quartis.
-Detais
O arquivo fornecido deve ser .xlsx e ter 9 colunas: código único, territorio origem 1,
territorio origem 2, territorio origem 3, territorio destino 1, territorio destino 2,
territorio destino 3, quantidade e data.
colnames exemplo ex(cod,ot1, ot2, ot3, dt1, dt2, dt3, num, data).
Os mapas utilizados são disponibilizados pela GADM Database of Global Administrative Areas,
[[www.gadm.org/]], usando os 3 niveis gerais correspondentes com t1, t2 e t3.
-Value
Mapa Web iterativo
Reporte txt con resumo do análise total de atestados, animais, lotes, media de animais por
atestado e media de animais e lotes por atestado por unidade territorial, se indicam os
territorios sem informação.
Arquivo de imagem png do mapa.
-Author(s)
Alfredo Acosta alfredoacosta@usp.br
-Examples:
mov(x,divter="t1",dir="d",tipo = "l", map = "q")
mov(x,divter="t2",dir="o",tipo = "a", map = "qq")
{{:bie5782:01_curso_atual:alunos:trabalho_final:alfredoacosta:banco_de_dados.rar|}}