library(terra)
library(leaflet)
library(leaflet.extras)
library(sf)
library(dplyr)
library(rnaturalearth)
library(rnaturalearthdata)
library(ggplot2)
library(plotly)
library(knitr)
library(kableExtra)
library(htmltools)
library(DT)Koppen-Geiger sistemi, dunya genelinde iklimi 5 ana grup ve 30 alt sinif altinda kategorize eden en yaygin iklim siniflandirma sistemidir. Sicaklik, yagis miktari ve mevsimsel dagilimlari temel alir. Bu harita Beck ve ark. (2018) tarafindan guncellenen 1 km cozunurluklu veriyi kullanmaktadir.
koppen_global <- rast("C:/Users/Izoly/Desktop/koppen.tif")
italy_sf <- ne_countries(scale="medium", country="Italy", returnclass="sf")
italy_vect <- vect(italy_sf)
koppen_italy <- crop(koppen_global, italy_vect)
koppen_italy <- mask(koppen_italy, italy_vect)
vals <- sort(unique(values(koppen_italy, na.rm=TRUE)))
val_vec <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30)
lab_vec <- c("Af","Am","Aw","BWh","BWk","BSh","BSk",
"Csa","Csb","Csc","Cwa","Cwb","Cwc",
"Cfa","Cfb","Cfc","Dsa","Dsb","Dsc","Dsd",
"Dwa","Dwb","Dwc","Dwd","Dfa","Dfb","Dfc","Dfd",
"ET","EF")
desc_vec <- c("Tropikal Yagmur Ormani","Tropikal Muson","Tropikal Savana",
"Sicak Col","Soguk Col","Sicak Yari Kurak","Soguk Yari Kurak",
"Akdeniz Sicak Yaz","Akdeniz Ilik Yaz","Akdeniz Serin Yaz",
"Subtropikal Kis Kurak Sicak Yaz","Subtropikal Kis Kurak Ilik Yaz","Subtropikal Kis Kurak Serin Yaz",
"Subtropikal Sicak Yaz","Okyanus Ilik Yaz","Okyanus Serin Yaz",
"Karasal Akdeniz Sicak Yaz","Karasal Akdeniz Ilik Yaz","Karasal Akdeniz Serin Yaz","Karasal Akdeniz Cok Serin Yaz",
"Karasal Kis Kurak Sicak Yaz","Karasal Kis Kurak Ilik Yaz","Karasal Kis Kurak Serin Yaz","Karasal Kis Kurak Cok Serin",
"Karasal Nemli Sicak Yaz","Karasal Nemli Ilik Yaz","Karasal Nemli Serin Yaz","Karasal Nemli Cok Serin",
"Tundra","Buz Ortusu")
col_vec <- c("#0000FF","#0078FF","#46AAFA",
"#FF0000","#FF9696",
"#F5A500","#FFDB63",
"#FFFF00","#C6C700","#969600",
"#96FF96","#63C763","#329632",
"#C8FF50","#64FF50","#32C800",
"#FF00FF","#C800C8","#963296","#640064",
"#FF6EFF","#C71585","#8B008B","#4B0082",
"#00FFFF","#37C8FF","#007D7D","#00465F",
"#B2B2B2","#686868")
ana_grup_vec <- c("A","A","A","B","B","B","B",
"C","C","C","C","C","C","C","C","C",
"D","D","D","D","D","D","D","D","D","D","D","D",
"E","E")
ana_grup_desc <- c("A"="Tropikal","B"="Kurak","C"="Iliman","D"="Karasal","E"="Kutup")
koppen_full <- data.frame(
value = val_vec,
label = lab_vec,
desc = desc_vec,
color = col_vec,
ana_grup = ana_grup_vec,
stringsAsFactors = FALSE
)
present <- koppen_full[koppen_full$value %in% vals, ]
pixel_counts <- as.data.frame(table(values(koppen_italy, na.rm=TRUE)))
colnames(pixel_counts) <- c("value","pixel")
pixel_counts$value <- as.integer(as.character(pixel_counts$value))
pixel_counts <- merge(pixel_counts, present[,c("value","label","color","ana_grup","desc")], by="value")
pixel_counts$alan_km2 <- round(pixel_counts$pixel * 1, 0)
pixel_counts$alan_yuzde <- round(pixel_counts$pixel / sum(pixel_counts$pixel) * 100, 2)
pixel_counts <- pixel_counts[order(-pixel_counts$pixel), ]<div class="number">12</div>
<div class="label">Farkli Iklim Sinifi</div>
<div class="number">4</div>
<div class="label">Ana Iklim Grubu</div>
<div class="number">Csa</div>
<div class="label">En Yaygin Sinif</div>
<div class="number">%40.69</div>
<div class="label">En Yaygin Sinif Payi</div>
Harita uzerinde zoom yapabilir, katmanlari degistirebilir ve herhangi bir noktanin uzerine gelerek iklim sinifini gorebilirsiniz.
r_proj <- project(koppen_italy, "EPSG:4326", method="near")
color_map <- setNames(present$color, as.character(present$value))
pal <- colorFactor(
palette = present$color,
levels = present$value,
na.color = "transparent"
)
italy_sf_4326 <- st_transform(italy_sf, 4326)
label_map <- setNames(present$label, as.character(present$value))
desc_map <- setNames(present$desc, as.character(present$value))
grup_map <- setNames(present$ana_grup, as.character(present$value))
r_vals <- values(r_proj)[,1]
r_labs <- label_map[as.character(r_vals)]
r_desc <- desc_map[as.character(r_vals)]
r_grup <- grup_map[as.character(r_vals)]
popup_raster <- paste0(
"<div style='font-family:Inter,sans-serif;min-width:180px'>",
"<div style='background:#1a365d;color:white;padding:8px 12px;border-radius:6px 6px 0 0;font-weight:600;font-size:13px'>",
"Koppen Iklim Sinifi</div>",
"<div style='padding:10px 12px;background:white;border-radius:0 0 6px 6px;border:1px solid #e2e8f0'>",
"<b style='font-size:1.4em'>", r_labs, "</b><br>",
"<span style='color:#4a5568;font-size:0.9em'>", r_desc, "</span><br><br>",
"<span style='background:#edf2f7;padding:2px 8px;border-radius:10px;font-size:0.8em;color:#2d3748'>",
"Ana Grup: ", r_grup, " - ", ana_grup_desc[r_grup], "</span>",
"</div></div>"
)
m <- leaflet(options = leafletOptions(zoomControl = TRUE)) %>%
setView(lng = 12.5, lat = 41.9, zoom = 6) %>%
addProviderTiles("CartoDB.Positron", group = "Sade (CartoDB)") %>%
addProviderTiles("Esri.WorldShadedRelief", group = "Kabartma (ESRI)") %>%
addProviderTiles("OpenStreetMap", group = "OpenStreetMap") %>%
addProviderTiles("Esri.WorldImagery", group = "Uydu (ESRI)") %>%
addRasterImage(
r_proj,
colors = pal,
opacity = 0.82,
group = "Koppen Iklim",
project = FALSE
) %>%
addPolygons(
data = italy_sf_4326,
fill = FALSE,
color = "#1a202c",
weight = 2,
opacity = 1,
group = "Italya Siniri"
) %>%
addLegend(
position = "bottomright",
pal = pal,
values = present$value,
labFormat = labelFormat(
transform = function(x) paste0(label_map[as.character(x)], " - ", desc_map[as.character(x)])
),
title = "<b style='font-size:13px'>Koppen Iklim Sinifi</b>",
opacity = 0.9
) %>%
addLayersControl(
baseGroups = c("Sade (CartoDB)","Kabartma (ESRI)","OpenStreetMap","Uydu (ESRI)"),
overlayGroups = c("Koppen Iklim","Italya Siniri"),
options = layersControlOptions(collapsed = FALSE)
) %>%
addScaleBar(
position = "bottomleft",
options = scaleBarOptions(imperial = FALSE)
) %>%
addMiniMap(
tiles = providers$CartoDB.Positron,
toggleDisplay = TRUE,
minimized = FALSE,
position = "bottomleft"
) %>%
addMeasure(
position = "topleft",
primaryLengthUnit = "kilometers",
primaryAreaUnit = "sqmeters",
activeColor = "#2b6cb0",
completedColor = "#1a365d"
) %>%
addFullscreenControl(position = "topleft")
mSekil 1 — Italya Koppen-Geiger iklim siniflandirmasi interaktif haritasi. Katman secimi icin sag ust kosedeki kontrol panelini kullanin.
pd <- pixel_counts[order(pixel_counts$alan_yuzde), ]
fig <- plot_ly(
data = pd,
x = ~alan_yuzde,
y = ~reorder(label, alan_yuzde),
type = "bar",
orientation = "h",
marker = list(
color = pd$color,
line = list(color = "#ffffff", width = 0.8)
),
text = ~paste0("<b>", label, "</b><br>", desc, "<br>Alan: %", alan_yuzde),
hoverinfo = "text",
textposition = "none"
) %>%
layout(
title = list(
text = "<b>Italya - Iklim Siniflarinin Alansal Dagilimi</b>",
font = list(size = 16, color = "#1a365d", family = "Georgia")
),
xaxis = list(
title = "Alan Yuzdesi (%)",
ticksuffix = "%",
gridcolor = "#e2e8f0"
),
yaxis = list(
title = "",
tickfont = list(size = 12, family = "monospace")
),
plot_bgcolor = "#f8f9fa",
paper_bgcolor = "#f8f9fa",
margin = list(l=70, r=40, t=60, b=50),
hoverlabel = list(
bgcolor = "#1a365d",
font = list(color="white", size=13)
)
)
figgrup_df <- pixel_counts %>%
group_by(ana_grup) %>%
summarise(
toplam_yuzde = sum(alan_yuzde),
.groups = "drop"
)
grup_df$grup_adi <- paste0(grup_df$ana_grup, " - ", ana_grup_desc[grup_df$ana_grup])
grup_colors <- c("A"="#0078FF","B"="#F5A500","C"="#64FF50","D"="#37C8FF","E"="#B2B2B2")
plot_ly(
data = grup_df,
labels = ~grup_adi,
values = ~toplam_yuzde,
type = "pie",
marker = list(
colors = grup_colors[grup_df$ana_grup],
line = list(color="#ffffff", width=2)
),
textinfo = "label+percent",
hovertemplate = "<b>%{label}</b><br>Alan: %{value:.1f}%<extra></extra>",
hole = 0.45
) %>%
layout(
title = list(
text = "<b>Ana Iklim Gruplarina Gore Dagilim</b>",
font = list(size=16, color="#1a365d", family="Georgia")
),
showlegend = TRUE,
plot_bgcolor = "#f8f9fa",
paper_bgcolor = "#f8f9fa",
annotations = list(list(
text = "<b>Italya</b>",
showarrow = FALSE,
font = list(size=14, color="#1a365d")
))
)Beck, H.E., Zimmermann, N.E., McVicar, T.R., Vergopolan, N., Berg, A., & Wood, E.F. (2018). Present and future Koppen-Geiger climate classification maps at 1-km resolution. Scientific Data, 5, 180214. https://doi.org/10.1038/sdata.2018.214
Bu rapor R Markdown ile uretilmistir. | leaflet + plotly + DT