# Carregar os pacotes necessários
library(ggplot2)
library(rnaturalearth)
## Warning: package 'rnaturalearth' was built under R version 4.3.3
library(sf)
## Warning: package 'sf' was built under R version 4.3.3
## Linking to GEOS 3.11.2, GDAL 3.8.2, PROJ 9.3.1; sf_use_s2() is TRUE
library(ggspatial) # Pacote para adicionar a rosa dos ventos
## Warning: package 'ggspatial' was built under R version 4.3.3
# Obter os dados dos países
world <- ne_countries(scale = "medium", returnclass = "sf")

# Filtrar para Moçambique usando o código ISO de 2 letras
mozambique <- world[world$iso_a2 == "MZ", ]

# Obter as divisões administrativas de Moçambique (nível 1 representa as províncias)
# Obter as divisões administrativas de Moçambique (nível 1 representa as províncias)
mozambique_admin1 <- ne_states(country = "Mozambique", returnclass = "sf")

# Dataframe 'cidades' com as colunas 'nome', 'lat', 'long' e 'altitude'
cidades <- data.frame(
  nome = c("Pemba", "Lichinga", "Nampula", "Quelimane", 
           "Tete", "Beira", "Chimoio", "Inhambane", "Xai-Xai", "Maputo"),
  lat = c(-12.97, -13.35, -14.67, -17.86, -16.19, -19.93, -19.14, -23.91, -25.11, -25.96),
  long = c(40.54, 35.66, 39.70, 36.85, 33.67, 34.97, 33.53, 35.47, 33.77, 32.58),
  altitude = c(30, 1398, 360, 9, 137, 6, 709, 8, 9, 70) # em metros
)

# Converter o dataframe 'cidades' para um objeto sf
cidades_sf <- st_as_sf(cidades, coords = c("long", "lat"), crs = 4326)

# Criar o mapa com divisões administrativas e cidades
ggplot(data = mozambique) +
  geom_sf(fill = "gray", color = "black") + # Desenha o shapefile de Moçambique
  geom_sf(data = mozambique_admin1, fill = NA, color = "black", size = 0.5) + # Adiciona as divisões administrativas
  geom_sf_text(data = cidades_sf, aes(label = nome), vjust = -1, size = 3) + # Posiciona os rótulos acima dos pontos
  geom_sf(data = cidades_sf, aes(color = altitude), size = 2.5) + # Pinta cada cidade com uma cor baseada na altitude
  scale_color_viridis_c(name = "Altitude (m)") + # Adiciona unidade em metros na legenda
  labs(x = "Longitude", y = "Latitude") + # Adiciona rótulos personalizados para os eixos
  theme_minimal() + # Tema minimalista para o ggplot
  annotation_north_arrow(location = "tl", which_north = "true", 
                         pad_x = unit(0.1, "in"), pad_y = unit(0.1, "in"), 
                         style = north_arrow_fancy_orienteering) # Adiciona a rosa dos ventos no canto superior esquerdo
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data