
Ola, A alguns anos ja o google mudou a API de georeferenciamento. Antigamente tinhamos o codigo de acuracia. Na nova API nao ha mais. Alem disso nao ha mais o formato csv como output (meu preferido por ser mais simples). A nova API oferece output em formato xml e json. Usei a funcao pronta para essa nova API ggmap:::georef para georeferenciar uma lista de 9183 CEPs em Curitiba. Estou usando isso para analisar dados de internacoes hospitalares. Dados individuais de internacoes hospitalares via SUS estao disponiveis no DATASUS (desde 1994). Gostaria de compartilhar essa lista em http://leg.ufpr.br/~elias/tmp/cep_curitiba_cwb_georef_longlat.txt com dois objetivos: 1) para quem tiver interesse em usar 2) convidar quem trabalha com isso ao nivel profissional a checar se ha' erros Alguem ja teve experiencia com a lista do CNEFE? Se alguem tiver interesse em georeferenciar aprox. meio milhao de enderecos do CNEFE para Curitiba, poderiamos fazer isso em equipe, pois para usuario comum e' permitido apenas 2500 por dia/IP. (sozinho eu demoraria aprox. um mes, usando meia duzia de maquinas...) Elias. -- In God we trust, all others bring data. – William Edwards Deming (1900-1993)

Elias, boa tarde! Fiz uns testes com o georreferenciamento por cep, usando ggmap::geocode(). Na verdade, dá pra fazer uma avaliação da acurácia pelos campos type e loctype retornados quando se utiliza a opção "output=more". Pelo que pude entender, endereços "precisos/acurados" são retornados com a indicação "street_address" em type e as demais formas são aproximações. No entanto, códigos "postal_code" são melhores que "postal_code_prefix". ### <code r> require("ggmap") # geocodeQueryCheck() adr1 <- c('Rua Toshinobo Katayama, 178, Dourados, MS, Brazil, 79806-030', ### endereço completo 'Rua Toshinobo Katayama, 171, Dourados, MS', ### endereço completo 'Dourados, MS, 79806-029', ### não cadastrado, prefixo válido 'Dourados, MS, 79899-333', ### cep inexistente 'Dourados, MS, 79806', ### apenas prefixo 'Dourados, MS, 79806030', ### cep correto 'Dourados, MS, 79823460', ### cep correto 'Dourados, MS, 79804970') ### cep correto, zona rural res1 <- geocode(adr1, output="more") res1[c(1:4, 10)] # lon lat type loctype postal_code # 1 -54.80372 -22.23004 street_address rooftop <NA> # 2 -54.80460 -22.22413 street_address range_interpolated <NA> # 3 -54.80027 -22.22395 postal_code_prefix approximate <NA> # 4 -54.79138 -22.22623 bus_station approximate <NA> # 5 -54.80027 -22.22395 postal_code_prefix approximate <NA> # 6 -54.80409 -22.22820 postal_code approximate 79806-030 # 7 -54.83732 -22.21741 postal_code approximate 79823-460 # 8 -54.80988 -22.21471 postal_code_prefix approximate <NA> ### </code> Testando apenas os primeiros 30 ceps do arquivo que você disponibilizou... ### <code r> url0 <- "http://leg.ufpr.br/~elias/tmp/cep_curitiba_cwb_georef_longlat.txt" tmp0 <- read.table(url0, head=T, nrows=30) adr2 <- paste0("Curitiba, PR, Brazil, ", tmp0[,1]) res2 <- geocode(adr2, output="more") cbind(tmp0, res2[c(1:4,10)]) table(res2$type) # route postal_code_prefix postal_code # 2 14 14 ### </code> Nesse pequeno teste, 16 consultas retornaram resultados muito imprecisos ( route , postal_code_prefix) e os demais são poucos precisos (postal_code). Desse modo, acredito que não há grande vantagem em consultar todos os ceps e o número de consultas poderia ser diminuído consideravelmente se eles fossem 'generalizados" . A opção mais radical seria fazer a consulta pelos prefixos (primeiros 5 dígitos) e outras mais brandas seriam algo do tipo: df <- read.table(url0, head=T, nrows=1000) df$cep2 <- round(df$cep/100)*100 un <- unique(df$cep2); length(un) # 135 Nesse caso seriam 135 consultas ao invés das 1000 iniciais, o que facilitaria bem a tarefa. Logicamente, haveria uma perda ainda maior de precisão/acurácia. Resta saber se a perda é tolerável/aceitável. A descrição dos códigos está em < https://developers.google.com/maps/documentation/geocoding/?csw=1>. Éder Comunello <c <comunello.eder@gmail.com>omunello.eder@gmail.com> Dourados, MS - [22 16.5'S, 54 49'W]

Oi Éder, Eu havia ignorado essa opção "output=more"... Não cheguei a ver quantos níveis de acurácia há agora. Você sabe: Na antiga eram oito: c("País", "U. F.", "Município", "Cidade", "CEP", "Rua", "Cruzamento", "Endereço") Quando você fala em considerar apenas os primeiros dígitos, é possível ver que isso diminui a acurácia apenas notando que dos 9183 CEPs georeferenciados temos 6414 coordenadas únicas. Não sei o que essas quase três mil repetições são... Tentando a sua sugestão (usar primeiros 5 digitos), obtemos apenas dois endereços com os 30 primeiros CEPs, enquanto que com os 8 dígitos temos 16 coordenadas diferentes. Mas isso é porque esses CEPs estão ordenados, e os CEPs iniciando 80010 estão no início e vários deles apontam para a central de distribuição dos correios. Ou seja, quanto aos dados públicos do DATASUS, ao nível de CEP, não dá para fazer mais que isso... Os dados completos, com nome de logradouro e número não são públicos, são mais informativos. Falando sobre o georeferenciamento de todos os endereços de Curitiba, os meio milhão de endereços são referentes a cada domicílio. Como muitos estão em condomínios, pode-se conseguir uma drástica redução. Além disso, uma coisa que pode-se levar em conta é que os números das ruas de Curitiba são e metros a partir do início da rua e se é a direita ou esquerda da rua. O número 310 indica um endereço 310 metros a partir do incício da rua à direita enquanto que 311 indica à esquerda. Geralmente a ruas "nascem" do centro e vão para os extremos. Um algoritmo pensando nessa estrutura pode ajudar a diminuir também o número de consultas. Elias On 04/05/15 21:53, Éder Comunello wrote:
Elias, boa tarde!
Fiz uns testes com o georreferenciamento por cep, usando ggmap::geocode(). Na verdade, dá pra fazer uma avaliação da acurácia pelos campos type e loctype retornados quando se utiliza a opção "output=more". Pelo que pude entender, endereços "precisos/acurados" são retornados com a indicação "street_address" em type e as demais formas são aproximações. No entanto, códigos "postal_code" são melhores que "postal_code_prefix".
### <code r> require("ggmap") # geocodeQueryCheck() adr1 <- c('Rua Toshinobo Katayama, 178, Dourados, MS, Brazil, 79806-030', ### endereço completo 'Rua Toshinobo Katayama, 171, Dourados, MS', ### endereço completo 'Dourados, MS, 79806-029', ### não cadastrado, prefixo válido 'Dourados, MS, 79899-333', ### cep inexistente 'Dourados, MS, 79806', ### apenas prefixo 'Dourados, MS, 79806030', ### cep correto 'Dourados, MS, 79823460', ### cep correto 'Dourados, MS, 79804970') ### cep correto, zona rural
res1 <- geocode(adr1, output="more") res1[c(1:4, 10)] # lon lat type loctype postal_code # 1 -54.80372 -22.23004 street_address rooftop <NA> # 2 -54.80460 -22.22413 street_address range_interpolated <NA> # 3 -54.80027 -22.22395 postal_code_prefix approximate <NA> # 4 -54.79138 -22.22623 bus_station approximate <NA> # 5 -54.80027 -22.22395 postal_code_prefix approximate <NA> # 6 -54.80409 -22.22820 postal_code approximate 79806-030 # 7 -54.83732 -22.21741 postal_code approximate 79823-460 # 8 -54.80988 -22.21471 postal_code_prefix approximate <NA> ### </code>
Testando apenas os primeiros 30 ceps do arquivo que você disponibilizou...
### <code r> url0 <- "http://leg.ufpr.br/~elias/tmp/cep_curitiba_cwb_georef_longlat.txt <http://leg.ufpr.br/%7Eelias/tmp/cep_curitiba_cwb_georef_longlat.txt>" tmp0 <- read.table(url0, head=T, nrows=30) adr2 <- paste0("Curitiba, PR, Brazil, ", tmp0[,1])
res2 <- geocode(adr2, output="more") cbind(tmp0, res2[c(1:4,10)]) table(res2$type) # route postal_code_prefix postal_code # 2 14 14 ### </code>
Nesse pequeno teste, 16 consultas retornaram resultados muito imprecisos (route , postal_code_prefix) e os demais são poucos precisos (postal_code).
Desse modo, acredito que não há grande vantagem em consultar todos os ceps e o número de consultas poderia ser diminuído consideravelmente se eles fossem 'generalizados" . A opção mais radical seria fazer a consulta pelos prefixos (primeiros 5 dígitos) e outras mais brandas seriam algo do tipo:
df <- read.table(url0, head=T, nrows=1000) df$cep2 <- round(df$cep/100)*100 un <- unique(df$cep2); length(un) # 135
Nesse caso seriam 135 consultas ao invés das 1000 iniciais, o que facilitaria bem a tarefa. Logicamente, haveria uma perda ainda maior de precisão/acurácia. Resta saber se a perda é tolerável/aceitável.
A descrição dos códigos está em <https://developers.google.com/maps/documentation/geocoding/?csw=1>.
-- In God we trust, all others bring data. – William Edwards Deming (1900-1993)

Elias, bom dia! Fiz mais um exercício pra tentar medir o impacto da "simplificação" dos ceps... O primeiro fato que percebo é que a consulta por cep, mesmo completo, é pouco precisa/acurada. A busca por logradouro é possível, mas talvez complicada pra implementar nessas bases... Se você tiver paciência de seguir o código abaixo, o que eu queria mostrar é que quando você trunca o cep, zerando o último dígito, 99% dos valores retornados vão diferir até 2 km da consulta original, mas economizam 22% de consultas ao geocode(). Zerando os dois últimos dígitos, 97% dos dados variam até 2 km, mas economiza 90% das consultas. E essa variação não é necessariamente erro, porque não temos as coordenadas "reais" pra avaliar... No código eu não reconsultei os valores, mas tentei aproveitar sua base. Daí a presença dos NA's... ### <code r> url0 <- "http://leg.ufpr.br/~elias/tmp/cep_curitiba_cwb_georef_longlat.txt" df0 <- read.table(url0, head=T) head(df0) length(unique(df0$cep)) # 9183 ceps length(unique(paste(df0$long, df0$lat))) # 6414 pares de coordenadas distintas ### Truncando "xxxxx-xxx" para "xxxxx-xx0" ### Desconsiderando o último dígito do cep df1 <- df0 df1$cep2=trunc(df0$cep/10)*10 head(df1) length(unique(df1$cep2)) # 7135 ceps (-2048 ou -22%) ### Pra não gastar minhas 2500 consultas :D, vou usar os dados já consultados! df2 <- merge(df1, df0, all.x=T, sort=F, by.x="cep2", by.y="cep") head(df2) sum(complete.cases(df2)) # 9071! Com a consulta de geocode, provavelmente todos retornariam valor ### Valor aproximado de 1 grau dessa área (em km) require(sp) spDistsN1(matrix(c(-49,-50, -25,-26),2,2), matrix(c(-50,-25),1,2), longlat=TRUE) df2$dist <- sqrt((df2[,3]-df2[,5])^2+(df2[,4]-df2[,6])^2)*105 ### distância aproximada em km! hist(df2$dist) range(df2$dist, na.rm=T) table(cut(df2$dist, breaks=c(-1:5,20))) # (-1,0] (0,1] (1,2] (2,3] (3,4] (4,5] (5,20] # 7528 1132 362 24 2 0 23 sum(table(cut(df2$dist, breaks=c(-1:5,20)))[1:3]) ### 99% dos dados (9022/9071) diferem até 2 km em relação a consulta original sum(df2$dist>5, na.rm=T) ### 23 valores bem imprecisos df2[which(df2$dist>5),] ### Onde estão ocorrendo problemas? require(ggmap) adr <- paste0("Curitiba, PR, Brazil, ", df2[which(df2$dist>5),2]) res <- geocode(adr, output="more") res[c(1:4,10)] cbind(df2[which(df2$dist>5),1:4],res[1:6]) ### boa parte dos problemas referem-se aos ceps da cidade industrial ### você pode filtrar esses ceps e tratá-los diferenciados ### Truncando "xxxxx-xxx" para "xxxxx-x00" df10 <- df0 df10$cep2=trunc(df0$cep/100)*100 head(df10) length(unique(df10$cep2)) # 941 ceps (-8242 ou -90%) df20 <- merge(df10, df0, all.x=T, sort=F, by.x="cep2", by.y="cep") head(df20) sum(complete.cases(df20)) # 8312! Com a consulta de geocode, provavelmente todos retornariam valor df20$dist <- sqrt((df20[,3]-df20[,5])^2+(df20[,4]-df20[,6])^2)*105 ### distância aproximada em km! hist(df20$dist) range(df20$dist, na.rm=T) table(cut(df20$dist, breaks=c(-1:5,20))) # (-1,0] (0,1] (1,2] (2,3] (3,4] (4,5] (5,20] # 1647 5403 1050 131 17 6 58 sum(table(cut(df20$dist, breaks=c(-1:5,20)))[1:3]) ### 97% dos dados (8100/8312) diferem até 2 km em relação a consulta completa sum(df20$dist>5, na.rm=T) ### 23 valores bem imprecisos df20[which(df20$dist>5),] ### Onde estão ocorrendo problemas? require(ggmap) adr1 <- paste0("Curitiba, PR, Brazil, ", df20[which(df20$dist>5),2]) res1 <- geocode(adr1, output="more") res1[c(1:4,10)] cbind(df20[which(df20$dist>5),1:4],res1[1:6]) ### aumentam as localidades com problema, mas acho que ainda assim dá pra contornar ### </code> Éder Comunello <c <comunello.eder@gmail.com>omunello.eder@gmail.com> Dourados, MS - [22 16.5'S, 54 49'W]

Olá pessoal.. Uma API que me ajudou bastante quando é necessário certo grau de precisão e muitas consultas é o serviço dessa equipe : https://www.geocode.farm/ Uma das modalidades de consulta é paga mas nada exorbitante. Grande abraço. Pedro Em 05/05/2015 10:00, "Éder Comunello" <comunello.eder@gmail.com> escreveu:
Elias, bom dia!
Fiz mais um exercício pra tentar medir o impacto da "simplificação" dos ceps...
O primeiro fato que percebo é que a consulta por cep, mesmo completo, é pouco precisa/acurada. A busca por logradouro é possível, mas talvez complicada pra implementar nessas bases...
Se você tiver paciência de seguir o código abaixo, o que eu queria mostrar é que quando você trunca o cep, zerando o último dígito, 99% dos valores retornados vão diferir até 2 km da consulta original, mas economizam 22% de consultas ao geocode().
Zerando os dois últimos dígitos, 97% dos dados variam até 2 km, mas economiza 90% das consultas.
E essa variação não é necessariamente erro, porque não temos as coordenadas "reais" pra avaliar...
No código eu não reconsultei os valores, mas tentei aproveitar sua base. Daí a presença dos NA's...
### <code r> url0 <- "http://leg.ufpr.br/~elias/tmp/cep_curitiba_cwb_georef_longlat.txt " df0 <- read.table(url0, head=T) head(df0) length(unique(df0$cep)) # 9183 ceps length(unique(paste(df0$long, df0$lat))) # 6414 pares de coordenadas distintas
### Truncando "xxxxx-xxx" para "xxxxx-xx0" ### Desconsiderando o último dígito do cep df1 <- df0 df1$cep2=trunc(df0$cep/10)*10 head(df1) length(unique(df1$cep2)) # 7135 ceps (-2048 ou -22%)
### Pra não gastar minhas 2500 consultas :D, vou usar os dados já consultados! df2 <- merge(df1, df0, all.x=T, sort=F, by.x="cep2", by.y="cep") head(df2) sum(complete.cases(df2)) # 9071! Com a consulta de geocode, provavelmente todos retornariam valor
### Valor aproximado de 1 grau dessa área (em km) require(sp) spDistsN1(matrix(c(-49,-50, -25,-26),2,2), matrix(c(-50,-25),1,2), longlat=TRUE)
df2$dist <- sqrt((df2[,3]-df2[,5])^2+(df2[,4]-df2[,6])^2)*105 ### distância aproximada em km! hist(df2$dist) range(df2$dist, na.rm=T) table(cut(df2$dist, breaks=c(-1:5,20))) # (-1,0] (0,1] (1,2] (2,3] (3,4] (4,5] (5,20] # 7528 1132 362 24 2 0 23
sum(table(cut(df2$dist, breaks=c(-1:5,20)))[1:3]) ### 99% dos dados (9022/9071) diferem até 2 km em relação a consulta original
sum(df2$dist>5, na.rm=T) ### 23 valores bem imprecisos df2[which(df2$dist>5),]
### Onde estão ocorrendo problemas? require(ggmap) adr <- paste0("Curitiba, PR, Brazil, ", df2[which(df2$dist>5),2]) res <- geocode(adr, output="more") res[c(1:4,10)]
cbind(df2[which(df2$dist>5),1:4],res[1:6]) ### boa parte dos problemas referem-se aos ceps da cidade industrial ### você pode filtrar esses ceps e tratá-los diferenciados
### Truncando "xxxxx-xxx" para "xxxxx-x00" df10 <- df0 df10$cep2=trunc(df0$cep/100)*100 head(df10) length(unique(df10$cep2)) # 941 ceps (-8242 ou -90%)
df20 <- merge(df10, df0, all.x=T, sort=F, by.x="cep2", by.y="cep") head(df20) sum(complete.cases(df20)) # 8312! Com a consulta de geocode, provavelmente todos retornariam valor
df20$dist <- sqrt((df20[,3]-df20[,5])^2+(df20[,4]-df20[,6])^2)*105 ### distância aproximada em km! hist(df20$dist) range(df20$dist, na.rm=T) table(cut(df20$dist, breaks=c(-1:5,20))) # (-1,0] (0,1] (1,2] (2,3] (3,4] (4,5] (5,20] # 1647 5403 1050 131 17 6 58
sum(table(cut(df20$dist, breaks=c(-1:5,20)))[1:3]) ### 97% dos dados (8100/8312) diferem até 2 km em relação a consulta completa
sum(df20$dist>5, na.rm=T) ### 23 valores bem imprecisos df20[which(df20$dist>5),]
### Onde estão ocorrendo problemas? require(ggmap) adr1 <- paste0("Curitiba, PR, Brazil, ", df20[which(df20$dist>5),2]) res1 <- geocode(adr1, output="more") res1[c(1:4,10)]
cbind(df20[which(df20$dist>5),1:4],res1[1:6]) ### aumentam as localidades com problema, mas acho que ainda assim dá pra contornar ### </code>
Éder Comunello <c <comunello.eder@gmail.com>omunello.eder@gmail.com> Dourados, MS - [22 16.5'S, 54 49'W]
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

wow! Achei muito legal o que voce descobriu! Isso com certeza sera' util em caso de haver base maior de CEPs. Como sabiamos, CEP e' menos preciso que logradouro+numero. Mas agora temos tambem conhecimento do nivel de precisao de raiz do CEP. Elias On 05/05/15 15:00, Éder Comunello wrote:
Elias, bom dia!
Fiz mais um exercício pra tentar medir o impacto da "simplificação" dos ceps...
O primeiro fato que percebo é que a consulta por cep, mesmo completo, é pouco precisa/acurada. A busca por logradouro é possível, mas talvez complicada pra implementar nessas bases...
Se você tiver paciência de seguir o código abaixo, o que eu queria mostrar é que quando você trunca o cep, zerando o último dígito, 99% dos valores retornados vão diferir até 2 km da consulta original, mas economizam 22% de consultas ao geocode().
Zerando os dois últimos dígitos, 97% dos dados variam até 2 km, mas economiza 90% das consultas.
E essa variação não é necessariamente erro, porque não temos as coordenadas "reais" pra avaliar...
No código eu não reconsultei os valores, mas tentei aproveitar sua base. Daí a presença dos NA's...
### <code r> url0 <- "http://leg.ufpr.br/~elias/tmp/cep_curitiba_cwb_georef_longlat.txt <http://leg.ufpr.br/%7Eelias/tmp/cep_curitiba_cwb_georef_longlat.txt>" df0 <- read.table(url0, head=T) head(df0) length(unique(df0$cep)) # 9183 ceps length(unique(paste(df0$long, df0$lat))) # 6414 pares de coordenadas distintas
### Truncando "xxxxx-xxx" para "xxxxx-xx0" ### Desconsiderando o último dígito do cep df1 <- df0 df1$cep2=trunc(df0$cep/10)*10 head(df1) length(unique(df1$cep2)) # 7135 ceps (-2048 ou -22%)
### Pra não gastar minhas 2500 consultas :D, vou usar os dados já consultados! df2 <- merge(df1, df0, all.x=T, sort=F, by.x="cep2", by.y="cep") head(df2) sum(complete.cases(df2)) # 9071! Com a consulta de geocode, provavelmente todos retornariam valor
### Valor aproximado de 1 grau dessa área (em km) require(sp) spDistsN1(matrix(c(-49,-50, -25,-26),2,2), matrix(c(-50,-25),1,2), longlat=TRUE)
df2$dist <- sqrt((df2[,3]-df2[,5])^2+(df2[,4]-df2[,6])^2)*105 ### distância aproximada em km! hist(df2$dist) range(df2$dist, na.rm=T) table(cut(df2$dist, breaks=c(-1:5,20))) # (-1,0] (0,1] (1,2] (2,3] (3,4] (4,5] (5,20] # 7528 1132 362 24 2 0 23
sum(table(cut(df2$dist, breaks=c(-1:5,20)))[1:3]) ### 99% dos dados (9022/9071) diferem até 2 km em relação a consulta original
sum(df2$dist>5, na.rm=T) ### 23 valores bem imprecisos df2[which(df2$dist>5),]
### Onde estão ocorrendo problemas? require(ggmap) adr <- paste0("Curitiba, PR, Brazil, ", df2[which(df2$dist>5),2]) res <- geocode(adr, output="more") res[c(1:4,10)]
cbind(df2[which(df2$dist>5),1:4],res[1:6]) ### boa parte dos problemas referem-se aos ceps da cidade industrial ### você pode filtrar esses ceps e tratá-los diferenciados
### Truncando "xxxxx-xxx" para "xxxxx-x00" df10 <- df0 df10$cep2=trunc(df0$cep/100)*100 head(df10) length(unique(df10$cep2)) # 941 ceps (-8242 ou -90%)
df20 <- merge(df10, df0, all.x=T, sort=F, by.x="cep2", by.y="cep") head(df20) sum(complete.cases(df20)) # 8312! Com a consulta de geocode, provavelmente todos retornariam valor
df20$dist <- sqrt((df20[,3]-df20[,5])^2+(df20[,4]-df20[,6])^2)*105 ### distância aproximada em km! hist(df20$dist) range(df20$dist, na.rm=T) table(cut(df20$dist, breaks=c(-1:5,20))) # (-1,0] (0,1] (1,2] (2,3] (3,4] (4,5] (5,20] # 1647 5403 1050 131 17 6 58
sum(table(cut(df20$dist, breaks=c(-1:5,20)))[1:3]) ### 97% dos dados (8100/8312) diferem até 2 km em relação a consulta completa
sum(df20$dist>5, na.rm=T) ### 23 valores bem imprecisos df20[which(df20$dist>5),]
### Onde estão ocorrendo problemas? require(ggmap) adr1 <- paste0("Curitiba, PR, Brazil, ", df20[which(df20$dist>5),2]) res1 <- geocode(adr1, output="more") res1[c(1:4,10)]
cbind(df20[which(df20$dist>5),1:4],res1[1:6]) ### aumentam as localidades com problema, mas acho que ainda assim dá pra contornar ### </code>
Éder Comunello <c <mailto:comunello.eder@gmail.com>omunello.eder@gmail.com <mailto:omunello.eder@gmail.com>> Dourados, MS - [22 16.5'S, 54 49'W]
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
-- In God we trust, all others bring data. – William Edwards Deming (1900-1993)
participantes (3)
-
Elias T. Krainski
-
Pedro Albuquerque
-
Éder Comunello