[R-br] obtenção de lat long para uma série de CEPs

Augusto Ribas ribas.aca em gmail.com
Quarta Outubro 3 17:04:52 BRT 2012


Acho que a pior forma de fazer isso é com um loop de for()

require(XML)

coordenadas<- function(cep) {
 url_lat_lon <-
paste(sprintf("http://maps.google.com/maps/api/geocode/xml?address=%s,",
cep),"%20Brasil&sensor=false", sep="")
 lat_lon=xmlApply(xmlRoot(xmlTreeParse(
readLines(url_lat_lon)))[['result']][['geometry']][['location']],
"[[", 1)
 return(lat_lon)
 }

cep=40110010
coordenadas(cep)


ceps<-c(40110010,01317000,17120000)


resultado<-data.frame(cep=NA,lat=NA,long=NA)

for(i in 1:length(ceps)) {
  resposta<-coordenadas(ceps[i])
  resultado[i,"cep"]<-as.numeric(ceps[i])
  resultado[i,"lat"]<-as.character(resposta[[1]])[6]
  resultado[i,"long"]<-as.character(resposta[[2]])[6]
  }

resultado

       cep         lat        long
1 40110010 -12.9896162 -38.4922117
2  1317000 -25.2912987 -57.6265412
3 17120000 -22.5229044 -49.1344326

Da pra fazer a mesma coisa com alguma função da familia apply
Mas no final das contas vai ser um acesso por cep, o que vai deixar a
obtenção de muitos ceps lento.
Mas enquanto ninguem posta uma solução melhor, da pra quebrar o galho com essa

Em 3 de outubro de 2012 15:04, Mauricio Cardeal
<mcardeal2010 em gmail.com> escreveu:
> Recentemente foi postado na lista uma solução para a obtenção de lat long a
> partir de um cep:
>
> require(XML)
>
> coordenadas<- function(cep) {
>  url_lat_lon <-
> paste(sprintf("http://maps.google.com/maps/api/geocode/xml?address=%s,",
> cep),"%20Brasil&sensor=false", sep="")
>  lat_lon=xmlApply(xmlRoot(xmlTreeParse(
> readLines(url_lat_lon)))[['result']][['geometry']][['location']], "[[", 1)
>  return(lat_lon)
>  }
>
> cep=40110010
> coordenadas(cep)
>
>> coordenadas(cep)
> $lat
> -12.9896162
>
> $lng
> -38.4922117
>
> Ficou excelente. Mas fiquei imaginando se ao invés de apenas 1 cep eu
> tivesse uma série, por exemplo:
>
> ceps <- c(40110010,01317000,17120000)
>
> Como modificaria a função acima rotina para ter algo do tipo (em um data
> frame), sem precisar rodar 1 a 1 cada cep:
>
> cep             lat        long
> 40110010  -12.98    -38.49
> 01317000  -25.29    -57.62
> 17120000  -22.52    -49.13
>
> Valeu
> --
> Mauricio Cardeal
> UFBA
>
>
> _______________________________________________
> R-br mailing list
> R-br em 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.



-- 
Grato
Augusto C. A. Ribas

Site Pessoal: http://augustoribas.heliohost.org
Lattes: http://lattes.cnpq.br/7355685961127056


Mais detalhes sobre a lista de discussão R-br