Recentemente precisei utilizar coordenadas geogrĂ¡ficas em uma apresentaĂ§Ă£o de resultados. Tinha lido algumas coisas sobre bibliotecas no R que utilizavam o Google Maps, entĂ£o decidi pesquisar mais o assunto. Este documento Ă© apenas um exemplo do que pode ser feito, utilizei basicamente a biblioteca RgoogleMaps, mas possuem outras alternativas de utilizaĂ§Ă£o acessando diretamente a API do Google, mas em 90% dos casos, isto nĂ£o Ă© necessĂ¡rio. Antes de mais nada, devemos criar alguns dados artificiais para brincar.
cidades <- c("Belo Horizonte MG","Contagem MG", "Juiz de Fora MG",
"Uberlandia MG", "Montes Claros MG", "Uberaba MG",
"Varginha MG", "Governador Valadares MG", "Salto da Divisa MG",
"Para de Minas MG", "Bom Despacho MG", "Manhuacu MG",
"Rio Casca MG", "Tres Coracoes MG", "Tres Pontas MG",
"Sao Sebastiao do Paraiso MG", "Iturama MG", "Joaima MG",
"Vicosa MG", "Montalvania MG", "Frutal MG", "Ipatinga MG",
"Aimores MG", "Muriae MG", "Januaria MG")
DF <- data.frame(cidade=cidades, lat=NA, lon=NA)
Ao longo deste exemplo, iremos carregar as bibliotecas tĂ£o logo sejam requeridas. Para localizar as coordenadas (geoCode) atravĂ©s de um endereço, existe a funĂ§Ă£o getGeoCode()
require(RgoogleMaps)
## Loading required package: RgoogleMaps
getGeoCode("Belo Horizonte, Minas Gerais, Brazil")
## lat lon
## -19.92 -43.94
o que, para o exemplo acima, retorna as coordenadas aproximadas do municĂpio de Belo Horizonte, em Minas Gerais, provavelmente por interpolaĂ§Ă£o. O interessante desta rotina Ă© que ela parece ter alguns problemas com palavras acentuadas, reparem o que acontece quando aciono a funĂ§Ă£o para a cidade de UberlĂ¢ndia - MG:
getGeoCode("UberlĂ¢ndia MG")
## lat lon
## NA NA
Mas se eu busco pela palavra sem o acento, a funĂ§Ă£o me retorna o valor correto:
getGeoCode("Uberlandia MG")
## lat lon
## -18.91 -48.28
JĂ¡ a questĂ£o de fazer a pesquisa para mais de um municĂpio pode ser tratada pelo R de uma maneira igualmente simples, sem a adoĂ§Ă£o de loops:
DF <- with(DF,data.frame(cidade=cidade, t(sapply(DF$cidade, getGeoCode))))
knitr::kable(DF, format="markdown", digits=4)
##
##
## |cidade | lat| lon|
## |:---------------------------|------:|------:|
## |Belo Horizonte MG | -19.92| -43.94|
## |Contagem MG | -19.92| -44.08|
## |Juiz de Fora MG | -21.76| -43.34|
## |Uberlandia MG | -18.91| -48.28|
## |Montes Claros MG | -16.73| -43.86|
## |Uberaba MG | -19.75| -47.94|
## |Varginha MG | -21.56| -45.44|
## |Governador Valadares MG | -18.85| -41.96|
## |Salto da Divisa MG | -16.01| -39.94|
## |Para de Minas MG | -19.86| -44.61|
## |Bom Despacho MG | -19.74| -45.26|
## |Manhuacu MG | -20.26| -42.03|
## |Rio Casca MG | -20.23| -42.65|
## |Tres Coracoes MG | -21.69| -45.25|
## |Tres Pontas MG | -21.37| -45.51|
## |Sao Sebastiao do Paraiso MG | -20.92| -46.98|
## |Iturama MG | -19.73| -50.20|
## |Joaima MG | -16.65| -41.02|
## |Vicosa MG | -20.75| -42.88|
## |Montalvania MG | -14.42| -44.37|
## |Frutal MG | -20.03| -48.94|
## |Ipatinga MG | -19.47| -42.55|
## |Aimores MG | -19.50| -41.07|
## |Muriae MG | -21.13| -42.37|
## |Januaria MG | -15.48| -44.36|
Outra forma de ser feito seria contar com o auxilio da biblioteca plyr
require(plyr)
## Loading required package: plyr
x<-ldply(DF$cidade, function(x) getGeoCode(x))
knitr::kable(
data.frame(cidade=cidades,x),
format="markdown",
digits=4)
##
##
## |cidade | lat| lon|
## |:---------------------------|------:|------:|
## |Belo Horizonte MG | -19.92| -43.94|
## |Contagem MG | -19.92| -44.08|
## |Juiz de Fora MG | -21.76| -43.34|
## |Uberlandia MG | -18.91| -48.28|
## |Montes Claros MG | -16.73| -43.86|
## |Uberaba MG | -19.75| -47.94|
## |Varginha MG | -21.56| -45.44|
## |Governador Valadares MG | -18.85| -41.96|
## |Salto da Divisa MG | -16.01| -39.94|
## |Para de Minas MG | -19.86| -44.61|
## |Bom Despacho MG | -19.74| -45.26|
## |Manhuacu MG | -20.26| -42.03|
## |Rio Casca MG | -20.23| -42.65|
## |Tres Coracoes MG | -21.69| -45.25|
## |Tres Pontas MG | -21.37| -45.51|
## |Sao Sebastiao do Paraiso MG | -20.92| -46.98|
## |Iturama MG | -19.73| -50.20|
## |Joaima MG | -16.65| -41.02|
## |Vicosa MG | -20.75| -42.88|
## |Montalvania MG | -14.42| -44.37|
## |Frutal MG | -20.03| -48.94|
## |Ipatinga MG | -19.47| -42.55|
## |Aimores MG | -19.50| -41.07|
## |Muriae MG | -21.13| -42.37|
## |Januaria MG | -15.48| -44.36|
Podemos agora criar um mapa utilizando as coordenadas recĂ©m descobertas. Para desenhar o mapa, usaremos neste exemplo as bibliotecas ggplot2 e ggmap. A primeira coisa a fazer Ă© recuperar o mapa utilizando e depois plotar o que nos interessa. No nosso caso, os municĂpios e depois plotar os pontos em cima do mesmo
require(ggplot2)
## Loading required package: ggplot2
require(ggmap)
## Loading required package: ggmap
box <- make_bbox(lon, lat, data = DF)
A funĂ§Ă£o acima nos retorna a regiĂ£o compreendida pelos pontos que pretendemos mostrar em nosso mapa.
map <-
ggmap(
get_map(location = box, maptype="toner", source="stamen")
) +
geom_point(data=DF, x=DF$lon, y=DF$lat, color="red")
map
É importante ressaltar que o parĂ¢metro maptype reconhece os seguintes valores:
maptype = c("terrain", "satellite", "roadmap", "hybrid", "toner", "watercolor")
JĂ¡ o parĂ¢metro source reconhece os seguintes valores:
source = c("google", "osm", "stamen", "cloudmade")
Portanto, podemos colocar outras coisas como fundo. O mapa estilo Google ficaria assim:
map <-
ggmap(
get_map(location = box, maptype="terrain", source="google", color="bw")
) +
geom_point(data=DF, x=DF$lon, y=DF$lat, color="red")
## Warning: bounding box given to google - spatial extent only approximate.
## converting bounding box to center/zoom specification. (experimental)
## Map from URL : http://maps.googleapis.com/maps/api/staticmap?center=-18.092938,-45.068241&zoom=6&size=%20640x640&scale=%202&maptype=terrain&sensor=false
## Google Maps API Terms of Service : http://developers.google.com/maps/terms
map