Tugas Praktikum 3 (Visualisasi Data Spasial)

Author

Kelompok 2

  1. Rosita Ria Rusesta (M0501251016)
  2. Nurita Suci Lestari (M0501251034)
  3. Freditasari Purwa Hidayat (M0501251052)

Data

Peta yang digunakan adalah Peta Administratif tingkat Kabupaten/Kota seluruh Indonesia (Update 2020) yang didapat dari Praktikum 3. Data tabular yang digunakan adalah Persentase Penduduk Miskin Menurut Kabupaten/Kota Tahun 2024 yang bersumber dari BPS. Lokus wilayah yang digunakan adalah Kabupaten/Kota di Provinsi DI Yogyakarta. Link Sumber Data

Memanggil Library

library(sf)           # mengelola dan menganalisis data geospasial
Linking to GEOS 3.13.1, GDAL 3.11.0, PROJ 9.6.0; sf_use_s2() is TRUE
library(tidyverse)    # memanipulasi data dan visualisasi
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   4.0.0     ✔ tibble    3.3.0
✔ lubridate 1.9.4     ✔ tidyr     1.3.1
✔ purrr     1.1.0     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(ggspatial)    # menambahkan elemen spasial ke dalam plot yang dibuat dengan ggplot2
library(prettymapr)   # membuat peta yang lebih estetik
library(dplyr)        # manipulasi data, melakukan operasi data frame
library(terra)
terra 1.8.60

Attaching package: 'terra'

The following object is masked from 'package:tidyr':

    extract
library(ggsflabel)

Attaching package: 'ggsflabel'

The following objects are masked from 'package:ggplot2':

    geom_sf_label, geom_sf_text, StatSfCoordinates
library(ggplot2)

Import Data Spasial dan Tabular

Import Data Spasial

# import data spasial
kab_indo <- st_read("C:/Users/Rosita/Downloads/Kelompok_2_VisualisasiDataSpasial/idn_admbnda_adm2_bps_20200401.shp")
Reading layer `idn_admbnda_adm2_bps_20200401' from data source 
  `C:\Users\Rosita\Downloads\Kelompok_2_VisualisasiDataSpasial\idn_admbnda_adm2_bps_20200401.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 522 features and 14 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 95.01079 ymin: -11.00762 xmax: 141.0194 ymax: 6.07693
Geodetic CRS:  WGS 84
kab_indo
Simple feature collection with 522 features and 14 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 95.01079 ymin: -11.00762 xmax: 141.0194 ymax: 6.07693
Geodetic CRS:  WGS 84
First 10 features:
   Shape_Leng Shape_Area         ADM2_EN ADM2_PCODE ADM2_REF ADM2ALT1EN
1    2.360029  0.2289681      Aceh Barat     ID1107     <NA>       <NA>
2    1.963994  0.1541359 Aceh Barat Daya     ID1112     <NA>       <NA>
3    4.590182  0.2363958      Aceh Besar     ID1108     <NA>       <NA>
4    3.287754  0.3161611       Aceh Jaya     ID1116     <NA>       <NA>
5    4.448584  0.3430383    Aceh Selatan     ID1103     <NA>       <NA>
6    4.907219  0.1534414    Aceh Singkil     ID1102     <NA>       <NA>
7    2.593385  0.1745672    Aceh Tamiang     ID1114     <NA>       <NA>
8    3.676889  0.3834894     Aceh Tengah     ID1106     <NA>       <NA>
9    3.473021  0.3374562   Aceh Tenggara     ID1104     <NA>       <NA>
10   5.037148  0.4434042      Aceh Timur     ID1105     <NA>       <NA>
   ADM2ALT2EN ADM1_EN ADM1_PCODE   ADM0_EN ADM0_PCODE       date    validOn
1        <NA>    Aceh       ID11 Indonesia         ID 2019-12-20 2020-04-01
2        <NA>    Aceh       ID11 Indonesia         ID 2019-12-20 2020-04-01
3        <NA>    Aceh       ID11 Indonesia         ID 2019-12-20 2020-04-01
4        <NA>    Aceh       ID11 Indonesia         ID 2019-12-20 2020-04-01
5        <NA>    Aceh       ID11 Indonesia         ID 2019-12-20 2020-04-01
6        <NA>    Aceh       ID11 Indonesia         ID 2019-12-20 2020-04-01
7        <NA>    Aceh       ID11 Indonesia         ID 2019-12-20 2020-04-01
8        <NA>    Aceh       ID11 Indonesia         ID 2019-12-20 2020-04-01
9        <NA>    Aceh       ID11 Indonesia         ID 2019-12-20 2020-04-01
10       <NA>    Aceh       ID11 Indonesia         ID 2019-12-20 2020-04-01
   validTo                       geometry
1     <NA> MULTIPOLYGON (((96.26836 4....
2     <NA> MULTIPOLYGON (((96.80559 3....
3     <NA> MULTIPOLYGON (((95.20544 5....
4     <NA> MULTIPOLYGON (((95.58431 4....
5     <NA> MULTIPOLYGON (((97.59461 2....
6     <NA> MULTIPOLYGON (((97.39178 2....
7     <NA> MULTIPOLYGON (((98.27612 4....
8     <NA> MULTIPOLYGON (((96.64762 4....
9     <NA> MULTIPOLYGON (((97.82461 3....
10    <NA> MULTIPOLYGON (((98.01772 4....

Filter Peta Kabupaten/Kota di Provinsi D I Yogyakarta

# memfilter data spasial hanya Provinsi D I Yogyakarta
diy_kabkot <- kab_indo %>%
  filter(ADM1_EN == "Daerah Istimewa Yogyakarta")
diy_kabkot
Simple feature collection with 5 features and 14 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 110.003 ymin: -8.20401 xmax: 110.8346 ymax: -7.541895
Geodetic CRS:  WGS 84
  Shape_Leng  Shape_Area         ADM2_EN ADM2_PCODE ADM2_REF ADM2ALT1EN
1  1.8320763 0.042281185          Bantul     ID3402     <NA>       <NA>
2  2.3936529 0.120912448    Gunung Kidul     ID3403     <NA>       <NA>
3  0.3413777 0.002697579 Kota Yogyakarta     ID3471     <NA>       <NA>
4  1.2755465 0.047138869     Kulon Progo     ID3401     <NA>       <NA>
5  1.5309696 0.047099670          Sleman     ID3404     <NA>       <NA>
  ADM2ALT2EN                    ADM1_EN ADM1_PCODE   ADM0_EN ADM0_PCODE
1       <NA> Daerah Istimewa Yogyakarta       ID34 Indonesia         ID
2       <NA> Daerah Istimewa Yogyakarta       ID34 Indonesia         ID
3       <NA> Daerah Istimewa Yogyakarta       ID34 Indonesia         ID
4       <NA> Daerah Istimewa Yogyakarta       ID34 Indonesia         ID
5       <NA> Daerah Istimewa Yogyakarta       ID34 Indonesia         ID
        date    validOn validTo                       geometry
1 2019-12-20 2020-04-01    <NA> MULTIPOLYGON (((110.351 -7....
2 2019-12-20 2020-04-01    <NA> MULTIPOLYGON (((110.8198 -8...
3 2019-12-20 2020-04-01    <NA> MULTIPOLYGON (((110.3591 -7...
4 2019-12-20 2020-04-01    <NA> MULTIPOLYGON (((110.2554 -7...
5 2019-12-20 2020-04-01    <NA> MULTIPOLYGON (((110.4531 -7...
# menampilkan peta Kab/Kota di Provinsi D I Yogyakarta
diy_kabkot %>%                                                                         # ingin menampilkan peta dari data frame diy_kabkota
  ggplot()+                                                                            # memulai pembuatan grafik kosong
  geom_sf()+                                                                           # menampilkan peta
  ggsflabel::geom_sf_label_repel(aes(label=str_wrap(ADM2_EN, width = 1)), size=1.75)+  # ggsflabel untuk menambahkan label pada peta, geom_sf_label_repel agar label tidak tumpang tindih, str_wrap memisahkan 2 kata menjadi 2 baris, size untuk mengatur ukuran label
  theme_bw()+                                                                          # memilih tema black and white
  theme(axis.title = element_blank())                                                  # menghapus label sumbu (axis titles)
Warning in st_point_on_surface.sfc(data$geometry): st_point_on_surface may not
give correct results for longitude/latitude data

Import Data Tabular

# import data tabular
poverty_indo <- read_csv("C:/Users/Rosita/Downloads/Kelompok_2_VisualisasiDataSpasial/poverty-2024.csv")
Rows: 552 Columns: 2
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Nama Wilayah
dbl (1): Persentase

ℹ 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.
poverty_indo
# A tibble: 552 × 2
   `Nama Wilayah` Persentase
   <chr>               <dbl>
 1 ACEH                 14.2
 2 Simeulue             17.7
 3 Aceh Singkil         19.1
 4 Aceh Selatan         12.0
 5 Aceh Tenggara        12.0
 6 Aceh Timur           13.3
 7 Aceh Tengah          14.3
 8 Aceh Barat           17.6
 9 Aceh Besar           13.2
10 Pidie                18.6
# ℹ 542 more rows

Filter Data Kabupaten/Kota di Provinsi D I Yogyakarta

# memfilter data tabular hanya Kab/Kota di Provinsi D I Yogyakarta
poverty_diy <- poverty_indo %>% 
  filter(row_number() > which(poverty_indo$`Nama Wilayah` == "D I YOGYAKARTA") &        # memfilter baris dari kolom Nama Variabel setelah D I Yogyakarta
         row_number() <= (which(poverty_indo$`Nama Wilayah` == "D I YOGYAKARTA") + 5))  # sebanyak 5 baris karena jumlah Kab/Kota DI Yogyakarta ada 5
poverty_diy                                                                             # menampilkan hasil filter, pastikan penamaan Kab/Kota sudah sama dgn data spasial
# A tibble: 5 × 2
  `Nama Wilayah`  Persentase
  <chr>                <dbl>
1 Kulon Progo          15.6 
2 Bantul               11.7 
3 Gunung Kidul         15.2 
4 Sleman                7.46
5 Kota Yogyakarta       6.26

Mengatur Peta

Menampilkan Peta dari OpenStreetMap

# menampilkan sistem informasi koordinat (CRS) dari data spasial yg digunakan
st_crs(3857)$proj4string         # menampilkan CRS EPSG:3857
[1] "+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs"
st_crs(diy_kabkot)$proj4string   # menampilkan CRS dari data spasial yg digunakan
[1] "+proj=longlat +datum=WGS84 +no_defs"
  • EPSG:3857 adalah sistem proyeksi Web Mercator. Web Mercator (EPSG:3857) merupakan proyeksi yang sering digunakan oleh peta digital dan aplikasi pemetaan seperti OpenStreetMap.
# mengubah (transformasi) CRS data spasial yg digunakan menjadi Web Mercator (EPSG:3857)
diy_kabkot_osm <- diy_kabkot %>%
  st_transform(3857)                # mengubah/transformasi CRS data spasial yg digunakan
st_crs(diy_kabkot_osm)$proj4string  # menampilkan CRS dari data spasial yg digunakan setelah ditransformasi
[1] "+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs"
diy_kabkot_osm %>% ggplot() +                                                           # membuat plot menggunakan data spasial diy_kabkot_osm
    annotation_map_tile(type = "osm", zoomin = 0) +                                     # menambahkan peta OpenStreetMap sebagai latar belakang pada plot
    geom_sf() +                                                                         # membuat peta (menambahkan geometri spasial ke peta berdasarkan data diy_kabkot_osm)
    ggsflabel::geom_sf_label_repel(aes(label=str_wrap(ADM2_EN,width = 1)),size=1.75) +  # menambahkan label Kab/Kota dari kolom ADM2_EN, geom_sf_label_repel agar label tidak bertumpuk, str_wrap untuk memgatur agar teks tidak terlalu panjang
    theme_bw() +                                                                        # memilih tema black and white
    theme(axis.title = element_blank())   
Zoom: 10

Menggabungkan Data Spasial dan Data Tabular

# menggunakan full join untuk mengidentifikasi nama Kab/Kota yg digunakan pada data spasial dan data tabular sudah sama, kemudian menampilkan seluruh kolom 
diy_p0 <- diy_kabkot %>%  full_join(y = poverty_diy,                          # full join antara data spasial dan data tabular
                                    by = join_by(ADM2_EN == `Nama Wilayah`))  # berdasarkan nama Kab/Kota, pada data spasial nama kolom Kab/Kota adalah ADM2_EN, pada data tabular nama kolom Kab/Kota adalah Nama Wilayah
diy_p0
Simple feature collection with 5 features and 15 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 110.003 ymin: -8.20401 xmax: 110.8346 ymax: -7.541895
Geodetic CRS:  WGS 84
  Shape_Leng  Shape_Area         ADM2_EN ADM2_PCODE ADM2_REF ADM2ALT1EN
1  1.8320763 0.042281185          Bantul     ID3402     <NA>       <NA>
2  2.3936529 0.120912448    Gunung Kidul     ID3403     <NA>       <NA>
3  0.3413777 0.002697579 Kota Yogyakarta     ID3471     <NA>       <NA>
4  1.2755465 0.047138869     Kulon Progo     ID3401     <NA>       <NA>
5  1.5309696 0.047099670          Sleman     ID3404     <NA>       <NA>
  ADM2ALT2EN                    ADM1_EN ADM1_PCODE   ADM0_EN ADM0_PCODE
1       <NA> Daerah Istimewa Yogyakarta       ID34 Indonesia         ID
2       <NA> Daerah Istimewa Yogyakarta       ID34 Indonesia         ID
3       <NA> Daerah Istimewa Yogyakarta       ID34 Indonesia         ID
4       <NA> Daerah Istimewa Yogyakarta       ID34 Indonesia         ID
5       <NA> Daerah Istimewa Yogyakarta       ID34 Indonesia         ID
        date    validOn validTo Persentase                       geometry
1 2019-12-20 2020-04-01    <NA>      11.66 MULTIPOLYGON (((110.351 -7....
2 2019-12-20 2020-04-01    <NA>      15.18 MULTIPOLYGON (((110.8198 -8...
3 2019-12-20 2020-04-01    <NA>       6.26 MULTIPOLYGON (((110.3591 -7...
4 2019-12-20 2020-04-01    <NA>      15.62 MULTIPOLYGON (((110.2554 -7...
5 2019-12-20 2020-04-01    <NA>       7.46 MULTIPOLYGON (((110.4531 -7...

Visualisasi Peta

Menampilkan peta persentase penduduk miskin berdasarkan Kabupaten/Kota di Provinsi D I Yogyakarta

Tanpa OpenStreetMap

p0 <- diy_p0 %>%
  ggplot() +
  geom_sf(aes(fill = Persentase)) +                                                       # membuat peta berdasarkan nilai kolom Persentase dan warna menyesuaikan nilai Persentase
  ggsflabel::geom_sf_label_repel(aes(label = str_wrap(ADM2_EN, width = 1)), size=1.75) +  # menambahkan label Kab/Kota dari kolom ADM2_EN, geom_sf_label_repel agar label tidak bertumpuk, str_wrap untuk memgatur agar teks tidak terlalu panjang
  scale_fill_gradientn(colors = RColorBrewer::brewer.pal(9, "YlOrBr")) +                  # mengatur variasi warna pada peta menggunakan palet warna YlOrBr dari RColorBrewer
  annotation_north_arrow(location = "tl",which_north = "true",                            # menambahkan panah arah utara pada peta. lokasi panah di pojok kiri atas (top-left)
                         pad_x = unit(0.2, "cm"), pad_y = unit(0.2, "cm"),                # mengatur jarak panah dari tepi plot dalam satuan sentimeter
                         style = north_arrow_nautical,                                    # memilih panah nautikal
                         width = unit(1.5, "cm"), height = unit(1.5, "cm")) +             # mengatur lebar dan tinggi panah
  theme_bw() +                                                                            # memilih tema black and white
  theme(axis.title = element_blank())                                                     # menghilangkan label sumbu X dan Y
p0
Warning in st_point_on_surface.sfc(data$geometry): st_point_on_surface may not
give correct results for longitude/latitude data

Peta pada OpenStreetMap

p1 <- diy_p0 %>%
  st_transform(3857) %>%                                                            # mengubah sistem koordinat data spasial diy_p0 menjadi EPSG:3857 (Web Mercator) untuk membuat peta menggunakan OpenStreetMap
  ggplot()+
  annotation_map_tile(type = "osm", zoomin = 0)+                                    # menambahkan OpenStreetMap ke plot sehingga data spasial dapat dipetakan di atas peta dunia nyata
  geom_sf(aes(fill = Persentase))+                                                  # membuat peta dan mewarnai setiap Kab/Kota berdasarkan nilai Persentase
  ggsflabel::geom_sf_label_repel(aes(label=str_wrap(ADM2_EN, width=1)),size=1.75)+  # menambahkan label Kab/Kota dari kolom ADM2_EN, geom_sf_label_repel agar label tidak bertumpuk, str_wrap untuk memgatur agar teks tidak terlalu panjang
  scale_fill_stepsn(colors = RColorBrewer::brewer.pal(9, "YlOrBr")) +               # mengatur variasi warna pada peta menggunakan palet warna YlOrBr dari RColorBrewer
  annotation_north_arrow(                                                           # menambahkan panah arah pada peta
    location = "tl", which_north = "true",                                          # lokasi panah di pojok kiri atas (top-left), panah arah utara
    pad_x = unit(0.2, "cm"), pad_y = unit(0.2, "cm"),                               # mengatur jarak panah dari tepi plot dalam satuan sentimeter
    style = north_arrow_nautical,                                                   # memilih panah nautikal
    width = unit(1.5, "cm"), height = unit(1.5, "cm")) +                            # mengatur lebar dan tinggi panah
  theme_bw()+                                                                       # memilih tema black and white
  theme(axis.title = element_blank())                                               # menghilangkan label sumbu X dan Y
p1
Zoom: 10

Peta Interaktif

diy_p0 %>%
  mapview::mapview(                                      # menampilkan data spasial di peta interaktif menggunakan mapview
    zcol = "Persentase",                                 # menentukan warna pada peta berdasarkan nilai Persentase
    at = seq(0, 18, 2),                                  # mengatur rentang warna berdasarkan nilai Persentase
    col.regions = RColorBrewer::brewer.pal(9, "YlOrBr")  # mengatur variasi warna pada peta menggunakan palet warna YlOrBr dari RColorBrewer
  )
Warning: Found less unique colors (9) than unique zcol values (10)! 
Interpolating color vector to match number of zcol values.