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