CoVARM Development

Author

Faza & Dony

Deskripsi Modul

Modul analisis CoVARM atau Coastal Vulnerability Assessment and Reduction Module dikembangkan untuk memfasilitasi pengukuran kualitatif terhadap kerentanan pesisir dalam bentuk indeks relatif yang komprehensif.

Tujuan modul ini adalah untuk menghitung kerentanan komposit (multidimensi) yang tidak hanya mencakup risiko fisik/paparan terhadap bencana, tetapi juga faktor risiko sosial dan kapasitas adaptif komunitas masyarakat pesisir. Dengan mengagregasi indeks secara berjenjang, modul ini dapat menghasilkan penilaian holistik mengenai kerentanan, risiko, dan paparan suatu wilayah.

Metode

Konsep

Analisis dalam CoVARM mengadopsi metode yang telah dikembangkan oleh Tao WU (2021) menggunakan analisis statistik multivariat untuk mengukur kerentanan pesisir komposit (multidimensi) dalam bentuk indeks relatif kualitatif. Metode ini mengintegrasikan indikator-indikator dari tiga komponen utama, meliputi:

  1. Keterpaparan (exposure): mengacu pada tingkat di mana suatu area pesisir dimungkinkan akan terdampak oleh bahaya/ancaman eksternal baik secara biofisik maupun iklim yang diperparah oleh peningkatan perubahan iklim, misalnya keterpaparan oleh kenaikan muka air laut atau peristiwa banjir 100 tahun.

  2. Sensitivitas: mengacu pada sejumlah faktor internal yang mengakibatkan kerentanan pada populasi yang terdampak baik positif maupun negatif oleh variasi perubahan iklim dan biofisik, misalnya kepadatan populasi.

  3. Kapasitas adaptasi: mengacu pada kemampuan internal untuk mempersiapkan, mengatasi, dan memulihkan diri terhadap dampak dari paparan yang ditimbulkan dari perubahan iklim, misalnya indeks membangun desa.

Secara khusus, CoVARM menggunakan analisis komponen utama (PCA) untuk mereduksi dimensi penelitian dari sejumlah besar indikator, sekaligus menghasilkan bobot objektif untuk setiap indikator yang berkontribusi terhadap kerentanan pesisir. Indikator yang telah dikelompokkan oleh PCA ini kemudian diagregasi secara berjenjang untuk menghasilkan indeks komposit, yang memungkinkan perbandingan kerentanan antar-wilayah pesisir dan identifikasi dimensi yang paling signifikan menyumbang pada kerentanan tersebut.

Cakupan area pesisir

Gambaran area transisi pesisir

Analisis ini berfokus pada area pesisir yang didefinisikan secara spesifik sebagai zona litoral, yang mencakup pantai (pesisir), zona dekat pantai (nearshore), dan habitat seperti mangrove, karang, serta lamun, namun tidak meliputi area offshore.

Pendekatan agregasi

  • xxx

Data

Kerentanan pesisir dikembangkan dari integrasi 3 komponen yang terdiri dari paparan (kerentanan fisik), sensitivitas, dan kapasitas adaptasi. Komponen-komponen tersebut dijabarkan ke dalam indikator-indikator biofisik, tutupan dan penggunaan lahan, sosial dan demografi, ekonomi, serta kerawanan bencana. Terdapat 13 indikator yang dikumpulkan dari berbagai sumber dengan rincian sebagai berikut.

Daftar indikator dalam analisis kerentanan pesisir Sulawesi Tengah
Indikator Komponen Deskripsi Sumber
Persentase populasi lanjut usia (%) Kapasitas adaptasi Persentase populasi penduduk dengan umur lebih dari 60 tahun (UU No. 13 Tahun 1998 tentang Kesejahteraan Lanjut Usia) terhadap total penduduk www.worldpop.org
Indeks desa membangun (tanpa unit) Kapasitas adaptasi Kategori pembangunan desa (sangat tertinggal, tertinggal, berkembang, maju, mandiri)
Kepadatan populasi (jiwa/ha) Sensitivitas Total populasi penduduk (semua kelas umur dan jenis kelamin) yang tinggal dalam satu hektare lahan www.worldpop.org
Persentase lahan terbangun (%) Sensitivitas Persentase luas lahan terbangun (permukiman dan lahan terbangun lainnya) dalam setiap grid ICRAF
Persentase lahan terbuka (%) Sensitivitas Persentase luas lahan terbuka/terlantar dalam setiap grid ICRAF
Persentase hutan di area pesisir (%) Sensitivitas Persentase luas penutupan hutan mangrove dan hutan pantai dalam setiap grid ICRAF
Area banjir 100 tahun (meter) Paparan Potensi kedalaman genangan pada kejadian banjir setiap 100 tahun Baugh dkk (2024)
Paparan gelombang (kW/m) Paparan Potensi paparan energi yang dihasilkan gelombang
Paparan angin (tanpa unit) Paparan Potensi paparan kecepatan angin
Kenaikan muka air laut (mm/tahun) Paparan Total laju peningkatan muka air laut
Rerata elevasi (mdpl) Paparan Rata-rata elevasi topografi dalam setiap grid USGS
Persentase habitat laut (%) Paparan Persentase luas habitat coral dan rumput laut dalam setiap grid
Jarak ke sungai (meter) Paparan Jarak suatu titik ke sungai terdekat BIG

Implementasi

1. Membaca data

# 1a. Read the lookup table listing indicator names and raster file paths
indicator_lookup <- readr::read_csv("data/indicator_lookup.csv")
Rows: 9 Columns: 3
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (3): variable_name, unit, path_to_raster_file

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# 1b. Read each raster referenced in the lookup table
#     Store them in a tibble keyed by 'variable_name' for downstream processing
indicator_rasters <- indicator_lookup %>%
    mutate(
        raster = purrr::map(path_to_raster_file, terra::rast)
    ) %>%
    dplyr::select(variable_name, raster)

2. Menentukan batas area transisi

Wilayah transisi sudah dibaca pada langkah 1b. Wilayah ini didefinisikan sebagai zona litoral sepanjang pesisir dan akan menjadi acuan pembuatan grid sampling.

# batas transisi dari WH
# I assume transition area is 4 km buffer landwards from the coastline
# Read the transition zone shapefile and reproject to a projected CRS (EPSG:32751)
trans_area <- st_read("data/Transition_Zone_Sulteng/ST_trzone_clip.shp") %>%
    sf::st_transform("EPSG:32751")
Reading layer `ST_trzone_clip' from data source 
  `C:\Users\DIndiarto\OneDrive - CIFOR-ICRAF\Research Group 2 - LUMENS\Exploratory\Coastal Exposure Index\CoVARM\data\Transition_Zone_Sulteng\ST_trzone_clip.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 1 feature and 60 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 13269060 ymin: -233433.2 xmax: 13511890 ymax: 83069.01
Projected CRS: WGS 84 / World Mercator

3. Membuat grid di dalam area transisi

Membangun grid persegi 1000×1000 m di dalam trans_area menggunakan fungsi generate_grid_by_size() yang telah Anda definisikan pada R/functions.R. Grid ini akan menjadi unit analisis untuk mengekstrak nilai indikator.

# menghasilkan grids 1000x1000 m~ 100 Ha di dalam zona transisi (landwards)
sampling_grids <- trans_area %>%
    generate_grid_by_size(cellsize_m = 500) %>%
    select(-area, )

# plot(sampling_grids)

4. Mensinkronisasikan geometri

Sebelum mengekstrak nilai raster, semua raster perlu diselaraskan (harmonised) ke grid referensi. Kami membuat raster template dari grid sampling untuk memastikan semua raster memiliki proyeksi, resolusi, dan jangkauan (extent) yang sama. Setiap raster kemudian diproyeksikan dan di‑resample untuk cocok dengan template ini.

# 4a. Create a template raster from the sampling grids with 1000 m resolution
template_raster <- terra::rast(sampling_grids, resolution = 1000)


# 4b. Rasterise the sampling grids to an ID raster (optional but useful for checks)
rasterised_grids <- terra::rasterize(
    vect(sampling_grids),
    template_raster,
    field = "ID",
    touches = TRUE
)

# 4c. Project and resample each indicator raster to match the template
resampled_rasters <- indicator_rasters %>%
    dplyr::mutate(
        # reproject to match CRS of template
        raster_proj = purrr::map(
            raster,
            ~ terra::project(.x, terra::crs(template_raster))
        ),
        # resample to match resolution and extent; use 'near' by default
        raster_resampled = purrr::map(
            raster_proj,
            ~ terra::resample(.x, template_raster, method = "near")
        )
    )

5. Mereklasifikasikan peta menjadi peta kategorikal

Langkah ini dapat diisi jika Anda memiliki peta yang memerlukan re‑klasifikasi ke dalam kelas‑kelas tertentu (misalnya kategori kedalaman banjir).

# Contoh re-klasifikasi kedalaman banjir ke dalam tiga kelas
# r_depth_class <- classify(depth_raster, cbind(breaks, classes))

# Untuk saat ini, kita akan melewati langkah reklasifikasi umum
# dan langsung ke analisis sensitivitas yang menggunakan pendekatan kuantil
cat(
    "Melewati reklasifikasi umum - akan menggunakan pendekatan kuantil dalam analisis sensitivitas\n"
)
Melewati reklasifikasi umum - akan menggunakan pendekatan kuantil dalam analisis sensitivitas
# Simpan resampled_rasters untuk digunakan nanti jika diperlukan
reclassified_rasters <- resampled_rasters

6. Ekstrak nilai tiap indikator di masing-masing grid

Setelah semua raster diselaraskan, kita dapat menghitung nilai rata‑rata setiap indikator di dalam setiap grid. Nilai‑nilai tersebut kemudian digabungkan kembali ke objek sampling_grids sebagai kolom baru.

# 6a. Extract mean values from each resampled raster over the sampling grids
extracted_df <- reclassified_rasters %>%
    dplyr::mutate(
        values = purrr::map(
            raster_resampled,
            ~ {
                # extract mean for each grid; return vector without ID
                terra::extract(
                    .x,
                    sampling_grids,
                    fun = "mean",
                    na.rm = TRUE,
                    ID = FALSE
                )
            }
        )
    ) %>%
    # convert list of vectors into a data frame with indicator names as columns
    {
        purrr::set_names(.$values, .$variable_name)
    } %>%
    dplyr::bind_cols()

# 6b. Combine extracted values with the sampling grid geometry
sampling_grids_with_data <- sampling_grids %>%
    dplyr::bind_cols(extracted_df)

7. Analisis Sensitivitas Terestrial

Catatan Penting: Implementasi ini hanya mencakup komponen sensitivitas dari kerangka kerja CoVARM. Kami masih dalam tahap pengembangan untuk komponen kapasitas adaptasi dan paparan (exposure). Selain itu, integrasi data CMS (Coral, Mangrove, Seagrass) untuk aspek seascape-landscape interaction belum diimplementasikan. Indeks kerentanan komposit yang menggabungkan ketiga komponen akan dikembangkan setelah semua komponen individual selesai.

Pada tahap ini, kita akan mengimplementasikan analisis sensitivitas menggunakan metodologi klasifikasi berbasis ambang batas (threshold-based classification) untuk menghitung indeks sensitivitas terestrial. Analisis ini fokus pada empat variabel sensitivitas utama: kepadatan populasi, lahan terbangun, lahan terbuka, dan vegetasi pesisir.

7.1 Persiapan Data Sensitivitas

# Load required libraries for sensitivity analysis
library(units)

# Get sensitivity variables
sensitivity_vars <- get_sensitivity_variables()
cat("Variabel sensitivitas:", paste(sensitivity_vars, collapse = ", "), "\n")
Variabel sensitivitas: population_density_persons_per_ha, built_area_percent, open_area_percent, coastal_vegetation_percent 
# Filter and prepare sensitivity data
sensitivity_lookup <- indicator_lookup %>%
    filter(variable_name %in% sensitivity_vars)

# Load sensitivity rasters
indicator_rasters_sensitivity <- sensitivity_lookup %>%
    mutate(
        raster = purrr::map(
            path_to_raster_file,
            ~ {
                if (file.exists(.x)) {
                    terra::rast(.x)
                } else {
                    NULL
                }
            }
        )
    ) %>%
    filter(!map_lgl(raster, is.null)) %>%
    dplyr::select(variable_name, raster)

cat(
    "Berhasil memuat",
    nrow(indicator_rasters_sensitivity),
    "raster sensitivitas\n"
)
Berhasil memuat 4 raster sensitivitas

7.2 Harmonisasi Geometri dan Preprocessing

# Replace NA values with 0 for sensitivity variables
cleaned_data <- replace_na_values(
    indicator_rasters_sensitivity,
    replacement_value = 0,
    raster_col = "raster",
    variables_to_process = sensitivity_vars
)

# Harmonize geometries
harmonized_data <- check_and_harmonize_sensitivity_geometries(
    cleaned_data,
    raster_col = "raster_cleaned",
    method = "near"
)

cat("✓ Preprocessing dan harmonisasi geometri selesai\n")
✓ Preprocessing dan harmonisasi geometri selesai

7.3 Reklasifikasi Menggunakan Pendekatan Kuantil

# Update grid size to 1000m for consistency
sampling_grids <- trans_area %>%
    generate_grid_by_size(cellsize_m = 1000)

cat("✓ Dibuat", nrow(sampling_grids), "grid analisis (1000m x 1000m)\n")
✓ Dibuat 2079 grid analisis (1000m x 1000m)
# Calculate quantile breaks for reclassification
quantile_breaks <- calculate_quantile_breaks(
    harmonized_data,
    raster_col = "raster_harmonized"
)
Calculating quantile breaks for reclassification...
Quantile breaks calculated for 4 variables
# Apply quantile-based reclassification
reclassified_data <- apply_quantile_reclassification(
    harmonized_data,
    quantile_breaks,
    raster_col = "raster_harmonized",
    save_tables = TRUE
)
Applying quantile-based reclassification...
  Processing population_density_persons_per_ha ...
Saved reclassification table: data/reclass_table/population_density_persons_per_ha_classification.csv 
    Categories created: 1, 5 
  Processing built_area_percent ...
Saved reclassification table: data/reclass_table/built_area_percent_classification.csv 
    Categories created: 1, 5 
  Processing open_area_percent ...
Saved reclassification table: data/reclass_table/open_area_percent_classification.csv 
    Categories created: 1, 5 
  Processing coastal_vegetation_percent ...
Saved reclassification table: data/reclass_table/coastal_vegetation_percent_classification.csv 
    Categories created: 1, 5 
✅ Quantile reclassification completed for 4 variables
cat(
    "✓ Reklasifikasi kuantil selesai untuk",
    nrow(reclassified_data),
    "variabel\n"
)
✓ Reklasifikasi kuantil selesai untuk 4 variabel

7.4 Kerangka Klasifikasi Variabel Sensitivitas

# Create sensitivity classification framework
sensitivity_framework <- create_sensitivity_classification_framework()
Creating sensitivity variable classification framework...
✅ Sensitivity variable classification framework created
Variables classified: 4 
Component focus: Terrestrial sensitivity factors
# Display framework
knitr::kable(
    sensitivity_framework,
    caption = "Kerangka Klasifikasi Variabel Sensitivitas"
)
Kerangka Klasifikasi Variabel Sensitivitas
variable_name component variable_type data_source unit sensitivity_direction sensitivity_rationale extraction_method extraction_description classification_method classification_breaks sensitivity_ranks weighting_suggestion weighting_rationale data_quality_notes
population_density_persons_per_ha sensitivity continuous WorldPop persons/ha positive Higher population density increases vulnerability due to more people at risk sum Sum population density values within each grid cell percentile_based ≤10th percentile , 10-25th percentile, 25-75th percentile, 75-90th percentile, ≥90th percentile 1 (Very Low) , 2 (Low) , 3 (Medium) , 4 (High) , 5 (Very High) 0.3 Population density is a primary sensitivity factor - higher weight High quality global dataset, some NA values in unpopulated areas (normal)
built_area_percent sensitivity binary_proportion ICRAF percent positive More built-up area means more infrastructure and assets at risk percentage_coverage Calculate percentage of grid cell with built area (value = 1) proportion_thresholds <10% , 10-25%, 25-50%, 50-75%, >75% 1 (Very Low) , 2 (Low) , 3 (Medium) , 4 (High) , 5 (Very High) 0.3 Built-up area represents direct asset exposure - higher weight Binary classification from ICRAF land cover analysis
open_area_percent sensitivity binary_proportion ICRAF percent positive More open/abandoned area indicates less developed protective infrastructure percentage_coverage Calculate percentage of grid cell with open area (value = 1) proportion_thresholds <25% , 25-50%, 50-75%, 75-90%, >90% 1 (Very Low) , 2 (Low) , 3 (Medium) , 4 (High) , 5 (Very High) 0.2 Open area contributes to sensitivity but less critical - moderate weight Binary classification from ICRAF land cover analysis
coastal_vegetation_percent sensitivity binary_proportion ICRAF percent negative More coastal vegetation provides natural protection, reducing sensitivity percentage_coverage Calculate percentage of grid cell with coastal vegetation (value = 1) inverse_proportion_thresholds >75% (protective) , 50-75% , 25-50% , <25% , 0% (no protection) 1 (Very Low) , 2 (Low) , 3 (Medium) , 4 (High) , 5 (Very High) 0.2 Vegetation provides protection but is secondary factor - moderate weight Binary classification from ICRAF coastal vegetation mapping

7.5 Ekstraksi Nilai dan Klasifikasi Berbasis Ambang Batas

# Extract values and apply threshold-based classification
complete_results <- extract_and_classify_sensitivity(
    reclassified_data,
    sampling_grids,
    sensitivity_framework
)
=== SENSITIVITY VALUE EXTRACTION AND CLASSIFICATION ===

Step 1: Extracting values using zonal statistics...
Extracting sensitivity values using zonal statistics...
  Processing population_density_persons_per_ha using sum ...
    Extracted values range: 0 to 11745.65 
  Processing built_area_percent using percentage_coverage ...
    Extracted values range: 0 to 98 
  Processing open_area_percent using percentage_coverage ...
    Extracted values range: 0 to 23 
  Processing coastal_vegetation_percent using percentage_coverage ...
    Extracted values range: 0 to 51 
✅ Zonal statistics extraction completed for 4 variables

Step 2: Applying InVEST-style classification...
Applying InVEST-style classification to extracted values...
  Classifying population_density_persons_per_ha using percentile_based ...
    Percentile breaks: 0, 0, 39.26, 488.72 
    Sensitivity ranks: 1 = 1508, 3 = 51, 4 = 312, 5 = 208 
  Classifying built_area_percent using proportion_thresholds ...
    Sensitivity ranks: 1 = 1991, 2 = 36, 3 = 32, 4 = 7, 5 = 13 
  Classifying open_area_percent using proportion_thresholds ...
    Sensitivity ranks: 1 = 2079 
  Classifying coastal_vegetation_percent using inverse_proportion_thresholds ...
    Sensitivity ranks: 2 = 3, 3 = 38, 4 = 649, 5 = 1389 
✅ InVEST-style classification completed for 4 variables

Step 3: Combining results...
✅ Complete sensitivity extraction and classification workflow finished
Grids processed: 2079 
Variables processed: 4 
spatial_results <- complete_results$spatial_results
cat(
    "✓ Ekstraksi dan klasifikasi selesai untuk",
    nrow(spatial_results),
    "grid\n"
)
✓ Ekstraksi dan klasifikasi selesai untuk 2079 grid
# Display sample of results
sample_results <- spatial_results %>%
    st_drop_geometry() %>%
    select(ID, ends_with("_rank")) %>%
    head(10)

knitr::kable(
    sample_results,
    caption = "Contoh Hasil Klasifikasi Sensitivitas (10 grid pertama)"
)
Contoh Hasil Klasifikasi Sensitivitas (10 grid pertama)
ID population_density_persons_per_ha_rank built_area_percent_rank open_area_percent_rank coastal_vegetation_percent_rank
6 4 1 1 5
10 1 1 1 5
15 1 1 1 5
16 1 1 1 5
19 1 1 1 4
20 1 1 1 4
21 4 1 1 5
25 1 1 1 5
26 4 1 1 5
29 5 1 1 5

8. Perhitungan Indeks Sensitivitas dan Visualisasi

8.1 Perhitungan Indeks Menggunakan Geometric Mean

# Calculate weighted sensitivity index
sensitivity_results_weighted <- calculate_sensitivity_index(
    spatial_results,
    sensitivity_framework,
    use_weights = TRUE
)
Calculating sensitivity index using geometric mean...
Using rank columns: population_density_persons_per_ha_rank, built_area_percent_rank, open_area_percent_rank, coastal_vegetation_percent_rank 
Using weighted geometric mean with weights: 0.3, 0.3, 0.2, 0.2 
Processing 2079 grids...

Sensitivity Index Summary:
  Range: 1.149 to 3.624 
  Mean: 1.593 
  Median: 1.38 
  Standard deviation: 0.423 

Sensitivity Class Distribution:
   High : 13 ( 0.6 %)
   Low : 516 ( 24.8 %)
   Medium : 57 ( 2.7 %)
   Very Low : 1493 ( 71.8 %)
✅ Sensitivity index calculation completed
# Calculate unweighted sensitivity index for comparison
sensitivity_results_unweighted <- calculate_sensitivity_index(
    spatial_results,
    sensitivity_framework,
    use_weights = FALSE
)
Calculating sensitivity index using geometric mean...
Using rank columns: population_density_persons_per_ha_rank, built_area_percent_rank, open_area_percent_rank, coastal_vegetation_percent_rank 
Using unweighted geometric mean (equal weights)
Processing 2079 grids...

Sensitivity Index Summary:
  Range: 1.189 to 3.344 
  Mean: 1.668 
  Median: 1.495 
  Standard deviation: 0.363 

Sensitivity Class Distribution:
   Low : 516 ( 24.8 %)
   Medium : 70 ( 3.4 %)
   Very Low : 1493 ( 71.8 %)
✅ Sensitivity index calculation completed
# Create comparison
comparison <- tibble(
    grid_id = sensitivity_results_weighted$ID,
    weighted_index = sensitivity_results_weighted$sensitivity_index,
    unweighted_index = sensitivity_results_unweighted$sensitivity_index,
    weighted_class = sensitivity_results_weighted$sensitivity_class,
    unweighted_class = sensitivity_results_unweighted$sensitivity_class,
    difference = weighted_index - unweighted_index
)

cat("✓ Perhitungan indeks sensitivitas selesai\n")
✓ Perhitungan indeks sensitivitas selesai

8.2 Statistik Ringkasan

STATISTIK INDEKS SENSITIVITAS DENGAN BOBOT:
==========================================
Rentang: 1.149 hingga 3.624 
Rata-rata: 1.593 
Median: 1.38 
Standar deviasi: 0.423 
Distribusi Kelas Sensitivitas
Kelas Sensitivitas Jumlah Grid Persentase (%)
High 13 0.6
Low 516 24.8
Medium 57 2.7
Very Low 1493 71.8

8.3 Analisis Kontribusi Komponen

Kontribusi Rata-rata Komponen terhadap Sensitivitas (%)
Kontribusi (%)
Kepadatan Populasi 20.0
Lahan Terbangun 12.6
Lahan Terbuka 12.0
Vegetasi Pesisir 55.3

8.4 Peta Interaktif Indeks Sensitivitas

# Load required libraries for visualization
library(leaflet)
library(RColorBrewer)
library(htmlwidgets)

# Transform to WGS84 for leaflet
sensitivity_wgs84 <- sensitivity_results_weighted %>%
    st_transform(4326)

# Define sensitivity classes and colors
sensitivity_classes <- c("Very Low", "Low", "Medium", "High", "Very High")
class_colors <- c("#2166ac", "#67a9cf", "#f7f7f7", "#ef8a62", "#b2182b")

# Create color palette
pal <- colorFactor(
    palette = class_colors,
    domain = sensitivity_classes,
    na.color = "transparent"
)

# Create popup content
create_popup_content <- function(data) {
    paste0(
        "<strong>ID Grid:</strong> ",
        data$ID,
        "<br>",
        "<strong>Indeks Sensitivitas:</strong> ",
        round(data$sensitivity_index, 3),
        "<br>",
        "<strong>Kelas Sensitivitas:</strong> ",
        data$sensitivity_class,
        "<br>",
        "<strong>Kepadatan Populasi:</strong> ",
        round(data$population_density_persons_per_ha_sum, 1),
        " jiwa/ha<br>",
        "<strong>Lahan Terbangun:</strong> ",
        data$built_area_percent_pct,
        "%<br>",
        "<strong>Lahan Terbuka:</strong> ",
        data$open_area_percent_pct,
        "%<br>",
        "<strong>Vegetasi Pesisir:</strong> ",
        data$coastal_vegetation_percent_pct,
        "%"
    )
}

# Create the main sensitivity map
sensitivity_map <- leaflet(sensitivity_wgs84) %>%
    addProviderTiles(providers$CartoDB.Positron, group = "Peta Dasar") %>%
    addProviderTiles(providers$Esri.WorldImagery, group = "Citra Satelit") %>%
    addPolygons(
        fillColor = ~ pal(sensitivity_class),
        weight = 0.5,
        opacity = 0.7,
        color = "white",
        dashArray = "",
        fillOpacity = 0.8,
        popup = ~ create_popup_content(sensitivity_wgs84),
        highlight = highlightOptions(
            weight = 2,
            color = "#666",
            dashArray = "",
            fillOpacity = 0.9,
            bringToFront = TRUE
        ),
        group = "Indeks Sensitivitas"
    ) %>%
    addLegend(
        pal = pal,
        values = ~sensitivity_class,
        opacity = 0.8,
        title = "Kelas Sensitivitas",
        position = "bottomright"
    ) %>%
    addLayersControl(
        baseGroups = c("Peta Dasar", "Citra Satelit"),
        overlayGroups = c("Indeks Sensitivitas"),
        options = layersControlOptions(collapsed = FALSE)
    ) %>%
    setView(lng = 120.5, lat = -1.0, zoom = 10)

# Display the map
sensitivity_map

8.5 Ekspor Hasil

# Create output directory
output_dir <- "dataPreprocessed/05SensitivityIndex"
if (!dir.exists(output_dir)) {
    dir.create(output_dir, recursive = TRUE)
}

# Simplify column names for shapefile compatibility
simplify_column_names <- function(sf_obj) {
    name_mapping <- c(
        "population_density_persons_per_ha_sum" = "pop_dens",
        "built_area_percent_pct" = "built_pct",
        "open_area_percent_pct" = "open_pct",
        "coastal_vegetation_percent_pct" = "veg_pct",
        "population_density_persons_per_ha_rank" = "pop_rank",
        "built_area_percent_rank" = "built_rank",
        "open_area_percent_rank" = "open_rank",
        "coastal_vegetation_percent_rank" = "veg_rank",
        "sensitivity_index" = "sens_idx",
        "sensitivity_class" = "sens_class"
    )

    current_names <- names(sf_obj)
    for (old_name in names(name_mapping)) {
        if (old_name %in% current_names) {
            names(sf_obj)[names(sf_obj) == old_name] <- name_mapping[old_name]
        }
    }

    return(sf_obj)
}

# Export results
sensitivity_weighted_simple <- simplify_column_names(
    sensitivity_results_weighted
)

st_write(
    sensitivity_weighted_simple,
    file.path(output_dir, "sensitivity_index_weighted.shp"),
    quiet = TRUE,
    delete_dsn = TRUE
)

# Export comparison table
write_csv(
    comparison,
    file.path(output_dir, "sensitivity_index_comparison.csv")
)

cat("✓ Hasil diekspor ke:", output_dir, "\n")
✓ Hasil diekspor ke: dataPreprocessed/05SensitivityIndex 
cat("- sensitivity_index_weighted.shp: Hasil indeks sensitivitas dengan bobot\n")
- sensitivity_index_weighted.shp: Hasil indeks sensitivitas dengan bobot
cat(
    "- sensitivity_index_comparison.csv: Tabel perbandingan dengan bobot vs tanpa bobot\n"
)
- sensitivity_index_comparison.csv: Tabel perbandingan dengan bobot vs tanpa bobot

Intervensi untuk mengurangi kerentanan

1. Buat lookup table daftar intervensi

  • contoh: land cover, variabel sosial ekonomi

2. Terapkan intervensi pada masing-masing peta indikator

3. Hitung ulang peta indeks kerentanan pesisir

  • Agregasi nilai tiap indikator menjadi tiga kategori utama: paparan, sensitivitas, dan kapabilitas adaptasi (3 peta)

  • agregasi menjadi indeks tunggal (1 peta)