-
sf : R과 지도 (1)R 이모저모 2019. 12. 6. 23:09
이번에 써볼 주제는 R의 sf패키지로, 최근 관련 프로젝트를 하면서 유용하게 쓰게 되면서 이에 관련해서 간단한 리뷰를 해볼까 합니다. 글의 제목과 같이 sf패키지는 지도, 정확히는 GIS 관련 전반적인 처리를 도와주는 패키지로, 상당히 유용하고 이러한 종류의 패키지가 주로 가지는 단점이었던 속도 문제도 거의 없는 축에 속하는 훌륭한 도구입니다. 그래서 이번 글에서는 sf 패키지에서 기본적인 객체들을 다루고 있는 형식들에 대해서 알아보고, 다음 글에서 좀 더 심화된 내용을 다뤄볼까 합니다.
1. Point와 Polygon
지리 관련 정보들이란 무엇인가?에 대해서 곰곰히 생각해보면, 결국 귀결되는 것은 대부분은 점과 폴리곤(면)의 조합이라는 것입니다. 물론 3차원적으로 살펴보자면 높이까지 포함해야겠지만, 대부분의 지리 관련 분석은 2차원 평면에서의 데이터 분배, 알고리즘 적용 및 시각화로 가게 될 것입니다. 그렇다면 sf패키지에선 점과 면을 어떻게 선언하게 될까요?
위와 같은 방법말고도 다양한 방법으로 선언할 수 있겠지만, 보통은 위와 같이 point는 (x,y)좌표 형식의 벡터를 st_point에 통과시키는 것으로, 폴리곤은 st_polygon에 위와 같은 점들을 합친 리스트를 선언하게 됩니다. 지금처럼 간단한 형식일 경우 눈으로도 제대로 완성된 것을 확인할 수 있지만, 좀 더 정확한 방법으로 확인하고싶다면 plot을 통해 눈으로 확인할 수 있습니다.
1.1 - MultiPoint, MultiPolygon
그런데 이처럼 선언하게 되면 한가지 문제가 있습니다. 하나의 행에 여러개의 점이나 폴리곤을 할당하고 싶을때, st_point나 st_polygon은 이를 하나로 뭉치게 된다는 것입니다. 그래서 이를 방지하기 위해서 st_multipoint, st_multipolygon이라는 함수를 사용해서 목적에 맞게 뭉처주게 됩니다.
multipolygon의 경우, 위 multipoint와는 다르게 서로 다른 두 개의 polygon을 list로 묶어주거나 벡터에 할당하는 방법으로 선언할 수 있습니다.
2. Intersect, Within, Union
이제 객체를 선언했으니 그 다음은 객체간 어떤 작용을 할 수 있는지가 중요할 것입니다. sf는 다양한 기능을 제공하지만, 기본이 되는 것은 intersect(겹침), within(속함), 그리고 union(합침) 정도가 될 것 같습니다.
먼저 intersect는 st_intersection혹은 st_intersects 함수로 사용 가능하며, st_intersection은 겹치는 부분에 대한 객체를 반환하고, intersects는 겹치는 부분에 대한 인덱스를 반환합니다. . 예를 들어, 위에 선언한 polygon과 polygon2는 하나의 점인 (1,1)을 공유하기에 st_intersection을 쓰면 (1,1)인 Point를, st_intersects를 쓰면 인덱스1을 반환하게 됩니다.
이 경우, 겹치는 부분이 하나의 점 밖에 없으므로 다소 모호해보일 수 있으나, 이는 polygon 객체를 활용하면 보다 명확하게 보입니다.(ggplot과 관련한 부분은 후술하겠습니다.)
within의 경우 x가 y에 속하는지 아닌지에 대해 판별하게 되며, 첫번째 경우처럼 안에 속하게 되면 인덱스를, 아니라면 빈 값을 반환하게 됩니다. 두번째의 경우 poylgon3는 0.5,0.5를 포함하지 않기 때문에 empty가 나왔으며, 마찬가지로 polygon과 polygon3도 점 하나만 겹칠뿐 안에 포함하는 관계가 아니기 때문에 empty가 나오게 됩니다.
union은 말 그대로 두 객체를 합쳐서 하나의 객체로 생성시키며, 주로 분할된 여러 폴리곤을 하나의 단계로 합칠때 사용하게 됩니다. 함수는 st_union을 사용합니다.
3. Centroid, Buffer, bbox 그리고 ggplot2를 활용한 표현
이제 다음으로 알아볼 것은 Centroid(중심점), Buffer(원), bbox(Bounding Box)와 ggplot2를 활용한 도형 표현입니다.
먼저 Centroid는 말 그대로 폴리곤의 중심점을 구하는 것으로, st_centroid를 활용하여 구하게 됩니다. 단, 이 방법은 일부 좌표 투영법에 따라 부정확할 수가 있으며, 이는 다음에 쓸 글에서 보다 자세히 설명하도록 하겠습니다.
buffer는 원이라고 표현하였으나, 정확히는 버퍼, 즉 주어진 점을 중심으로 일정 거리의 도형을 생성하는 함수입니다. 기본은 원이나 endCapStyle 파라미터를 통해 네모로 변경할 수도 있습니다.
bbox는 주로 googlemap등 지도 api들에서 지도를 가져올 때 애용하게 되는 함수로, bounding box, 즉 x와 y좌표의 최소/최대값을 출력해줍니다.
위 3개의 기능을 polygon4 객체에 적용하면 아래와 같은 그림을 얻을 수 있습니다. 회색은 기준인 poylgon4를, 파란색은 원형 buffer의 bbox의 값으로 만든 사각형 폴리곤, 빨간색 원은 중심점의 원형 buffer, 검은색 점은 centroid입니다.
이러한 그림은 ggplot을 통해 그리게 되는데, ggplot2에는 geom_sf라는 함수로 sf객체를 그림으로 그리는 것을 지원해 줍니다. 방법은 아래 코드에서 나오듯 data에는 sf객체를, aes는 "geometry = geometry가 설정된 칼럼 이름" 형식으로 지정하게 되며, color는 바깥선, fill은 안쪽 색깔, size는 선의 크기를 결정짓게 됩니다.
마치며
다음 글에선 이어서 데이터프레임을 활용하여 sf객체 생성, 좌표 투영 등 보다 다양한 sf사용법에 대해 적어보겠습니다.
'R 이모저모' 카테고리의 다른 글
R과 Few shot learning : 샴 네트워크 (0) 2020.02.15 sf : R과 지도(2) (0) 2020.01.03 R과 Data Wrangling (0) 2019.08.19 웹 크롤링 기초와 R (0) 2019.07.21 R로 위키 빌보드 차트 가져오기 (0) 2019.06.23