Memvisualisasikan DEM Menggunakan Rayshader

Sudah lama saya gak menulis di blog saya, mungkin lebih 6 bulan sejak saya pulang dari Jerman, September lalu. Banyak yang dikerjakan di Indonesia, membuat saya gak sempat menulis. Jadi ingat dulu pernah ngobrol dengan Pak Erwin tentang rindu saat menganggur jadi bisa banyak menulis.

Di tulisan kali ini saya ingin berbagi tentang membuat visualisasi model elevasi digital menggunakan R, tepatnya menggunakan Rayshader. Bagi yang belum tahu apa itu Rayshader, saya sarankan mampir di https://www.rayshader.com/, atau di blognya pencipta Rayshader, Tyler Morgan, https://www.tylermw.com/posts/. Saya super salut sama developer R yang satu ini. Super duper jenius.

Rayshader bikinan Tyler ini membuat semua orang bisa bikin visualisasi model elevasi yang bagus, indah, eyecatchy. Contohnya misal gambar ini:

Visualisasi DEM Cekungan Bandung menggunakan Rayshader. Cekungan Bandung dilihat dari selatan ke utara. Gunung di tengah merupakan kaldera raksasa Gunung Sunda Purba.

yang mana bikinan saya. Gambar di atas adalah model 2.5D Cekungan Bandung yang saya bikin menggunakan Rayshader. Gambar ini diambil dari selatan, Gunung yang terlihat besar di belakang adalah Gunung Sunda Purba dengan kaldera raksasanya. Gunung Tangkuban Perahu terlihat sebagai puncak di sebelah kanan dengan lubang kawah di tengahnya, Gunung Burangrang di sebelah kiri tebing kaldera raksasa. Dataran di tengahnya adalah Dataran Cekungan Bandung, di mana lebih dari 8 juta orang hidup di atasnya.

Untuk membuat ini, saya cuma nulis sekitar 20 baris kode. Apakah Anda tertarik untuk bisa membuatnya juga?

Kalau misalkan tertarik untuk bikin gambar sejenis dari data DEM, bisa lanjutkan membaca, kalau nggak juga gak apa-apa. Akan ada sedikit bahasa-bahasa teknis R setelah paragraf ini.

Pertama Anda perlu R untuk membuat visualisasi ini. Jika Anda belum familiar dengan R, tenang ada super banyak tutorial dan kelas-kelas online yang bisa membantu Anda untuk mempelajari bahasa super yang bisa memudahkan pekerjaan ini.

Ada 5 tahap dalam tutorial ini:

  1. Membuat batas area of interest (AOI)
  2. Mendownload data DEM
  3. Memotong data DEM ke AOI
  4. Membuat visualisasi Rayshader
  5. Menyimpan data Render

Package yang digunakan dalam tutorial ini adalah: raster, sp, rayshader, dan elevatr. Kegunaan dari package ini akan saya jelaskan belakangan.

Membuat Area of Interest (AOI)

Ada beberapa cara untuk membuat AOI, bisa menggunakan shapefile yang sudah Anda punya, atau dengan membuat polygon biasa. Kali ini saya akan membuat dengan polygon biasa.

Saya membuat fungsi, namanya Fungsi AOI. Dengan fungsi ini kita cuma perlu masukkan nilai minimum dan maksimum longitude dan latitude. Urutannya searah jarum jam: kiri, atas, kanan, bawah, atau min long, max lat, max long, min lat.

Mendowload Data DEM

Setelah memasukkan AOI, kita ingin mendownload data DEM. Jika Anda punya data DEM sendiri, maka itu bisa dipakai. Tapi di tutorial ini saya memanfaatkan package Elevatr yang dikembangkan oleh Hollister dan Shah (2017). Package ini memungkinkan kita mengakses data DEM yang free, misal SRTM, 3DEP, GMTED2010, dan ETOPO1 data-data ini milik U.S. Geological Survey dan U.S. National Oceanic and Atmospheric Administration. Lembaga ini harus kita attribute kalau kita memanfaatkan data mereka.

Rumus mendownload data mudah saja, pakai fungsi get_elev_raster, masukkan AOI, dan z. Nilai z ini memengaruhi kualitas DEM yg kita download. Kalau z kecil, DEM kasar tapi size data kecil, berlaku sebaliknya. Saya pakai z=11. Selanjutnya saya pastikan projectionnya pakai longlat.

Memotong Data DEM ke AOI

Kode kita mendownload semua DEM yang AOI kita masuk di dalamnya. Sebagai contoh AOI saya ada di perbatasan 2 DEM, utara selatan. Jadi kepotong gitu. Setelahnya kita bisa potong DEM besar kita secukupnya di AOI, agar tidak terlalu besar dan berat.

Bermain dengan Rayshader

Barulah kita masuk ke Rayshader. Agak susah juga sebenarnya saya menjelaskan tentang Rayshader karena banyak hal teknisnya. Tapi ada beberapa input yang penting kita masukkan untuk membuat gambar kita jadi bagus:

  1. sunangle –> pilih berdasarkan arah mata angin (menggunakan derajat) ingin dari mana matahari datang
  2. texture –> ada imhof (favorit saya), desert, bw, dan unicorn. Imhof sendiri ada 4 jenis. Silakan cba sendiri.
  3. zscale –> menentukan exxageration, 1 exxageration tinggi, makin besar angkanya makin rendah.
  4. theta –> arah pengambilan gambar. 0 berarti gambar diambil dari selatan menghadap ke utara
  5. zoom –> perbesaran gambar, makin kecil angkanya makin zoom in
  6. phi –> sudut pengambilan gambar, 0 derajat searah horison, 90 derajat tegak lurus dari atas

Silakan bermain-main dengan pengaturan ini. Tapi saya sarankan betul untuk ikuti tutorialnya Tyler Morgan untuk lebih detil tentang setting Rayshader ini.

Berikut Script R untuk bikin Rayshader Cekungan Bandung

library(raster)
 library(sp)
 library(rayshader)
 library(elevatr)

#Fungsi untuk menentukan poligon Area of Interest
AOI <- function(p, q, r, s) {   
xleft <- p   
ytop <- q   
xright <- r   
ybot <- s   
x_coord <- c(xleft,xleft,xright,xright)   
y_coord <- c(ytop,ybot, ybot, ytop)   
xym <- cbind(x_coord, y_coord)   
p <- Polygon(xym)   
ps = Polygons(list(p),1)   
sps = SpatialPolygons(list(ps))   
proj4string(sps) = CRS("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0")   
return(sps) } 

mask <- AOI(107.4, -6.6, 107.9, -7.2) #Ubah koordinat di bagian ini jika ingin bikin di daerah lain

#Mendownload DEM menggunakan fungsi dari package Elevatr
Elevation_File <- get_elev_raster(mask, z=11) 

projectRaster(Elevation_File,               
crs= "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0") 

#Memotong DEM sesuai dengan AOI
localtif_mask <- crop(Elevation_File, mask) 

#Memulai Rayshader, buka tutorialnya Tyler Morgan kalau mau lebih jelas 
elmat2 <- matrix(raster::extract(localtif_mask,
raster::extent(localtif_mask),
buffer=1000),nrow=ncol(localtif_mask),
ncol=nrow(localtif_mask)) 

raymat2 <- ray_shade(elmat2) 
ambmat2 <- ambient_shade(elmat2) 

elmat2 %>%
   sphere_shade(sunangle = 225 ,texture = "imhof1") %>%
   add_water(detect_water(elmat2, min_area = 100), color="imhof1") %>%
   add_shadow(ray_shade(elmat2,zscale=3,maxsearch = 300),0.5) %>%
   add_shadow(ambmat2,0.5)%>%
   plot_3d(elmat2, zscale = 20, theta = 0, zoom = 0.3, 
           phi = 25, water = TRUE, windowsize = c(1366,768))
 render_snapshot("bandungbasin", clear = FALSE)

Jadi deh plot kita. Sama persis kaya yang di atas, sedikit digocek ke kiri saja. Sebenarnya dia bisa tampil sebagai window, interaktif, tapi saya gak tahu caranya mengembed di web kaya gimana. Jadi cukup kita tampilkan apa adanya saja.

Tampilan Rayshader

Yang baru dari tulisan ini sebenarnya adalah teknik mendownload DEM menggunakan Elevatr. Saya lihat tutorial dari Tyler dll masih menggunakan data pribadi. Mungkin karena di kampung mereka, data sudah canggih-canggih. Hi-resolution. Sementara kita ya bersyukur saja dengan SRTM yang ada. Alhamdulillah.

Silakan mencoba ganti koordinatnya dengan titik-titik yang Anda ingin buat visualisasinya! Tag saya di twitter @malikarrahiem jika sudah berhasil . Letsgoo!