R 4.3.1
QGIS 3.32.1
하다 하다 이제 QGIS까지 공부하게 되었다. 내가 해야 되는 일이 서울시 특정 구역 안에 있는 사업체들의 현황을 조사하는 일이었다.
지도에 빨갛게 표시되어 있는 구역이다. 종로 1, 2, 3, 4가동, 을지로동, 광희동, 필동(행정동 기준)이 일부씩 차지하고 있는 곳이라서 행정구역 단위로 쪼갤 수 없다. 우리 회사에는 2020년 기준 서울 소재 약 120만 개의 사업체들에 대한 위치 좌표 자료가 있다. QGIS를 이용해서 이 구역 내에 위치한 사업체를 따로 뽑아 테이블을 만들 것이다. 먼저 R에서 원자료를 읽어서 필요한 변수만 추출하고 CSV 파일로 저장한다.
sbs20co1 <- read.table("../data/SBS/2020/coord/사업체조사자료2020_서울_basexy.txt", sep="|", header=T, fileEncoding="CP949")
sbs20co2 <- sbs20co1[,c("ad_cd", "rprs_sd_cd", "rprs_gnr", "org_form_cd", "estm_div_cd", "mbz_indst_div_cd_10th", "surv_phs_woke_sum", "x_code", "y_code")]
names(sbs20co2) <- c("add2", "gender", "age", "form", "div", "ind5", "emp", "x_code", "y_code")
write.csv(sbs20co2, file="sbs20co2.csv")
행정구역(add2, 행정동까지), 대표자성별(gender), 대표자연령(age), 조직형태(form, 개인, 법인), 사업체구분(div, 본사, 지사 등), 표준산업분류(ind5), 종사자수(emp), 그리고 위치좌표(x_code, y_code)가 있다.
국가공간정보포털 > 오픈 마켓 (http://data.nsdi.go.kr/dataset)에 들어가서 '행정동'으로 검색하면 밑에 '(센서스경계) 행정동경계'가 나오는데 이게 행정동이다. 다운 받고(회원가입, 로그인 필요) 압축 푼 뒤에 QGIS에서 데이터 원본 관리자 열기 아이콘을 클릭한다.
창이 뜨면 왼쪽 메뉴에서 '벡터'를 선택하고, 오른쪽 '원본'에서 방금 압축 푼 폴더에서 .shp 파일을 불러온 다음 추가(A)를 누르면 화면에 지도가 뜰 것이다.
지도를 보면 전국이 다 뜨는데, 일단 내가 필요한 것은 서울이기 때문에 이걸 이용해 서울만 따로 추출한 행정동 경계 지도를 만든다. QGIS 화면 왼쪽 하단에 레이어 창이 있는데 방금 불러온 레이어 이름을 우클릭하고 '속성 테이블 열기(A)'를 선택하면 다음과 같은 테이블이 보일 것이다.
테이블을 계속 스크롤 해서 내려가면 감으로 알게 되는데, ADM_CD 값이 '11'로 시작하면 서울이란 뜻이다. 이제 ADM_CD 가 11로 시작하는 객체만 선택해야 한다. 위에 그림에 빨간 동그라미가 '표현식을 이용해 객체 선택'이란 건데 클릭하면 창이 하나 뜨고 거기에 표현식을 아래와 같이 쓰고(그냥 외워) 객체 선택을 누르면 서울의 행정동만 선택이 된다.
지도 화면을 잘 보면 서울만 노란색으로 변해 있는 걸 볼 수 있는데, 확대 버튼 누르고 서울 주변에 창을 그려서 서울만 확대 해서 보면 더 잘 볼 수 있다.
레이어 창에서 레이어 이름 우클릭 > Export > 선택한 객체를 다른 이름으로 저장 클릭하면 서울 행정동만 따로 저장이 되고 현재 화면에 새 레이어도 생성된다. 이제 원래 레이어는 삭제하고 새로 생성된 레이어만 남긴다.
다음으로, 도로 지도를 불러야 되는데,QGIS에서 플러그인(P) > 플러그인 관리 및 설치 들어간 다음에 'TMS for Korea'를 검색해서 설치를 누르면 플러그인이 설치되고, 카카오 지도, 네이버 지도 , VWorld 지도를 사용할 수 있게 된다.
웹(W) > TMS for Korea > VWorld Maps > VWorld Street 를 선택한다.
지도가 화면에 뜨면서 아까 내가 만들었던 레이어를 다 가린다. 레이어 창으로 가서 VWorld Street 레이어를 밑으로 끌어 당긴 다음에, 서울 행정동 레이어 우클릭 > 속성(P) 들어가서 창이 하나 뜨면 왼쪽에 심볼을 선택하고, 색상을 선택한 다음에 불투명도를 낮추면 지도랑 행정동 경계가 겹쳐서 보인다. (주의!!! 색상 바로 밑에 있는 불투명도를 낮추지 말고, 색상을 선택한 다음에 나오는 창에서 불투명도를 낮춰야 한다.)
색상 선택 창에서 '확인'을 눌렀으면 마지막으로, 레이어 속성 창에서 '적용'을 누르는 것도 잊지 말자.
요런 그림이 완성되었다.
지금은 운 좋게 좌표가 잘 맞았는데, 좌표가 안 맞으면 맞춰야 한다. 레이어마다 다른 좌표계를 쓰고 있는데, 먼저 서울 행정동 데이터는 GRS80중부(EPSG:5174), VWorld Street는 WGS84(EPSG:3857)을 사용한다. 레이어 우클릭 > 속성(P) > 원본 선택하면 '지정된 좌표계' 란에서 좌표를 수정할 수 있다. 파일을 레이어로 불러올 땐 좌표에 대한 지식이 필수이며, 보통 파일을 다운로드 하는 웹사이트에서 좌표계 정보를 알려 준다. 좌표에 해당하는 EPSG 코드를 알아야 QGIS에서 좌표를 찾을 수 있는데, 좌표 정보는 여기서 아주 정리를 잘해 놨다.
https://wogus789789.tistory.com/196
이제 우리의 구역으로 가 보자. 지도에서 충무로~종로3가까지의 구역을 확대해 놓고 다각형을 그려야 한다. 풀다운 메뉴에서 레이어(L) > 레이어 생성 > 새 Shapefile 레이어... 선택. 파일 이름은 적당히 하고 도형 유형은 '폴리곤'으로 한다.
'확인' 누르면 레이어 창에 내가 만든 파일 이름으로 새 레이어가 생성된 것을 볼 수 있는데, 아이콘 메뉴에서 연필 모양을 클릭해서 편집 모드를 켜고, 오른쪽에 '폴리곤 객체 추가' 아이콘을 클릭한 뒤 지도에서 원하는 사각형을 그리면 된다.
폴리곤 객체 추가 아이콘 왼쪽에 디지타이저 옵션 버튼이 있는데 '점으로 디지타이즈'를 선택하고 화면에서 원하는 사각형을 그리면 된다. (각 꼭지점에 왼클릭하고 마지막으로 우클릭하면 id 창 하나 뜨는데 그냥 엔터 누르면 끝)
자 이제 처음 R에서 저장했던 사업체조사 .csv 파일을 불러올 차례다. 이 파일은 x_code, y_code란 이름의 변수로 좌표 값을 가지고 있는데 QGIS에서 부르면 이 변수를 자동으로 좌표로 인식한다.
풀다운 메뉴에서 '레이어(L) > 레이어 추가 > 구분자로 분리된 텍스트 레이어 추가'를 선택하면 창이 뜰 것이다.
CSV 파일은 찾아서 넣고 도형 좌표계는 5179로 선택한다. X필드와 Y 필드는 자동으로 변수를 읽어들였다. '추가(A)'를 누르면 지도에 120만개의 점이 찍히는 시간이 걸려서 점들이 우글우글 늘어나는 모습이 좀 징그럽다.
세 개의 레이어가 좌표가 정확히 맞아서 아름다운 그림을 보여준다. (맞는 좌표를 찾느라 삽질을 참 많이 했다.) 이제 다시 우리 구역을 확대해 보자. 내가 그린 사각형 안에 있는 포인트를 따로 선택해야 한다.
풀다운 메뉴에서 '벡터(O) > 조사 도구(R) > 위치로 선택'을 선택하면 창이 하나 뜬다.
그림에서 보는 것과 같이 포인트 레이어와 폴리곤 레이어를 각각 선택하고 실행 누르면 폴리곤 안에 있는 포인트만 선택이 된다. 폴리곤 안에 있는 포인트가 다른 색깔로 바뀐 것을 볼 수 있다.
이제 선택된 포인트들만으로 이루어진 별도의 레이어를 만들어 저장한다. 레이어 창에서 포인트 레이어(sbs20co2)를 우클릭 하고 'Export > 선택한 객체를 다른 이름으로 저장'을 클릭한다. 포맷은 일단 GeoPackage로 하고, 파일 이름을 정해 주면 그 이름으로 된 새로운 레이어가 만들어진다. 새로 만들어진 레이어를 다시 우클릭하고 'Export > 객체를 다른 이름으로 저장'을 클릭한다. 이번엔 포맷을 바꿔서 엑셀(XLSX) 파일로 저장한다. 구역 내에 위치한 사업체만으로 이루어진 테이블이 생성된 것이다. 이 엑셀 파일은 R에서 불러다가 추가적인 분석을 할 수 있다.