library(sf)
## Linking to GEOS 3.13.1, GDAL 3.11.0, PROJ 9.6.0; sf_use_s2() is TRUE
library(ggplot2)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
# Baca shapefile (misalnya kabupaten/kota di Jawa Tengah)
peta <- st_read("C:/Users/ASUS/Downloads/33.21_Demak/33.21_kecamatan.geojson")
## Reading layer `33.21_kecamatan' from data source
## `C:\Users\ASUS\Downloads\33.21_Demak\33.21_kecamatan.geojson'
## using driver `GeoJSON'
## Simple feature collection with 14 features and 4 fields
## Geometry type: MULTIPOLYGON
## Dimension: XYZ
## Bounding box: xmin: 110.4772 ymin: -7.1482 xmax: 110.8336 ymax: -6.708177
## z_range: zmin: 0 zmax: 0
## Geodetic CRS: WGS 84
# Cek kolom yang ada
names(peta)
## [1] "kd_propinsi" "kd_dati2" "kd_kecamatan" "nm_kecamatan" "geometry"
head(peta)
## Simple feature collection with 6 features and 4 fields
## Geometry type: MULTIPOLYGON
## Dimension: XYZ
## Bounding box: xmin: 110.4772 ymin: -7.1482 xmax: 110.7155 ymax: -6.834859
## z_range: zmin: 0 zmax: 0
## Geodetic CRS: WGS 84
## kd_propinsi kd_dati2 kd_kecamatan nm_kecamatan geometry
## 1 33 21 001 Mranggen MULTIPOLYGON Z (((110.5342 ...
## 2 33 21 002 Karangawen MULTIPOLYGON Z (((110.5616 ...
## 3 33 21 003 Guntur MULTIPOLYGON Z (((110.5804 ...
## 4 33 21 004 Sayung MULTIPOLYGON Z (((110.5233 ...
## 5 33 21 005 Karangtengah MULTIPOLYGON Z (((110.5845 ...
## 6 33 21 006 Wonosalam MULTIPOLYGON Z (((110.666 -...
# Baca data pencemaran yang sudah kamu punya
data_pencemaran <- read.csv("C:/Users/ASUS/Downloads/lingkungan_demak.csv")
peta
## Simple feature collection with 14 features and 4 fields
## Geometry type: MULTIPOLYGON
## Dimension: XYZ
## Bounding box: xmin: 110.4772 ymin: -7.1482 xmax: 110.8336 ymax: -6.708177
## z_range: zmin: 0 zmax: 0
## Geodetic CRS: WGS 84
## First 10 features:
## kd_propinsi kd_dati2 kd_kecamatan nm_kecamatan
## 1 33 21 001 Mranggen
## 2 33 21 002 Karangawen
## 3 33 21 003 Guntur
## 4 33 21 004 Sayung
## 5 33 21 005 Karangtengah
## 6 33 21 006 Wonosalam
## 7 33 21 007 Dempet
## 8 33 21 008 Gajah
## 9 33 21 009 Karanganyar
## 10 33 21 010 Mijen
## geometry
## 1 MULTIPOLYGON Z (((110.5342 ...
## 2 MULTIPOLYGON Z (((110.5616 ...
## 3 MULTIPOLYGON Z (((110.5804 ...
## 4 MULTIPOLYGON Z (((110.5233 ...
## 5 MULTIPOLYGON Z (((110.5845 ...
## 6 MULTIPOLYGON Z (((110.666 -...
## 7 MULTIPOLYGON Z (((110.7321 ...
## 8 MULTIPOLYGON Z (((110.7297 ...
## 9 MULTIPOLYGON Z (((110.7746 ...
## 10 MULTIPOLYGON Z (((110.709 -...
# Simulasi data lingkungan untuk tiap kecamatan di Demak
set.seed(123) # supaya hasil konsisten
data_lingkungan <- data.frame(
Kecamatan = peta$nm_kecamatan, # pakai nama kolom dari shapefile
PM25 = sample(25:50, length(peta$nm_kecamatan), replace = TRUE), # µg/m³
SO2 = sample(5:15, length(peta$nm_kecamatan), replace = TRUE), # µg/m³
NO2 = sample(12:25, length(peta$nm_kecamatan), replace = TRUE), # µg/m³
Suhu = round(runif(length(peta$nm_kecamatan), 28, 31), 1), # °C
Mangrove = sample(5:25, length(peta$nm_kecamatan), replace = TRUE), # %
Abrasi = round(runif(length(peta$nm_kecamatan), 0.5, 7), 1) # m/tahun
)
# Lihat hasil
print(data_lingkungan)
## Kecamatan PM25 SO2 NO2 Suhu Mangrove Abrasi
## 1 Mranggen 39 15 15 30.6 17 6.3
## 2 Karangawen 43 9 25 28.1 22 6.3
## 3 Guntur 38 7 12 29.3 5 1.6
## 4 Sayung 27 15 22 30.4 10 1.3
## 5 Karangtengah 34 13 18 28.4 25 4.7
## 6 Wonosalam 42 13 16 29.7 19 2.7
## 7 Dempet 46 13 23 28.6 13 4.8
## 8 Gajah 35 7 21 28.4 19 2.6
## 9 Karanganyar 29 12 24 30.3 20 1.7
## 10 Mijen 44 14 18 30.7 24 5.6
## 11 Demak 38 11 20 29.1 10 1.1
## 12 Bonang 46 14 20 30.0 15 3.5
## 13 Wedung 49 13 21 28.3 12 3.8
## 14 Kebonagung 50 7 18 29.2 11 4.4
# Gabungkan data dengan peta
peta_data <- left_join(
peta,
data_lingkungan,
by = c("nm_kecamatan" = "Kecamatan")
)
peta_data
## Simple feature collection with 14 features and 10 fields
## Geometry type: MULTIPOLYGON
## Dimension: XYZ
## Bounding box: xmin: 110.4772 ymin: -7.1482 xmax: 110.8336 ymax: -6.708177
## z_range: zmin: 0 zmax: 0
## Geodetic CRS: WGS 84
## First 10 features:
## kd_propinsi kd_dati2 kd_kecamatan nm_kecamatan PM25 SO2 NO2 Suhu Mangrove
## 1 33 21 001 Mranggen 39 15 15 30.6 17
## 2 33 21 002 Karangawen 43 9 25 28.1 22
## 3 33 21 003 Guntur 38 7 12 29.3 5
## 4 33 21 004 Sayung 27 15 22 30.4 10
## 5 33 21 005 Karangtengah 34 13 18 28.4 25
## 6 33 21 006 Wonosalam 42 13 16 29.7 19
## 7 33 21 007 Dempet 46 13 23 28.6 13
## 8 33 21 008 Gajah 35 7 21 28.4 19
## 9 33 21 009 Karanganyar 29 12 24 30.3 20
## 10 33 21 010 Mijen 44 14 18 30.7 24
## Abrasi geometry
## 1 6.3 MULTIPOLYGON Z (((110.5342 ...
## 2 6.3 MULTIPOLYGON Z (((110.5616 ...
## 3 1.6 MULTIPOLYGON Z (((110.5804 ...
## 4 1.3 MULTIPOLYGON Z (((110.5233 ...
## 5 4.7 MULTIPOLYGON Z (((110.5845 ...
## 6 2.7 MULTIPOLYGON Z (((110.666 -...
## 7 4.8 MULTIPOLYGON Z (((110.7321 ...
## 8 2.6 MULTIPOLYGON Z (((110.7297 ...
## 9 1.7 MULTIPOLYGON Z (((110.7746 ...
## 10 5.6 MULTIPOLYGON Z (((110.709 -...
library(ggplot2)
# Buat titik centroid untuk posisi label
centroid <- st_centroid(peta_data)
## Warning: st_centroid assumes attributes are constant over geometries
## st_as_s2(): dropping Z and/or M coordinate
# Plot choropleth dengan nama kecamatan
ggplot(peta_data) +
geom_sf(aes(fill = PM25), color = "white", size = 0.3) +
geom_sf_text(data = centroid, aes(label = nm_kecamatan),
size = 2, color = "black") +
scale_fill_gradient(low="yellow", high="blue", name="PM2.5") +
theme_minimal() +
labs(title = "Sebaran PM2.5 per Kecamatan di Demak",
fill = "PM2.5 (µg/m³)")
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data
Keterangan: Hasil visualisasi menenjukan bahwa konsentrasi PM2.5 di Kabupaten Demak berada pada kisaran 30 hingga 50 µg/m³. Kecamatan dengan nilai tertinggi tampak berada di bagian utara seperti Wedung dan di pesisir timur seperti Kebonagung, yang ditunjukkan dengan warna biru tua pada peta (mendekati 50 µg/m³). Sementara itu, konsentrasi terendah terlihat di wilayah barat seperti Sayung dan timur laut Karanganyar, dengan warna kuning terang (sekitar 30 µg/m³). Sebagian besar kecamatan lain berada pada rentang menengah, yaitu sekitar 35–45 µg/m³, ditandai dengan warna ungu ke cokelatan. Distribusi ini menegaskan adanya variasi spasial dalam tingkat pencemaran udara, di mana kecamatan pesisir dan padat aktivitas cenderung menunjukkan polusi lebih tinggi dibandingkan kecamatan lain. Pola ini menggambarkan adanya perbedaan distribusi polusi udara di wilayah Demak, yang kemungkinan dipengaruhi oleh faktor aktivitas industri, kepadatan transportasi, maupun kondisi geografis tiap kecamatan. Visualisasi ini membantu mengidentifikasi kecamatan dengan kualitas udara yang relatif lebih buruk sehingga dapat menjadi dasar untuk perencanaan kebijakan lingkungan bagi pemerintah kabupaten demak.
library(tidyr)
# reshape data long
peta_long <- peta_data %>%
pivot_longer(cols = c(PM25, SO2, NO2),
names_to = "Variabel", values_to = "Nilai")
# facet map
facet_map <- ggplot(peta_long) +
geom_sf(aes(fill = Nilai, geometry = geometry), color = "black", size = 0.2) +
geom_sf_text(data = centroid, aes(label = nm_kecamatan, geometry = geometry),
inherit.aes = FALSE, size = 1.7, color = "white", check_overlap = TRUE) +
scale_fill_viridis_c() +
facet_wrap(~Variabel) +
theme_minimal() +
labs(title = "Perbandingan Polutan Udara per Kecamatan di Kabupaten Demak",
fill = "Nilai")
print(facet_map)
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data
ggsave("facet_polutan_demak.png", facet_map, width = 10, height = 4)
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data
Keterangan: Polutan dominan : PM₂.₅ menjadi masalah utama dengan sebaran tinggi di banyak kecamatan. Wilayah paling terdampak: Utara (Wedung) dan Timur (Kebonagung, Dempet) dengan konsentrasi tertinggi PM₂.₅. Polutan rendah : SO₂ relatif tidak signifikan di Demak. Implikasi : Upaya pengendalian kualitas udara di Kabupaten Demak sebaiknya diprioritaskan pada penurunan PM₂.₅, terutama di kawasan pesisir dan wilayah padat aktivitas. Visualisasi menunjukkan bahwa sebaran polutan udara di Kabupaten Demak bervariasi antar kecamatan, di mana konsentrasi NO₂ berada pada tingkat sedang dengan nilai lebih tinggi di wilayah selatan-tengah seperti Guntur, sedangkan SO₂ relatif rendah dan merata di seluruh kecamatan (sekitar 10–20 µg/m³). Polutan dengan konsentrasi paling dominan adalah PM₂.₅, yang mencapai 40–50 µg/m³ di wilayah utara (Wedung) serta timur (Dempet dan Kebonagung), sementara kecamatan lain berada pada kategori menengah (30–40 µg/m³). Hal ini menunjukkan bahwa PM₂.₅ merupakan polutan utama yang perlu mendapat prioritas pengendalian di Demak, khususnya pada wilayah dengan konsentrasi tinggi, untuk menjaga kualitas udara dan kesehatan masyarakat.
library(ggplot2)
bubble_plot <- ggplot(peta_data,
aes(x = Mangrove, y = Abrasi,
size = PM25, color = nm_kecamatan)) +
geom_point(alpha = 0.7) +
geom_text(aes(label = nm_kecamatan),
vjust = -1, size = 3, show.legend = FALSE) +
scale_size(range = c(3, 10), name = "PM2.5 (µg/m³)") +
theme_minimal() +
labs(title = "Hubungan Luas Mangrove dan Tingkat Abrasi di Demak",
x = "Luas Mangrove (ha)",
y = "Tingkat Abrasi (m/tahun)",
color = "Kecamatan")
print(bubble_plot)
# simpan hasil
ggsave("bubble_mangrove_abrasi.png", bubble_plot, width = 8, height = 6)
Keterangan: Grafik bubble plot menggambarkan hubungan luas mangrove (sumbu X) dengan tingkat abrasi (sumbu Y) di Kabupaten Demak, dengan ukuran gelembung mewakili konsentrasi PM2.5. Hasil visualisasi menunjukkan bahwa kecamatan pesisir dengan mangrove luas, seperti Karangtengah atau Kebonagung, umumnya mengalami abrasi pada tingkat sedang hingga tinggi. Sementara itu, wilayah non-pesisir seperti Karangawen muncul tanpa mangrove, tetapi tetap tercatat dengan tingkat abrasi tinggi karena faktor lingkungan lain. Sebaliknya, Sayung dan Demak justru memiliki abrasi rendah meski mangrove terbatas. Variasi ukuran gelembung juga memperlihatkan distribusi pencemaran udara PM2.5, sehingga secara keseluruhan grafik ini menegaskan bahwa abrasi dan kualitas udara tidak hanya dipengaruhi oleh keberadaan mangrove, melainkan juga kondisi fisik wilayah dan aktivitas manusia.