brunch

You can make anything
by writing

C.S.Lewis

by 배여운 Dec 08. 2016

Mapping_3D Buildings #1

MAPBOX를 활용하여 부산 마린시티 건물 높이 시각화 구현


아래 이전 글을 읽어보시면 저희 스터디를 이해하는데 도움이 됩니다

Study1 : Cartography Study#1 by 배여운
Study 2 : 쉐이프 파일 A to Z(는 아니고 C) by 권오은
Study 3 : '좌표'를 찾은 뒤 Mapbox로 떠난 여행 by 권오은



왜 3D Buildings 맵핑 시각화를 선택했는지

다양한 기획에 따라 건물 높이 데이터는 활용될 수 있기 때문이라고 생각이 들었다


최종적으로 만들어볼 시각화는 다음과 같다 (워크샵을 통해 제작해본 결과물)

https://woons.github.io/3d_building/ (데이터가 많아서 마우스 스크롤로 조금 확대하시면 나와요)

우선 얼마 전에 feedly에서 받아보는 글 중에 이 주제에 관련된 소개가 있었다. [Vencouver Zoning Map]

보자마자 밴쿠버를 가보지 않았지만 구역별 카테고리에 따라 건물들을 한눈에 파악할 수 있어서 놀라웠다. '우와 멋진데!'란 생각도 들었지만 이걸 가지고 도시의 발달과 문제를 시각적으로 보여줘도 좋겠단 생각이 들었다. (개인적으로 CityLab의 MAPS 카테코리 같은 콘텐츠를 만들고 싶은게 지향점이기도 하다) '건물 고도제한구역 및 그린벨트 주변의 빌딩들의 현황'을 감시할 수도 있을 것이고 도시가 과거에 비해 어떻게 커졌는지, 젠트리피케이션 문제 등. 데이터 시각화는 목적에 따라 그리고 기획에 따라 활용가치는 훨씬 커질 수 있다고 생각이 들었기 때문에 레퍼런스 조사를 하고 일주일 연구를 해서 준비했다. 


이번 주부터는 한국경제신문 강종구 데이터 에디터도 참여. 평소에 맵핑에 관심이 많아 기사 콘텐츠에 응용해보고 싶다고 말해줘서 함께 공부하기로 했답니다. 오늘은 강종구, 권오은, 박규빈, 배여운, 신나리가 참여했고 샘플데이터와 코드를 준비해서 제가 발제했습니다. (다들 결과물을 완성시켜줘서 감사했다는!) 정리를 앞으로 이 글을 통해서 할 건데 너무 길어질 것 같아서 1부와 2부로 업로드할 예정입니다.



이젠 위치정보 데이터를 활용해서 맵핑 시각화를

QGIS에서 활용할 데이터를 정제했고 맵핑 시각화 문법에 따라 시각화를 구현할 단계


한 달 동안 shapefile을 만져보며 기본적인 GIS 리터러시를 키우는 시간을 가졌었습니다. 늘 강조하는 부분이지만 맵핑을 포함한 데이터 시각화는 시각화 앞단의 재료(데이터)가 중요하기 때문이죠. 특히, 맵핑은 csv 보다는 shapefile을 다루기 때문에 처음엔 생소했지만 이젠 다들 어느 정도 익숙하게는 다룰 수 있는 거 같아요. 마음 같아서는 좀 더 기본적인 것들을 공부하고 싶지만 저희가 시즌1의 시점을 12월 31일로 세웠기 때문에 오늘부턴 시각화로 넘어갑니다. 개인 프로젝트 진행하는 것도 시각화 단계이기도 하고요. 그래서 지금까지 배운 아래 내용들을 활용해서 3D Building 맵핑을 해보려고 합니다. 


shapefile의 이해와 구성, 좌표계의 이해와 표준 좌표계 변환, QGIS 활용, Layer 활용 등



준비해야 하는 것들

3D Building 맵핑 시각화를 위해 이번 워크샵에서 활용한 데이터와 링크 소개


DATA : GIS건물 통합정보 쉐이프 파일

TOOLS : QGIS, MAPBOX, Carto, Sublime Text


데이터는 국가 공간정보 포털에서 제공하는 GIS건물 통합정보 데이터를 활용합니다. 이유는 시도 단위의 행정구역별 집계된 모든 건물의 정보를 데이터로 제공해주기 때문인데요. 감사하게도 칼럼은 총 23개로 구성되어 있어서 목적에 맞게끔 시각화할 수 있습니다. 칼럼에 대한 정보는 링크를 참고해주세요. 우선 높이에 대한 시각화가 주제이기 때문에 A16칼럼(높이)이 있다는 것에 굉장히 감사했습니다.  


툴은 쉐이프 파일을 다루기 위한 QGIS, 최종적으로 맵핑 시각화할 MAPBOX, 코딩할 Sublime Text 편집기를 사용했습니다. 이렇게 준비하시면 본격적으로 진행됩니다. 



QGIS데이터를 정제해봅시다

인코딩 설정, 좌표계 변환, 특정 지역 추출, 칼럼 추가, geojson추출의 단계로


지난 시간까지 했던 것들에 대한 복습이기도 합니다. 우리가 받은 데이터는 부산광역시 전체 건물에 대한 데이터이기 때문에 그중에 해운대구와 수영구만 추출할 필요가 있으며 구좌표계(중부 좌표계)로 만들어진걸 WGS84 표준 좌표계로 변환도 해줘야 하고 Mac OS 사용자는 인코딩 설정 그리고 Mapbox에서 3D Building 시각화를 위해 필요한 변수를 추가해줘야 하는 꽤(?!) 긴 작업 과정을 거쳐야 합니다 흑.. 다시 정리해보면 QGIS에서 우리가 해줘야 하는 작업들은 아래와 같다


Mac OS의 경우 인코딩 변환

표준 좌표계로 변환

쿼리를 통해 해운대구와 수영구만 추출

속성 테이블에서 칼럼 추가

geojson으로 추출


#인코딩 변환

윈도우 사용자와 달리 Mac OS에선 QGIS를 실행시켰을 때 인코딩 문제(한글)가 발생한다. 원래 SIG_KOR_NM은 서울시 행정구들의 이름이 나와야 한다 (ex. 도봉구, 은평구 등) 이는 간단하게 해결해줄 수 있다. 단계별로 어떻게 해주면 되는지는 글이 너무 길어질 것 같아서 slideshare로 공유합니다. dbf는 속성 정보들을 담고 있기 때문에 향후 인코딩 변환을 해주지 않으면 시각화 요소로 활용하지 못하게 되기 때문이기도 하고 용량이 큰 데이터의 경우 R에서 작업을 해줄 수도 있는데 역시 인코딩 이슈가 발생하기 때문에 QGIS에서 한번 잡아주는 게 편합니다. https://www.slideshare.net/secret/cvWdlpKFOYPWNn 


#좌표계 변환

좌표계 변환에 대한 내용은 지난 글에서 다뤘기 때문에 제가 별도 설명하는 거 보다는 아래 글을 참고하시는 게 훨씬 도움되실 거라고 생각합니다 https://brunch.co.kr/@tipoon1004/55

+proj=tmerc +lat_0=38 +lon_0=127.0028902777778 +k=1 +x_0=200000 +y_0=500000 +ellps=bessel +units=m +no_defs +towgs84=-115.80,474.99,674.11,1.16,-2.31,-1.63,6.43

부산광역시 GIS건물정보 데이터 역시 위의 과정을 거쳐서 보정된 중부원점(Bessel)을 적용시켜줬다. 이 작업은 뒤에 WGS84 표준 좌표계로 변환시켜 주기 위해 인자를 추가했다고 보면 된다. 즉, 뒤에서 다시 한번 WGS84로 변환시켜준다. 



#쿼리를 활용해 필요한 영역만 추출

부산광역시 전체 데이터는 62.4MB! 엄청 크다. 전체를 시각화시켜줄 것이 아니라면 필요한 지역만 추출해서 사용하는 게 효율적이다.  QGIS에서는 질의 생성기라고 하는데 사실 SQL 문법을 활용한다고 보면 된다. 사용법은 레이어 마우스 오른쪽 버튼 클릭 -> 일반 정보 -> 질의 생성기로 들어간다. 거기서 우린 '해운대구'와 '수영구'만 추출할 것이다. 아래 뭔가 복잡한 명령어가 쓰여 있지만 이해하면 쉽다. A4 칼럼은 주소 데이터가 들어있는데 거기서 와일드카드(%)를 활용해서 컴퓨터에게 알려준다. "QGIS야~ A4칼럼 중에 해운대구와 수영구란 단어가 포함되어 있으면 추출해줘" 뭐 이런 명령이다. 따라서 QGIS는 A4칼럼 데이터 중에 해운대구와 수영구란 단어가 들어간 행들을 추출해준다. 그럼 우린 필요한 지역의 데이터 획득에 성공! QGIS에서 아래 이미지와 같이 특정 지역만 나오는 것을 확인할 수 있습니다. 

"A4" LIKE '%해운대구%' OR "A4" LIKE '%수영구%'  



#속성 테이블에 필요한 칼럼 추가 [min_height, type, extrude, underground 등]

GIS건물 통합정보 데이터만 사용한다면 더 이상의 작업은 필요 없겠으나 3D Building 시각화를 Mapbox에서 해줘야 하기 때문에 별도 칼럼 추가 과정이 필요하다. 3D Building을 렌더링 해주기 위해선 몇 가지 옵션이 필요한데 min_height는 건물의 최저 높이를 뜻한다. Mapbox에서 렌더링을 해줄 때 최저 높이값이 얼마부터 건물을 위로 값을 줄 것인지가 필요한 것이다. 즉, 값이 0이라면 지면 기준 0부터 시작하는 것이고 건축물의 생김새에 따라 지면 몇 미터 이상부터 시작하는 것도 있을 수 있다. https://www.mapbox.com/blog/mapping-3d-buildings/

extrude는 건물의 3D 추출 여부를 확인하기 때문에 true, false값만 가지게 된다. 따라서 3D로 렌더링 하고 싶은 데이터(관측치)의 경우는 일괄적으로 true 값을 주면 된다. underground 역시 true, false값을 가지는데 이 건물이 지상 or 지하 여부를 묻는 거기 때문에 false값을 줘야 한다. type은 'building:part'. 


기존의 데이터에 이 칼럼들을 붙이는 방법은 여러 가지가 있을 건데 난 이 두 가지 방법을 준비했다. 


1. QGIS 내부의 '필드 계산기' 활용

   - 이 경우는 QGIS 내부에서 쉽게 일괄 값을 적용할 수 있겠지만 데이터가 많으면 엄청 작업이 느려진다

2. R에서 foregin 패키지 활용

   - R의 foregin 패키지는 dbf 확장자 작업을 data.frame으로 작업하기 때문에 훨씬 빠르다

     하지만 QGIS 작업한 것들을 외부로 별도 저장을 해줘야 하고 작업이 끝난 후 다시 QGIS에서

     기타 작업을 해야만 하는 단점이 있다. 


#geojson으로 최종 추출

위의 과정까지 했다면 이제 최종적으로 WGS84 좌표계로 변환하고 geojson으로 export만 하면 된다. 쉐이프 파일은 기본적으로 웹에서 적용되는 방식이 아니기 때문에 모든 데이터를 담은 geojson으로 추출해줘야만 한다. 방법은 쉽다. 다른 이름으로 저장하기를 통해 좌표계 설정하고 geojson 옵션만 클릭해주면 된다. 



오늘은 여기까지

Mapbox에서 시각화하기 전에 QGIS에서 데이터를 모두 다뤄줬다. 즉 요리할 재료의 손질이 끝!


다음 글에서 Mapbox를 어떻게 활용하여 시각화했는지 소개하려고 합니다. 이번 글에 모두 정리하고 싶었지만 너무 길어지는 관계로 오늘은 여기까지! 한번 따라 해 보시고 궁금한 게 있다면 언제든 메시지 주세요. 


woons.2016@gmail.com (배여운)


참고

- 국가 공간정보 포털 : www.nsdi.go.kr/?menuno=2813&k=건물통합

- Map 3D Building 관련  : https://www.mapbox.com/blog/mapbox-studio-building-heights/

- Mapbox : http://mapbox.com

- Carto : http://carto.com


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari