A caracterização da região de estudo e das estações meteorológicas (EM) empregadas em pesquisas ou aplicações de meteorologia é imprescindível para o melhor entendimento e interpretação dos resultados de uma análise observacional. Neste tutorial apresento como produzir no R, um mapa básico da região de estudo incluindo a localização dos pontos de observação (EM) utilizados na pesquisa ou trabalho.

Pré-requisitos

## descomente para instalar os pacotes se necessário
# install.packages(c("easypackages", "tidyverse", "devtools"))
# devtools::install_github("dkahle/ggmap")
# devtools::install_github("lhmet/inmetr", force = TRUE)
pcks <- c("tidyverse", "ggmap", "inmetr")
easypackages::libraries(pcks)

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
ABCDEFGHIJ0123456789
id
<chr>
lon
<dbl>
lat
<dbl>
alt
<dbl>
name
<chr>
state
<chr>
83010-68.73333-11.01666667260.00BrasiléiaAcre
82704-72.66667-7.63333333170.00Cruzeiro do SulAcre
82915-67.80000-9.96666667160.00Rio BrancoAcre
82807-70.76667-8.16666667190.00TarauacáAcre
83098-36.16667-10.1500000056.13CoruripeAlagoas
82994-35.70000-9.6666666764.50MaceióAlagoas
82988-37.73333-9.11666667635.00Mata GrandeAlagoas
82992-36.70000-9.45000000274.90Palmeira dos ÍndiosAlagoas
82990-37.43333-9.7500000019.10Pão de AcuçarAlagoas
82996-35.43333-9.1833333350.02Porto de PedrasAlagoas
# 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")

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)
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()
LS0tCnRpdGxlOiAiTWFwYSBzaW1wbGVzIGRhIHJlZ2nDo28gZGUgZXN0dWRvIgphdXRob3I6Ci0gbmFtZTogSsO0bmF0YW4gVGF0c2NoCiAgYWZmaWxpYXRpb246IExITUVUL1VGU00KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpKWAiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCkEgY2FyYWN0ZXJpemHDp8OjbyBkYSByZWdpw6NvIGRlIGVzdHVkbyBlIGRhcyBlc3Rhw6fDtWVzIG1ldGVvcm9sw7NnaWNhcyAoRU0pIGVtcHJlZ2FkYXMgZW0gcGVzcXVpc2FzIG91IGFwbGljYcOnw7VlcyBkZSBtZXRlb3JvbG9naWEgw6kgaW1wcmVzY2luZMOtdmVsIHBhcmEgbyBtZWxob3IgZW50ZW5kaW1lbnRvIGUgaW50ZXJwcmV0YcOnw6NvIGRvcyByZXN1bHRhZG9zIGRlIHVtYSBhbsOhbGlzZSBvYnNlcnZhY2lvbmFsLiBOZXN0ZSB0dXRvcmlhbCBhcHJlc2VudG8gY29tbyBwcm9kdXppciBubyBSLCB1bSBtYXBhIGLDoXNpY28gZGEgcmVnacOjbyBkZSBlc3R1ZG8gaW5jbHVpbmRvIGEgbG9jYWxpemHDp8OjbyBkb3MgcG9udG9zIGRlIG9ic2VydmHDp8OjbyAoRU0pIHV0aWxpemFkb3MgbmEgcGVzcXVpc2Egb3UgdHJhYmFsaG8uCgojIyMgUHLDqS1yZXF1aXNpdG9zCgoKYGBge3IgY2xlYW5fb3B0LCBlY2hvID0gRkFMU0V9CnJtKGxpc3QgPSBscygpKQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIGNvbW1lbnQgPSAiIikKYGBgCgpgYGB7ciBzZXR1cCwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KIyMgZGVzY29tZW50ZSBwYXJhIGluc3RhbGFyIG9zIHBhY290ZXMgc2UgbmVjZXNzw6FyaW8KIyBpbnN0YWxsLnBhY2thZ2VzKGMoImVhc3lwYWNrYWdlcyIsICJ0aWR5dmVyc2UiLCAiZGV2dG9vbHMiKSkKIyBkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoImRrYWhsZS9nZ21hcCIpCiMgZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJsaG1ldC9pbm1ldHIiLCBmb3JjZSA9IFRSVUUpCnBja3MgPC0gYygidGlkeXZlcnNlIiwgImdnbWFwIiwgImlubWV0ciIpCmVhc3lwYWNrYWdlczo6bGlicmFyaWVzKHBja3MpCmBgYAoKIyMjIERhZG9zIGRlIGV4ZW1wbG8KCk9zIGRhZG9zIHVzYWRvcyBubyBleGVtcGxvIHPDo28gZGUgY29vcmRlbmFkYXMgZGUgZXN0YcOnw7VlcyBtZXRlb3JvbMOzZ2ljYXMgZGUgc3VwZXJmw61jaWUgZG8gSU5NRVQuIEVsZXMgc8OjbyBkaXNwb25pYmlsaXphZG9zIGNvbSBvIHBhY290ZSBbaW5tZXRyXShodHRwczovL2dpdGh1Yi5jb20vbGhtZXQvaW5tZXRyKS4KCkNvbWXDp2Ftb3Mgb2J0ZW5kbyB1bWEgZXN0aW1hdGl2YSBkbyBwb250byBjZW50cmFsIGRhIGRpc3RyaWJ1acOnw6NvIGVzcGFjaWFsIGRhcyBlc3Rhw6fDtWVzIG1ldGVvcm9sw7NnaWNhcy4gRXNzYSBjb29yZGVuYWRhIGRlIHJlZmVyw6puY2lhIHBhcmEgZ2VyYcOnw6NvIGRvIG1hcGEgc2Vyw6EgZGV0ZXJtaW5hZGEgYSBwYXJ0aXIgZG8gcG9udG8gbcOpZGlvIGRvIGludGVydmFsbyBkZSB2YXJpYcOnw6NvIGRhIGNvb3JkZW5hZGEuIElzc28gw6kgbyBxdWUgZmF6IGEgZnVuw6fDo28gYG1pZF9yYW5nZWAoKSBhYmFpeG8uCgpgYGB7ciBjZW50cm9pZH0KIyB0YWJlbGEgZGUgY29vcmRhbmFzCmJkbWVwX21ldGEKIyBmdW7Dp8OjbyBwYXJhIGNhbGN1bGFyIG8gcG9udG8gbcOpZGlvIGRvIGludGVydmFsbyBkZSB2YXJpYcOnw6NvCm1pZF9yYW5nZSA8LSBmdW5jdGlvbih4KSBtaW4oeCkgKyBkaWZmKHJhbmdlKHgsIG5hLnJtID0gVFJVRSkpLzIKIyBjb29yZCBjZW50cmFsIChhcHJveGltYWRhbWVudGUpCmxsMCA8LSBhcHBseShiZG1lcF9tZXRhWywgYygibG9uIiwgImxhdCIpXSwgMiwgbWlkX3JhbmdlKQpsbDAKYGBgCgoKCiMjIyBNYXBhCgpPIG1hcGEgw6kgZ2VyYWRvIGEgcGFydGlyIGRlIHVtIHBvbnRvIGRlIHJlZmVyw6puY2lhLiBObyBleGVtcGxvLCB1c2Ftb3MgYGxsMGAgY29tbyBwb250byBkZSByZWZlcsOqbmNpYS4gVGVzdGUgdmFsb3JlcyBkbyBwYXLDom1ldHJvIGB6b29tYCBjb25mb3JtZSBzdWEgcHJlZmVyw6puY2lhLiBPcyBsaW1pdGVzIGRlIGB6b29tYCB2YXJpYW0gZGUgMyAoc2NhbGEgZGUgY29udGluZW50ZSkgw6AgMjEgKGVzY2FsYSBkZSBwcsOpZGlvKS4KCmBgYHtyIGJhc2VtYXAsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CiMgbWFwYSBjb20gYSBpbWFnZW0gZG8gR29vZ2xlIE1hcHMgY29tbyBwbGFubyBkZSBmdW5kbwptYXBhX2Jhc2UgPC0gZ2V0X21hcChsb2NhdGlvbiA9IGFzLnZlY3RvcihsbDApLCAKICAgICAgICAgICAgICBzb3VyY2UgPSAiZ29vZ2xlIiwKICAgICAgICAgICAgICAjIGRlZmluaWRvIHBvciB0ZW50YXRpdmEgZXJybwogICAgICAgICAgICAgIHpvb20gPSA0LCAKICAgICAgICAgICAgICBjb2xvciA9ICJjb2xvciIsCiAgICAgICAgICAgICAgbWFwdHlwZSA9ICJ0ZXJyYWluIikKYGBgCgpObyBtYXBhIGFjaW1hLCBmYcOnYSB0ZXN0ZXMgdmFyaWFuZG8gbyBwYXLDom1ldHJvIGBtYXB0eXBlYCBkZSBhY29yZG8gY29tIHN1YSBwcmVmZXLDqm5jaWEuIFZlamEgbyByZXN1bHRhZG8gbm8gbWFwYSBmaW5hbCAoYG1hcGFfbG9jYCkgdXNhbmRvIGFzIGRlbWFpcyBvcMOnw7VlcywgY29tbzogInRlcnJhaW4tYmFja2dyb3VuZCIsICJzYXRlbGxpdGUiLCAicm9hZG1hcCIsICJoeWJyaWQiIChnb29nbGUgbWFwcyksICJ0ZXJyYWluIiwgIndhdGVyY29sb3IiLCBlICJ0b25lciIuCgpgYGB7ciBtYXBfbG9jfQptYXBhX2xvYyA8LSBnZ21hcChtYXBhX2Jhc2UsIGRldiA9ICJleHRlbnQiKSArCiAgICAgIGdlb21fcG9pbnQoZGF0YSA9IGJkbWVwX21ldGEsCiAgICAgICAgICAgICAgICAgYWVzKHggPSBsb24sIHkgPSBsYXQpLAogICAgICAgICAgICAgICAgIGNvbG91ciA9ICJyZWQiLAogICAgICAgICAgICAgICAgIHNpemUgPSAxKQptYXBhX2xvYwpgYGAKCgpGZWl0byEgQWdvcmEgdm9jw6ogcG9kZSBjdXN0b21pemFyIG8gc2V1IG1hcGEuICBWZWphIG8gaGVscCBkYSBmdW7Dp8OjbyBgP2dnbWFwYCBwYXJhIG1haXMgaW5mb3JtYcOnw7Vlcy4KCiMjIyBJbmZvcm1hw6fDtWVzIGRhIHNlw6fDo28KCmBgYHtyLCBzZXNzaW5mb30Kc2Vzc2lvbkluZm8oKQpgYGAK