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

plot of chunk unnamed-chunk-8

É 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

plot of chunk unnamed-chunk-11