(ggplot2) 래스터(Raster) 데이터로 지도 그리기

지도 데이터는 벡터(Vector) 또는 래스터(Raster) 데이터로 나뉜다. 이 포스팅에서는 래스터(Raster) 데이터를 이용하여 지도를 그려볼까한다. 래스터(Raster) 데이터 모델은 셀의 연속 그리드로 공간을 나타낸다. raster 데이터를 읽고 활용할 수 있는 패키지는 대표적으로 terraraster 정도 있다. 각각 함수명이나 파라메터 사용법 정도 다를 뿐 원리는 동일하다. 하나씩 알아보려 한다.

raster package

raster 패키지 사용법부터 알아본다. 우선 사용할 데이터는 spDataLarge 패키지에 있는 래스터 데이터로, 시온 국립공원(미국 유타)의 지역 고도 데이터이다. 아래 코드는 RasterStack 클래스로 변환하고나서, dataframe 클래스로 변경하는 절차이다.

> raster_filepath = system.file("raster/srtm.tif", package = "spDataLarge")

> raster_rs = raster::stack(raster_filepath)
> raster_rs
class      : RasterStack 
dimensions : 457, 465, 212505, 1  (nrow, ncol, ncell, nlayers)
resolution : 0.0008333333, 0.0008333333  (x, y)
extent     : -113.2396, -112.8521, 37.13208, 37.51292  (xmin, xmax, ymin, ymax)
crs        : +proj=longlat +datum=WGS84 +no_defs 
names      : srtm 
min values : 1024 
max values : 2892 

> raster_df = raster::as.data.frame(x = raster_rs, xy = T)
> raster_df |> head()
          x       y srtm
1 -113.2392 37.5125 1728
2 -113.2383 37.5125 1718
3 -113.2375 37.5125 1715
4 -113.2367 37.5125 1710
5 -113.2358 37.5125 1703
6 -113.2350 37.5125 1701

데이터가 준비되었으니 그리기만 하면 된다. 고도가 높을 수록 밝아지고 낮을 수록 어두워진다.

ggplot(raster_df) + 
  geom_raster(aes(x, y, fill = srtm))

scale_fill_viridis_c를 사용하여 다른 색상으로 표현해봤다.

ggplot(raster_df) + 
  geom_raster(aes(x, y, fill = srtm)) +
  scale_fill_viridis_c()

terra package

함수 이름만 다르지, terra 패키지도 사용법은 거의 동일하다.

> raster_filepath = system.file("raster/srtm.tif", package = "spDataLarge")

> terra_rs = terra::rast(raster_filepath)
> terra_rs
class       : SpatRaster 
dimensions  : 457, 465, 1  (nrow, ncol, nlyr)
resolution  : 0.0008333333, 0.0008333333  (x, y)
extent      : -113.2396, -112.8521, 37.13208, 37.51292  (xmin, xmax, ymin, ymax)
coord. ref. : lon/lat WGS 84 (EPSG:4326) 
source      : srtm.tif 
name        : srtm 
min value   : 1024 
max value   : 2892 

> terra_df = terra::as.data.frame(terra_rs, xy = T)
> terra_df |> head()
          x       y srtm
1 -113.2392 37.5125 1728
2 -113.2383 37.5125 1718
3 -113.2375 37.5125 1715
4 -113.2367 37.5125 1710
5 -113.2358 37.5125 1703
6 -113.2350 37.5125 1701

data.frame 으로 변환된 데이터로 ggplot 그래프를 만든다.

ggplot(terra_df) + 
  geom_raster(aes(x, y, fill = srtm))  +
  scale_fill_viridis_c(option = "B")

래스터 데이터 만들기

래스터 데이터를 내가 임의로 만들어 그래프를 그려볼 수도 있다. 10x15 사이즈의 그리드를 만들고, 그안에 1~150 까지의 숫자를 랜덤하게 셋팅했다.

> set.seed(1234)
> my_raster = raster::raster(nrows = 10, ncols = 15,
               xmn = 0, xmx = 15, 
               ymn = 0, ymx = 10, 
               crs = "EPSG:5179",
               vals = sample(1:150, 150))

> names(my_raster) = "values"
> my_raster
class      : RasterLayer 
dimensions : 10, 15, 150  (nrow, ncol, ncell)
resolution : 1, 1  (x, y)
extent     : 0, 15, 0, 10  (xmin, xmax, ymin, ymax)
crs        : +proj=tmerc +lat_0=38 +lon_0=127.5 +k=0.9996 +x_0=1000000 +y_0=2000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs 
source     : memory
names      : values 
values     : 1, 150  (min, max)

> df_my_raster = raster::as.data.frame(x = my_raster, xy = T)
> df_my_raster |> head()
    x   y values
1 0.5 9.5     28
2 1.5 9.5     80
3 2.5 9.5    101
4 3.5 9.5    111
5 4.5 9.5    137
6 5.5 9.5    133

그냥 모자이크처럼 나오긴했지만, 방법을 알기 때문에 나중에 방대한 Raster 데이터를 가지고, 그래프로 수월히 표현할 수 있을 것 같다.

ggplot(df_my_raster) + 
  geom_raster(aes(x, y, fill = values))


더 보면 좋을 글들