지난번 포스팅에서는 R의 sf 패키지를 사용하여 "sf 클래스 (The sf class)"를 만드는 방법을 소개하였습니다.


이번 포스팅에서는 지리공간 벡터 데이터(GeoSpatial Vector data)를 분석할 때 사용하는 "sf 패키지"와 "sp 패키지"의 관계, "sf 클래스"와 "sp 클래스" 간 변환에 대해서 소개하겠습니다.


(1) R의 sf 패키지와 sp 패키지의 관계/ 역사

(2) sf 클래스를 sp 클래스로 전환하기: as(sf_class, Class="Spatial")

(3) sp 클래스를 sf 클래스로 전환하기: st_as_sf(sp_class)



[ R 지리공간 데이터 분석 패키지: sf package와 sp package 클래스 간 전환 ]



  (1) R의 sf 패키지와 sp 패키지의 관계/ 역사


sf 패키지는 {sp 패키지 + R 인터페이스 with (GDAL, GEOS, PROJ) + s2 패키지} 의 패키지 기능들을 승계한 종합 패키지로서, 지리공간 벡터 데이터를 단순 지리특성 (Simple features) 으로 인코딩할 수 있게 해줍니다. [1]



>> sp 패키지 : Classes and Methods for Spatial Data [2], [3]


(sf 패키지의 부모격이 되는) sp 패키지는 2005년 Pebesma 와 Bivand 가 개발해서 처음으로 공개하였습니다. 2005년 전에는 지리적인 좌표가 일반적으로 여느 숫자와 다름없이 처리되었다면, sp 패키지가 나오고 부터는 지리공간 점(Point), 선(LineString), 면/다각형(Polygon), 격자(Grid) 와 속성(Attributes)을 지원하는 클래스(Classes)와 메소드(Methods) 로 처리되는 방식으로 바뀌게 됩니다.


sp 패키지는 테두리 상자(bounding box), 좌표 참조 시스템(CRS, Coordinate Reference System), 속성(Attributes) 등의 정보를 S4 클래스 시스템을 사용해서 "Spatial" 객체안의 슬롯에 저장을 합니다. 이를 통해 지리공간 데이터에 대한 연산 작업을 할 수 있게 해줍니다. 또한, sp 패키지는 지리공간 데이터에 대해 summary()나 plot() 함수와 같은 R 에 내장된 함수도 사용할 수 있게 해줍니다.



>> sf 패키지 : Simple Features for R


sf 패키지는 Edzer Pebesma, Roger Bivand 등이 2016년 10월에 최초로 오픈소스로 공개하였으며, R로 단순 지리특성 기하 (Simple Feature Geometry) 형태로 지리 벡터 데이터를 인코딩하는 표준화된 방법을 지원합니다. sf 패키지는 sp 패키지의 기능을 승계하였으며, 이에 더해 지리공간 데이터를 읽고 쓰는 'GDAL', 지리적 연산을 할 때 사용하는 'GEOS', 지도의 투영 변환(projection conversions)과 데이터 변환(datum transformations)을 위한 'PROJ' 와 R과의 인터페이스를 제공합니다. 그리고 선택적으로 지리적 좌표에 대한 구면 기하 연산 (spherical geometry operations) 을 위해 's2' 패키지를 사용합니다.


단순 지리특성 모델 (Simple Features Model)을 지원하는 "sf 패키지"를 사용하면 좋은 점들로는[4],

  • 지리공간 벡터 데이터를 빠르게 읽고 쓸 수 있음
  • 지리공간 벡터 데이터 시각화 성능의 고도화
    (tmap, leaflet, mapview 지리공간 데이터 시각화 패키지가 sf 클래스 지원)
  • 대부분의 연산에서 sf 객체는 DataFrame 처럼 처리가 가능함
  • sf 함수들은 '%>%' 연산자 (chain operator) 와 함께 사용할 수 있고, R의 tidyverse 패키지들과도 잘 작동함
    (sp 패키지도 spdplyr 패키지를 설치하면 dplyr의  %>% 체인 연산자와 기능을 사용할 수 있음)
  • sf 함수이름은 'st_' 로 시작하여 상대적으로 일관성이 있고 직관적임

등을 들 수 있습니다.


sf 패키지의 장점이 이렇게 많으므로 지리공간 벡터 데이터를 처리하고 분석하고 시각화하는데 있어 sf 패키지를 사용하지 않을 이유가 없습니다!




  (2) sf 클래스를 sp 클래스로 전환하기: as(sf_class, Class="Spatial")


예제로 spData 패키지에 들어있는 'world' 라는 이름의 "sf", "data.frame" 클래스의 데이터셋을 사용하겠습니다.



library(sp) # Classes and methods for spatial data
library(sf) # Support for simple features, a standardized way to encode spatial vector data.
library(spData) # load geographic data

names(world)
# [1] "iso_a2"    "name_long" "continent" "region_un" "subregion" "type"      "area_km2"  "pop"      
# [9] "lifeExp"   "gdpPercap" "geom"

class(world)
# [1] "sf"         "tbl_df"     "tbl"        "data.frame"




"sf" 클래스를 "sp" 클래스로 변환(converting the sf class into the sp class) 할 때는 as(sf_class, Class = "Spatial") 함수와 매개변수를 사용합니다.(sp 패키지는 S4의 Spatial 클래스를 사용)



## Converting sf class into sp's Spatial objects using as(sf_class, Class="Spatial))
world_sp_class = as(world, Class = "Spatial")

class(world_sp_class)
# [1] "SpatialPolygonsDataFrame"
# attr(,"package")
# [1] "sp"

 




  (3) sp 클래스를 sf 클래스로 전환하기: st_as_sf(sp_class)


반대로, "sp" 클래스를 "sf" 클래스로 변환(converting the sp class into sf class) 할 때는 sf 패키지의 st_as_sf() 함수를 사용합니다.



## Converting Spatial objects into sf class using st_as_sf()
world_sf_class = st_as_sf(world_sp_class)


class(world_sf_class)
# [1] "sf"         "data.frame"




[ Reference ]

[1] sf package: https://cran.r-project.org/web/packages/sf/index.html

[2] sp package: https://cran.r-project.org/web/packages/sp/index.html

[3] The history of R-spatial: https://geocompr.robinlovelace.net/intro.html

[4] Why simple features?: https://geocompr.robinlovelace.net/spatial-class.html



이번 포스팅이 많은 도움이 되었기를 바랍니다.

행복한 데이터 과학자 되세요!  :-)




728x90
반응형
Posted by Rfriend
,

지난번 포스팅에서는 R의 sf 패키지를 사용해서 지리공간 벡터 데이터의 기하 유형(geometry types of vector data)로서 단순 지리특성 기하(Simple feature geometry)인 점(Point), 선(LineString), 면(다각형) (Polygon), 다중점(MultiPoint), 다중선(MultiLineString), 다중면(MultiPolygon), 기하집합(GeometryCollection)에 대해서 소개하였습니다 .


이번 포스팅에서는 앞서 소개했던 벡터 데이터의 '단순 지리특성 기하 (Simple feature geometry, sfg)' 들을 sf 패키지의 st_sfc() 함수를 사용하여 '단순 지리특성 칼럼 (Simple feature column, sfc)' 으로 합치는 방법을 소개하겠습니다.


여기서 단순 지리특성 칼럼(Simple feature column, sfc)은 단순 지리특성 기하들의 리스트(a list of sfg) 로서, 두 개의 지리특성(features)를 하나의 칼럼 객체로 합쳐놓은 것입니다. (한국말로 feature, sfc, sfg 용어를 번역하기가 쉽지 않네요.)


-- 동일한 단순 지리특성 기하 유형 합치기

(1) 두개의 단순 지리특성 기하 점(2 sfg points)를 한개의 단순 지리특성 칼럼(1 sfc) 객체로 합치기

(2) 두개의 단순 지리특성 기하 면(2 sfg polygons)를 한개의 단순 지리특성 칼럼(1 sfc) 객체로 합치기


-- 서로 다른 단순 지리특성 기하 유형 합치기

(3) 단순 지리특성 기하 점과 면을 합쳐서 한개의 단순 지리특성 칼럼(1 sfc) 객체로 만들기





  (1) 두개의 단순 지리특성 기하 점(2 sfg points)를 st_sfc() 함수로
      한개의 단순 지리특성 칼럼(1 sfc) 객체로 합치기


R의 sf 패키지를 사용할 것이므로, 먼저 library(sf) 로 패키지를 불러옵니다.


다음으로, 예제로 사용할 점(Point) 두개를 st_point() 함수를 사용해서 만들었습니다.


그리고, st_sfc() 함수를 사용하여, 단순 지리특성 기하(Simple feature geometry, sfg)인 두개의 점을

--> 단순 지리특성 칼럼(Simple feature columns, sfc) 의 하나의 객체로 합쳤습니다.



library(sf)

## Simple feature geometry (sfg)
## Point
point_sfg_1 = st_point(c(1, 2))
point_sfg_1
# POINT (1 2)

point_sfg_2 = st_point(c(3, 4))
point_sfg_2
# POINT (3 4)


## Simple feature columns (sfc)
## st_sfc() function combine two simple features into one object with two features.
## sfc represents the geometry column in sf data frames.
points_sfc = st_sfc(point_sfg_1, point_sfg_2)

points_sfc
# Geometry set for 2 features
# geometry type:  POINT

# dimension:      XY
# bbox:           xmin: 1 ymin: 2 xmax: 3 ymax: 4
# CRS:            NA
# POINT (1 2)
# POINT (3 4)

 



st_geometry_type() 함수를 사용하면 기하 유형을 확인해 볼 수 있습니다. 동일한 기하 유형인 두 개 점을 합쳤으므로 하나의 객체 집합에 두 개의 점(Points)가 들어있습니다.



## check the geometry type of sfc

st_geometry_type(points_sfc)
# [1] POINT POINT
# 18 Levels: GEOMETRY POINT LINESTRING POLYGON MULTIPOINT MULTILINESTRING MULTIPOLYGON ... TRIANGLE

 




  (2) 두개의 단순 지리특성 기하 면(2 sfg polygons)를 st_sfc() 함수로

      한개의 단순 지리특성 칼럼(1 sfc) 객체로 합치기


이번에는 동일한 기하 형태인 두개의 단순 지리특성 기하 면 (2 Simple feature geometry polygons) 을 st_polygon() 함수로 만들어보겠습니다.


그리고 이를 st_sfc() 함수를 사용해서 하나의 단순 지리특성 칼럼(Simple feature column) 객체로 합쳐보겠습니다.



## Polygon using list of matrices of points
polygon_list_1 = list(rbind(c(1, 1), c(1, 3), c(3, 5), c(3, 1), c(1, 1)))
polygon_sfg_1 = st_polygon(polygon_list_1)
polygon_sfg_1
# POLYGON ((1 1, 1 3, 3 5, 3 1, 1 1))

polygon_list_2 = list(rbind(c(4, 1), c(4, 5), c(5, 5), c(5, 1), c(4, 1)))
polygon_sfg_2 = st_polygon(polygon_list_2)
polygon_sfg_2
# POLYGON ((4 1, 4 5, 5 5, 5 1, 4 1))

## sfc (Simple feature columns)
polygon_sfc = st_sfc(polygon_sfg_1, polygon_sfg_2)

polygon_sfc
# Geometry set for 2 features
# geometry type:  POLYGON
# dimension:      XY
# bbox:           xmin: 1 ymin: 1 xmax: 5 ymax: 5
# CRS:            NA
# POLYGON ((1 1, 1 3, 3 5, 3 1, 1 1))
# POLYGON ((4 1, 4 5, 5 5, 5 1, 4 1))




st_geometry_type()함수로 기하 유형을 확인해보면 2개 면의 집합인 하나의 객체임을 확인할 수 있습니다.



st_geometry_type(polygon_sfc)
# [1] POLYGON POLYGON
# 18 Levels: GEOMETRY POINT LINESTRING POLYGON MULTIPOINT MULTILINESTRING MULTIPOLYGON ... TRIANGLE

 




  (3) 단순 지리특성 기하 점과 면을 st_sfc() 함수로 합쳐서

      한개의 단순 지리특성 칼럼(1 sfc) 객체로 만들기


이번에는 (1)번에서 만들었던 점(Point)과 (2)번에서 만들었던 면(Polygon)을 st_sfc() 함수를 사용해서 하나의 단순 지리특성 칼럼 객체로 합쳐보겠습니다. 


이처럼 서로 다른 기하 형태도 st_sfc() 함수로 하나의 단순 지리특성 칼럼 객체로 합칠 수 있습니다.



## combining different geometry types
point_polygon_sfc = st_sfc(point_sfg_1, polygon_sfg_1)


point_polygon_sfc
# Geometry set for 2 features
# geometry type:  GEOMETRY
# dimension:      XY
# bbox:           xmin: 1 ymin: 1 xmax: 3 ymax: 5
# CRS:            NA
# POINT (1 2)
# POLYGON ((1 1, 1 3, 3 5, 3 1, 1 1))




st_geometry_type(point_polygon_sfc)
# [1] POINT   POLYGON
# 18 Levels: GEOMETRY POINT LINESTRING POLYGON MULTIPOINT MULTILINESTRING MULTIPOLYGON ... TRIANGLE

 



이번 포스팅이 많은 도움이 되었기를 바랍니다.

행복한 데이터 과학자 되세요!  :-)



728x90
반응형
Posted by Rfriend
,