1 울릉도

울릉도는 경상북도 군으로 행정구역상 울릉군이다. 국토정보플랫폼 웹사이트에서 울릉도 역사지도 대동여지도에서 울릉도를 다운로드 받아 살펴보자.

library(rayshader)
library(sp)
library(raster)
library(scales)
library(magick)

ulleung <- image_read("data/dokdo/(N02면)GM10333IH0014_001.jpg")

ulleung_img <- ulleung %>% 
  image_resize("10%") %>% 
  image_crop(geometry = "300x200+110+400") %>% 
  image_resize("200%")

ulleung_img

2 독도 elevation

국토정보플랫폼에서 공개DEM에서 독도와 울릉도를 선택하여 지도신청을 통해 독도 xyz 데이터를 얻을 수 있다.

library(tidyverse)
library(raster)

dokdo_xzy <- read_delim("data/dokdo/독도_DEM/37116.xyz", delim = " ", col_name = FALSE) %>% 
  set_names(c("x", "y", "elevation"))

dokdo_raster <- rasterFromXYZ(dokdo_xzy)
plot(dokdo_raster)

3 독도 항공사진

국토정보플랫폼에서 요청하여 전달받은 항공사진을 PDF 파일 형태로 다운로드 받아 PDF 파일에 포함된 이미지를 pdfimager 팩키지의 도움으로 쉽게 추출해낸다.

library("pdfimager") # remotes::install_github("sckott/pdfimager")

dokdo_pdf <- pdimg_images("data/dokdo/dokdo-aerial.pdf")

dokdo_aerial_photo_path <- dokdo_pdf[[1]] %>% 
  select(path) %>% 
  pull()

dokdo_aerial_photo_path
[1] "C:/Users/STATKC~1/AppData/Local/Temp/RtmpCELDKh/dokdo-aerial/img-000.ppm"
dokdo_aerial_photo <- image_read(dokdo_aerial_photo_path) %>% 
  image_resize("20%") %>% 
  image_crop(geometry = "269x150+10+50") %>% 
  image_resize("500%")

dokdo_aerial_photo 

4 독도 Rayshader 3D 렌더링

library(tidyverse)
library(raster)

dokdo_xzy <- read_delim("data/dokdo/독도_DEM/37116.xyz", delim = " ", col_name = FALSE) %>% 
  set_names(c("x", "y", "elevation")) %>% 
  filter(x > 631500, 
         x < 632700,
         y < 527250,
         y > 526400)

dokdo_g <- dokdo_xzy %>%
    ggplot(aes(x = x, y = y, fill = elevation)) +
      geom_tile() +
      geom_contour(aes(z = elevation), color = "black") +
      scale_x_continuous("X", expand = c(0,0)) +
      scale_y_continuous("Y",expand = c(0,0)) +
      scale_fill_gradientn("Z", colours = terrain.colors(10)) +
      coord_fixed()

dokdo_g

등고선 그림을 rayshader 3D 그래픽으로 재현해보자.

dokdo_g %>%
    plot_gg(
        multicore = TRUE,
        raytrace = TRUE,
        width = 7,
        height = 4,
        scale = 300,
        windowsize = c(1400, 866),
        zoom = 0.6,
        phi = 30,
        theta = 30
    )

render_movie("fig/movie_dokdo.mp4", frames = 260, fps=30, zoom=1, fov = 30)

4.1 데이터프레임 → 행렬

데이터 프레임에서 3D 렌더링을 하면 시간이 많이 걸려 형렬로 변환시킨 후에 sphere_shade() 함수를 사용하면 빠르게 결과를 확인할 수 있다.

library(av)

dokdo_matrix <- dokdo_xzy %>% 
  pivot_wider(names_from = x, values_from = elevation) %>% 
  select(-y) %>% 
  as.matrix()

dokdo_matrix %>%
    sphere_shade() %>%
    plot_3d(dokdo_matrix, zscale = 3)

render_movie("fig/movie_dokdo_mat.mp4", frames = 520, fps=30, zoom=1, fov = 45)

 

데이터 과학자 이광춘 저작

kwangchun.lee.7@gmail.com