이번 포스팅에서는 지리공간 데이터 중에서 실제 세계를 도형으로 표현(graphical representation) 하는 벡터 데이터 모델 (Vector data model)에서 사용하는 기하 유형 (geometry types)에 대해서 소개하겠습니다.
(* 참고로 레스터 데이터는 실제 세계를 픽셀로 이루어진 그리드 안에 지리특성 값을 가지는 형태라고 하였습니다.)
벡터 데이터의 기하 유형에는 총 17개가 있는데요, 이번 포스팅에서는 그중에서도 많이 사용되는 아래의 7개의 대표적인 유형에 대해서만 설명을 하겠습니다.
(1) 점 (Point)
(2) 선 (LineString)
(3) 면 (다각형) (Polygon)
(4) 다중점 (MultiPoint)
(5) 다중선 (MultiLineString)
(6) 다중면 (MultiPolygon)
(7) 기하집합 (GeometryCollection)
총 17개의 기하 유형 중에서 위에서 설명한 7개 이외에 나머지 유형에 대해서는 PostGIS 사이트를 참고하시기 바랍니다. ( http://postgis.net/docs/using_postgis_dbmanagement.html )
[ 벡터 데이터의 기하 유형 (Geometry Types of Vector data) ]
(1) 점 (Point), 다중점 (MultiPoint)
|
점은 2D (위도, 경도), 3D (위도, 경도, 해발고도), 또는 4D (위도, 경도, 고도, 측정 정확도) 공간 상의 하나의 위치 좌표에 해당합니다.
예: Point (3 3)
점 (Point)은 0 차원으로서, 각 기하도형의 가장 기본이 되는 형태입니다. 여러개의 점을 이어주면 선이 되고, 선을 닫아주면 면이 되는 식이니깐요. 이렇게 점 --> 선 --> 면 혹은 점 --> 다중점, 선 --> 다중선, 면 --> 다중면 방향으로 기하도형을 변환하는 것을 구성(composition) 한다고 하며, 그 반대 방향으로의 변환을 해체(Decompostion) 한다고 합니다.
점은 우물, 랜드마크, 관심지역(Point of Interest) 등의 지리특성을 정의할 때 사용합니다.
R에서 점(point)을 만들 때 st_point() 함수를 사용합니다. st_point(dim="XYM") 에서 dim 은 차원(dimension)을 의미하고, M은 보통 Measurement 의 M (측정 정확도, measurement accuracy)을 의미합니다. 점의 2D, 3D, 4D 좌표는 c() 로 묶어줍니다.(concatenate)
참고로, 접두사 'ST_' 는 PostGIS의 함수에서도 동일하게 사용되며, 'standard Spatial Type (ST)' 의 앞글자를 딴 것입니다.
install.packages("sf")
library(sf)
##---------------- ## point
## XY point st_point(c(3, 3)) # POINT (3 3)
## XYZ point st_point(c(3, 3, 2)) # POINT Z (3 3 2)
## XYM point st_point(c(3, 3, 1), dim = "XYM") # POINT M (3 3 1)
## XYZM point st_point(c(3, 3, 2, 1)) # POINT ZM (3 3 2 1)
|
선(LineString) 은 점들을 직선으로 연결한, 여러개 점들의 연속적인 집합입니다. 선은 아래의 예처럼 몇 개 점들의 집합으로 표현할 수 있습니다(이들 점을 순서대로 직선으로 연결).
예: LineString (1 1, 1 3, 3 5)
선은 1차원(dimension of 1)이며 길이(length)가 있습니다. (반면, 점은 0 차원이고 길이가 없음)
선은 길, 철도, 강, 전선 등과 같이 선형 특성을 가진 지형지물을 정의하는데 사용합니다.
R에서 선(LineString)은 st_linestring() 함수를 사용하여 만들 수 있습니다. 선을 이루는 여러개 점들의 좌표는 rbind()로 행렬을 만들어서 사용합니다.
##---------------- ## LineString using matrices linestring_matrix = rbind(c(1, 1), c(1, 3), c(3, 5)) st_linestring(linestring_matrix) # LINESTRING (1 1, 1 3, 3 5)
|
면(Polygon)은 2차원의 표면을 가지는 형태로 점들이 연결된 것으로서, 안에 구멍(hole)이 있을 수도 있고 또는 없을 수도 있습니다. (위의 그림 예에서는 면 안에 구멍이 없음). 면이 되기 위해서는 시작점과 끝점이 동일해야 하며, 이를 닫혀있어야 한다(closed, not open)고 말합니다. 아래 예의 경우 면의 시작점과 끝점이 (x=1, y=1) 로서 동일하며, 즉 닫혀있습니다.
예: Polygon ((1 1, 1 3, 3 5, 3 1, 1 1))
면(Polygon)은 육지, 저수지, 건물 등과 같이 공간적인 외곽 (spatial extent)과 면적(area)을 가진 지리지형을 나타내는데 사용할 수 있습니다.
R의 st_polygon() 함수를 사용해서 면(Polygon)을 만들 수 있습니다. 면을 만들 때는 점 행렬의 리스트(list of matrices of points)를 입력값으로 사용합니다.
## Polygon using list of matrices of points polygon_list = list(rbind(c(1, 1), c(1, 3), c(3, 5), c(3, 1), c(1, 1))) st_polygon(polygon_list) # POLYGON ((1 1, 1 3, 3 5, 3 1, 1 1))
|
다중점(MultiPoint)은 점을 여러개 모아놓은 것(a collection of points)입니다.
예: MultiPoint (1 1, 3 3, 3 5)
R에서 점은 st_point() 함수로 만들었다면, 다중점(MultiPoint)은 st_multipoint() 로 만들 수 있습니다. 이때 st_point() 에서는 점의 좌표를 c()로 묶어주기만 했다면, 다중점(MultiPoint)을 만들 때는 rbind()로 묶어서 점의 행렬(matrices)을 만들어서 st_multipoint() 함수를 사용합니다.
## MultiPoint using matrices of points multipoint_matrix = rbind(c(1, 1), c(3, 3), c(3, 5)) st_multipoint(multipoint_matrix) # MULTIPOINT ((1 1), (3 3), (3 5))
|
(5) 다중선 (MultiLineString)
|
다중선(MultiLineString)은 선(LineString)을 여러개 모아놓은 것(a collection of LineStrings)입니다.
예: MulLineString ((1 1, 1 3, 3 5), (2 2, 5 2))
R에서 선(LineString)은 st_linestring()으로 만들었다면, 다중선(MultiLineString)은 st_multilinestring() 함수로 만듭니다. 여러개의 선(LineSting)을 리스트(list)로 묶어서 st_multilinestring() 함수에 넣어주면 됩니다.
## MultiLineString multilinestring_list = list(rbind(c(1, 1), c(1, 3), c(3, 5)), rbind(c(2, 2), c(5, 2)))
st_multilinestring((multilinestring_list)) # MULTILINESTRING ((1 1, 1 3, 3 5), (2 2, 5 2))
|
다중면(MultiPolygon)은 면(Polygon)을 여러개 모아놓은 것(a collection of Polygons)입니다.
예: MultiPolygon (((1 1, 1 3, 3 5, 3 1, 1 1), (4 1, 4 5, 5 5, 5 1, 4 1)))
R에서 면(Polygon)은 st_polygon() 함수로 만들었다면, 다중면(MultiPolygon)은 st_multipolygon() 함수로 만들 수 있습니다. 면(Polygon)을 만들 때 점 행렬의 리스트를 st_polygon() 함수에 넣어주었다면, 다중면(MultiPolygon)을 만들 때는 여러개의 면이 모인 것이므로 점 행렬 리스트들의 리스트 (list of lists)를 st_multipolygon() 함수에 넣어줍니다.
## MultiPolygon multipolygon_list = list( list(rbind(c(1, 1), c(1, 3), c(3, 5), c(3, 1), c(1, 1))), list(rbind(c(4, 1), c(4, 5), c(5, 5), c(5, 1), c(4, 1))) )
st_multipolygon(multipolygon_list) # MULTIPOLYGON (((1 1, 1 3, 3 5, 3 1, 1 1)), ((4 1, 4 5, 5 5, 5 1, 4 1)))
|
(7) 기하집합 (GeometryCollection)
|
기하(도형)집합(GeometryCollection)은 위에서 설명한 점(Point), 선(LineString), 면(다각형)(Polygon), 다중점(MultiPoint), 다중선(MultiLineString), 다중면(MultiPolygon) 중에서 여러개의 기하 유형을 모아놓은 것이며, 어떤 조합(any combination of geometries)도 가능합니다.
아래 예에서는 점(Point), 다중선(MultiLineString), 면(Polygon)이 혼합된 조합의 기하집합(GeometryCollection) 입니다.
![](https://t1.daumcdn.net/cfile/tistory/9973BB445FF1CC8A35)
R의 st_geometrycollection() 함수를 사용해서 기하집합(GeometryCollection)을 만들 수 있습니다. 이때 각 기하 유형을 리스트(list)로 묶어서 넣어주면 됩니다.
## GeometryCollection using list of combination of geometries point_coord = c(3, 3) multilinestring_list = list(rbind(c(1, 1), c(1, 3), c(3, 5)), rbind(c(2, 2), c(5, 2))) polygon_list = list(rbind(c(4, 3), c(4, 5), c(5, 5), c(5, 3), c(4, 3)))
gemetrycollection_list = list( st_point(point_coord), st_multilinestring((multilinestring_list)), st_polygon(polygon_list) )
st_geometrycollection(gemetrycollection_list) # GEOMETRYCOLLECTION (POINT (3 3), # MULTILINESTRING ((1 1, 1 3, 3 5), (2 2, 5 2)), # POLYGON ((4 3, 4 5, 5 5, 5 3, 4 3)))
## plot GeometryCollection plot(st_geometrycollection(gemetrycollection_list))
![](https://t1.daumcdn.net/cfile/tistory/994ECE455FF1E8AD07)
|
이번 포스팅이 많은 도움이 되었기를 바랍니다.
행복한 데이터 과학자 되세요! :-)
![](https://t1.daumcdn.net/cfile/tistory/991DAF465FF1E35A02)