Geralmente em estudos e aplicações de meteorologia precisamos apresentar nossa região de estudo. Se o estudo for observacional, provavelmente seu mapa da localização da região de estudo incluirá os pontos de medida. Neste tutorial eu mostro como você pode fazer um mapa simples da localização de estações meteorológicas da região de interesse.

Pré-requisitos

# install.packages(c("easypackages", "tidyverse"))
#devtools::install_github("dkahle/ggmap")
#devtools::install_github("lhmet/inmetr", force = TRUE)
pcks <- c("tidyverse", "ggmap", "inmetr")
easypackages::libraries(pcks)
All packages loaded successfully

Dados de exemplo

Os dados usados no exemplo são de coordenadas de estações meteorológicas de superfície do INMET. Eles são disponibilizados com o pacote inmetr.

Começamos obtendo uma estimativa do ponto central da distribuição espacial das estações meteorológicas. Essa coordenada de referência para geração do mapa será determinada a partir do ponto médio do intervalo de variação da coordenada. Isso é o que faz a função mid_range() abaixo.

# tabela de coordanas
bdmep_meta
# função para calcular o ponto médio do intervalo de variação
mid_range <- function(x) min(x) + diff(range(x, na.rm = TRUE))/2
# coord central (aproximadamente)
ll0 <- apply(bdmep_meta[, c("lon", "lat")], 2, mid_range)
ll0
      lon       lat 
-53.75833 -15.35000 

Mapa

O mapa é gerado a partir de um ponto de referência. No exemplo, usamos ll0 como ponto de referência. Teste valores do parâmetro zoom conforme sua preferência. Os limites de zoom variam de 3 (scala de continente) à 21 (escala de prédio).

# mapa com a imagem do Google Maps como plano de fundo
mapa_base <- get_map(location = as.vector(ll0), 
              source = "google",
              # definido por tentativa erro
              zoom = 4, 
              color = "color",
              maptype = "terrain")
Source : https://maps.googleapis.com/maps/api/staticmap?center=-15.35,-53.758333&zoom=4&size=640x640&scale=2&maptype=terrain&language=en-EN

No mapa acima, faça testes variando o parâmetro maptype de acordo com sua preferência. Veja o resultado no mapa final (mapa_loc) usando as demais opções, como: “terrain-background”, “satellite”, “roadmap”, “hybrid” (google maps), “terrain”, “watercolor”, e “toner”.

mapa_loc <- ggmap(mapa_base, dev = "extent") +
      geom_point(data = bdmep_meta,
                 aes(x = lon, y = lat),
                 colour = "red",
                 size = 1) #+
      #geom_text(x = lon0, y = lat0, label="CAS")
mapa_loc

Feito! Agora você pode customizar o seu mapa. Veja o help da função ?ggmap para mais informações.

Informações da seção

sessionInfo()
R version 3.4.3 (2017-11-30)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 14.04.5 LTS

Matrix products: default
BLAS: /usr/lib/openblas-base/libblas.so.3
LAPACK: /usr/lib/lapack/liblapack.so.3.0

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=pt_BR.UTF-8       
 [4] LC_COLLATE=en_US.UTF-8     LC_MONETARY=pt_BR.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=pt_BR.UTF-8       LC_NAME=C                  LC_ADDRESS=C              
[10] LC_TELEPHONE=C             LC_MEASUREMENT=pt_BR.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] inmetr_0.2.6.9000  ggmap_2.7.900      forcats_0.2.0      stringr_1.3.0     
 [5] dplyr_0.7.4        purrr_0.2.4        readr_1.2.0        tidyr_0.8.0       
 [9] tibble_1.4.2       ggplot2_2.2.1.9000 tidyverse_1.2.1   

loaded via a namespace (and not attached):
 [1] reshape2_1.4.3     haven_1.1.0        lattice_0.20-35    colorspace_1.3-3  
 [5] htmltools_0.3.6    yaml_2.1.18        base64enc_0.1-3    rlang_0.2.0.9000  
 [9] pillar_1.2.1       foreign_0.8-69     glue_1.2.0.9000    withr_2.1.1.9000  
[13] modelr_0.1.1       readxl_1.0.0       bindrcpp_0.2       jpeg_0.1-8        
[17] bindr_0.1          plyr_1.8.4         munsell_0.4.3      gtable_0.2.0      
[21] cellranger_1.1.0   rvest_0.3.2        RgoogleMaps_1.4.2  devtools_1.13.4   
[25] psych_1.7.8        memoise_1.1.0      evaluate_0.10.1    labeling_0.3      
[29] knitr_1.20         parallel_3.4.3     broom_0.4.3        Rcpp_0.12.16      
[33] backports_1.1.2    scales_0.5.0.9000  jsonlite_1.5       mnormt_1.5-5      
[37] easypackages_0.1.0 rjson_0.2.15       png_0.1-7          hms_0.4.2         
[41] digest_0.6.15      stringi_1.1.7      grid_3.4.3         rprojroot_1.3-2   
[45] bitops_1.0-6       cli_1.0.0          tools_3.4.3        magrittr_1.5      
[49] lazyeval_0.2.1     crayon_1.3.4       pkgconfig_2.0.1    rsconnect_0.8.5   
[53] xml2_1.2.0         lubridate_1.7.3    assertthat_0.2.0   rmarkdown_1.9.3   
[57] httr_1.3.1         rstudioapi_0.7     R6_2.2.2           nlme_3.1-131      
[61] compiler_3.4.3    
LS0tCnRpdGxlOiAiTWFwYSBzaW1wbGVzIGRhIHJlZ2nDo28gZGUgZXN0dWRvIgphdXRob3I6Ci0gbmFtZTogSsO0bmF0YW4gVGF0c2NoCiAgYWZmaWxpYXRpb246IExITUVUL1VGU00Kb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKR2VyYWxtZW50ZSBlbSBlc3R1ZG9zIGUgYXBsaWNhw6fDtWVzIGRlIG1ldGVvcm9sb2dpYSBwcmVjaXNhbW9zIGFwcmVzZW50YXIgbm9zc2EgcmVnacOjbyBkZSBlc3R1ZG8uIFNlIG8gZXN0dWRvIGZvciBvYnNlcnZhY2lvbmFsLCBwcm92YXZlbG1lbnRlIHNldSBtYXBhIGRhIGxvY2FsaXphw6fDo28gZGEgcmVnacOjbyBkZSBlc3R1ZG8gaW5jbHVpcsOhIG9zIHBvbnRvcyBkZSBtZWRpZGEuIE5lc3RlIHR1dG9yaWFsIGV1IG1vc3RybyBjb21vIHZvY8OqIHBvZGUgZmF6ZXIgdW0gbWFwYSBzaW1wbGVzIGRhIGxvY2FsaXphw6fDo28gZGUgZXN0YcOnw7VlcyBtZXRlb3JvbMOzZ2ljYXMgZGEgcmVnacOjbyBkZSBpbnRlcmVzc2UuCgojIyMgUHLDqS1yZXF1aXNpdG9zCgoKYGBge3IgY2xlYW5fb3B0LCBlY2hvID0gRkFMU0V9CnJtKGxpc3QgPSBscygpKQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIGNvbW1lbnQgPSAiIikKYGBgCgpgYGB7ciBzZXR1cCwgd2FybmluZz1GQUxTRX0KIyBpbnN0YWxsLnBhY2thZ2VzKGMoImVhc3lwYWNrYWdlcyIsICJ0aWR5dmVyc2UiKSkKI2RldnRvb2xzOjppbnN0YWxsX2dpdGh1YigiZGthaGxlL2dnbWFwIikKI2RldnRvb2xzOjppbnN0YWxsX2dpdGh1YigibGhtZXQvaW5tZXRyIiwgZm9yY2UgPSBUUlVFKQpwY2tzIDwtIGMoInRpZHl2ZXJzZSIsICJnZ21hcCIsICJpbm1ldHIiKQplYXN5cGFja2FnZXM6OmxpYnJhcmllcyhwY2tzKQpgYGAKCiMjIyBEYWRvcyBkZSBleGVtcGxvCgpPcyBkYWRvcyB1c2Fkb3Mgbm8gZXhlbXBsbyBzw6NvIGRlIGNvb3JkZW5hZGFzIGRlIGVzdGHDp8O1ZXMgbWV0ZW9yb2zDs2dpY2FzIGRlIHN1cGVyZsOtY2llIGRvIElOTUVULiBFbGVzIHPDo28gZGlzcG9uaWJpbGl6YWRvcyBjb20gbyBwYWNvdGUgW2lubWV0cl0oaHR0cHM6Ly9naXRodWIuY29tL2xobWV0L2lubWV0cikuCgpDb21lw6dhbW9zIG9idGVuZG8gdW1hIGVzdGltYXRpdmEgZG8gcG9udG8gY2VudHJhbCBkYSBkaXN0cmlidWnDp8OjbyBlc3BhY2lhbCBkYXMgZXN0YcOnw7VlcyBtZXRlb3JvbMOzZ2ljYXMuIEVzc2EgY29vcmRlbmFkYSBkZSByZWZlcsOqbmNpYSBwYXJhIGdlcmHDp8OjbyBkbyBtYXBhIHNlcsOhIGRldGVybWluYWRhIGEgcGFydGlyIGRvIHBvbnRvIG3DqWRpbyBkbyBpbnRlcnZhbG8gZGUgdmFyaWHDp8OjbyBkYSBjb29yZGVuYWRhLiBJc3NvIMOpIG8gcXVlIGZheiBhIGZ1bsOnw6NvIGBtaWRfcmFuZ2VgKCkgYWJhaXhvLgoKYGBge3J9CiMgdGFiZWxhIGRlIGNvb3JkYW5hcwpiZG1lcF9tZXRhCiMgZnVuw6fDo28gcGFyYSBjYWxjdWxhciBvIHBvbnRvIG3DqWRpbyBkbyBpbnRlcnZhbG8gZGUgdmFyaWHDp8OjbwptaWRfcmFuZ2UgPC0gZnVuY3Rpb24oeCkgbWluKHgpICsgZGlmZihyYW5nZSh4LCBuYS5ybSA9IFRSVUUpKS8yCiMgY29vcmQgY2VudHJhbCAoYXByb3hpbWFkYW1lbnRlKQpsbDAgPC0gYXBwbHkoYmRtZXBfbWV0YVssIGMoImxvbiIsICJsYXQiKV0sIDIsIG1pZF9yYW5nZSkKbGwwCmBgYAoKCgojIyMgTWFwYQoKTyBtYXBhIMOpIGdlcmFkbyBhIHBhcnRpciBkZSB1bSBwb250byBkZSByZWZlcsOqbmNpYS4gTm8gZXhlbXBsbywgdXNhbW9zIGBsbDBgIGNvbW8gcG9udG8gZGUgcmVmZXLDqm5jaWEuIFRlc3RlIHZhbG9yZXMgZG8gcGFyw6JtZXRybyBgem9vbWAgY29uZm9ybWUgc3VhIHByZWZlcsOqbmNpYS4gT3MgbGltaXRlcyBkZSBgem9vbWAgdmFyaWFtIGRlIDMgKHNjYWxhIGRlIGNvbnRpbmVudGUpIMOgIDIxIChlc2NhbGEgZGUgcHLDqWRpbykuCgpgYGB7cn0KIyBtYXBhIGNvbSBhIGltYWdlbSBkbyBHb29nbGUgTWFwcyBjb21vIHBsYW5vIGRlIGZ1bmRvCm1hcGFfYmFzZSA8LSBnZXRfbWFwKGxvY2F0aW9uID0gYXMudmVjdG9yKGxsMCksIAogICAgICAgICAgICAgIHNvdXJjZSA9ICJnb29nbGUiLAogICAgICAgICAgICAgICMgZGVmaW5pZG8gcG9yIHRlbnRhdGl2YSBlcnJvCiAgICAgICAgICAgICAgem9vbSA9IDQsIAogICAgICAgICAgICAgIGNvbG9yID0gImNvbG9yIiwKICAgICAgICAgICAgICBtYXB0eXBlID0gInRlcnJhaW4iKQpgYGAKCk5vIG1hcGEgYWNpbWEsIGZhw6dhIHRlc3RlcyB2YXJpYW5kbyBvIHBhcsOibWV0cm8gYG1hcHR5cGVgIGRlIGFjb3JkbyBjb20gc3VhIHByZWZlcsOqbmNpYS4gVmVqYSBvIHJlc3VsdGFkbyBubyBtYXBhIGZpbmFsIChgbWFwYV9sb2NgKSB1c2FuZG8gYXMgZGVtYWlzIG9ww6fDtWVzLCBjb21vOiAidGVycmFpbi1iYWNrZ3JvdW5kIiwgInNhdGVsbGl0ZSIsICJyb2FkbWFwIiwgImh5YnJpZCIgKGdvb2dsZSBtYXBzKSwgInRlcnJhaW4iLCAid2F0ZXJjb2xvciIsIGUgInRvbmVyIi4KCmBgYHtyfQptYXBhX2xvYyA8LSBnZ21hcChtYXBhX2Jhc2UsIGRldiA9ICJleHRlbnQiKSArCiAgICAgIGdlb21fcG9pbnQoZGF0YSA9IGJkbWVwX21ldGEsCiAgICAgICAgICAgICAgICAgYWVzKHggPSBsb24sIHkgPSBsYXQpLAogICAgICAgICAgICAgICAgIGNvbG91ciA9ICJyZWQiLAogICAgICAgICAgICAgICAgIHNpemUgPSAxKSAjKwogICAgICAjZ2VvbV90ZXh0KHggPSBsb24wLCB5ID0gbGF0MCwgbGFiZWw9IkNBUyIpCm1hcGFfbG9jCmBgYAoKCkZlaXRvISBBZ29yYSB2b2PDqiBwb2RlIGN1c3RvbWl6YXIgbyBzZXUgbWFwYS4gIFZlamEgbyBoZWxwIGRhIGZ1bsOnw6NvIGA/Z2dtYXBgIHBhcmEgbWFpcyBpbmZvcm1hw6fDtWVzLgoKIyMjIEluZm9ybWHDp8O1ZXMgZGEgc2XDp8OjbwoKYGBge3J9CnNlc3Npb25JbmZvKCkKYGBgCgoKCgoKCgoK