CARTO Builder로 AI 분포 및 확산지도 제작하기

2017년 1월 ‘로케이션인텔리전스매거진’ 뉴스레터에는 REPORT: See and Predict, 전염병 데이터의 시각화와 분석이 발행되었습니다. 해당 포스팅에서 보여드린 에스피에이치가 위치데이터 시각화 플랫폼 CARTO를 사용해 만든 조류독감 분포 현황 지도시계열 지도의 제작 방법을 자세히 소개해드리려고 하는데요. 데이터 수집, 가공부터 시작해서 CARTO Builder를 이용한 데이터 업로드, 지도 시각화 내용까지 다룰 예정입니다. CARTO Builder의 실 사용법에 대해 좀더 이해할 수 있는 시간이 되었으면 좋겠습니다. ‘개발자가 개발자에게 들려주는 이야기’ 지금부터 시작하시죠!

목차

  1. 사회 이슈 인식 – AI의 심각성을 인지하다
  2. 사용할 수 있는 데이터가 있을까? – 데이터 수집 및 아이디어 구상
  3. 데이터 정제 및 가공
  4. 데이터 업로드
  5. 지도 시각화 및 디자인

1. 사회 이슈 인식 – AI의 심각성을 인지하다

출처 – 한겨레 신문 12월 8일 기사

한겨레 신문에서 이런 기사를 접했습니다. 도대체 얼마나 심각한지, 어떤 경로로 전파가 된건지 기사나 인터넷에 떠도는 사진 지도로는 감이 잡히지 않아 직접 지도를 제작해보기로 합니다.

2. 사용할 수 있는 데이터가 있을까? – 데이터 수집 및 아이디어 구상

AI 발생지의 정보가 있는 데이터가 어디에 있을까 확인하던 중, 농림축산식품부 가축전염병 발생현황에 대한 정보공개 데이터를 확인하게 됩니다.

출처 – 농림축산식품부 홈페이지

게시물을 열어 한글파일을 확인하니 최초 발생시부터 현재까지 다음과 같이 연번, 소재지, 발생일시, 가축의 규모 및 종류에 대한 정보가 들어 있습니다.

출처 – 농림축산식품부 홈페이지

데이터 확인 결과 이 데이터를 정제 및 가공해서 CARTO에 업로드하면 충분히 활용할 수 있겠다는 판단이 들었습니다. 그래서 데이터 정제 및 가공작업을 시작하기로 합니다.

3. 데이터 정제 및 가공

데이터의 “소재지” 확인 결과 소수의 일부 도로명이나 읍면동 단위로 된 소재지를 제외하고는 대부분이 리 단위로 되어 있습니다. 그래서 보유하고 있는 리 데이터를 활용하여 지도를 제작하기로 합니다. 리 데이터는 국가공간정보포털 등에서 쉽게 구할 수 있습니다.

출처 – 국가공간정보포털

리 데이터의 dbf 파일을 열어 속성을 확인해 보니 li_cd라는 리 코드 값이 있습니다. 이 값이 각 리를 구분해주는 구분자가 될테니 추후 테이블 Insert와 Update시에 쉽게 이용할 수 있도록

  1. 리 데이터셋에 시도 + 시군구 + 읍면동 + 리가 들어간 컬럼을 리 테이블에 생성
  2. 업로드(업데이트)할 데이터의 “소재지” 컬럼에서 주소가 일치하는 곳에 li_cd를 업데이트
  3. 카토에 리 데이터셋(속성 및 지오메트리)을 업로드 해 두었다가
  4. 카토에서 Join을 통해 li_cd가 일치하는 곳의 지오메트리 업데이트

의 순서로 진행하도록 합니다. 다만 리 테이블의 주소와 업데이트시 이용할 “소재지”의 포맷이 약간 다를 수 있기 때문에, 엑셀을 이용하여 정확히 일치하는 주소가 없을 경우는 수동으로 li_cd를 수정해주기로 합니다.

CARTO 빌더에 시계열 지도도 시각화할 예정이기 때문에 리 폴리곤뿐 아니라 포인트 지도도 필요합니다. 하지만 리 데이터셋은 폴리곤이기 때문에 저희 SPH의 제품인 SuperMap iDesktop의 Region to Point 기능을 이용하여 리 폴리곤을 포인트로 변환하는 작업을 해줍니다.

CARTO에 데이터셋 업로드를 위해 가공된 데이터를 Shape파일로 다시 Export하고, Export 된 shp, shx, dbf 파일을 zip으로 압축합니다. 작업이 끝나면 AI 현황을 CARTO에 업로드하기 위한 CSV 파일을 만듭니다. 농림축산식품부의 데이터에 근거하여 사용하기 좋게 가공합니다.

(TIP: 리 코드는 다음과 같은 규칙에 따라 10자리로 구성된 PNU 코드입니다.

PNU 코드의 구조 – Encoding and structure of the PNU (Source: Seoul, 2012)

이미지 출처: (사)대한국토·도시계획학회

여기서  읍면동, 시군구, 시도 코드를 추출하고 각 데이터에서 해당 코드에 맞는 행정구역을 추출 후, 엑셀의 Concatenate 함수를 활용하여 시도+시군구+읍면동+리 의 형태로 만들어 전국 리 CSV 파일에 컬럼을 추가했습니다.)

이런 식으로 csv 테이블을 만들었습니다. 소재지, 발생일, 가축의 종류, 가축의 규모, 리 코드 등의 컬럼이들어간 테이블입니다. 일단 첫 업로드시에는 엑셀을 이용해서 리 데이터셋의 리 코드를 입력하였습니다. 카토에 업로드할 리 테이블과 li_cd가 일치하는 곳의 지오메트리를 가져올 것입니다.

그런데 이 테이블첫 행은 테이블의 컬럼이 될텐데 깜빡하고 “소재지”를 그냥 넣었습니다.  카토에서는 알아서 빈칸으로 업로드 될 것입니다. 그리고 위치정보(지오메트리)가 들어가는 컬럼이 없는데, 카토에서 알아서 the_geom 컬럼을 만들어 초기값을 null로 설정해 줄 것이기 때문에 일단 비워두고 업로드 하기로 합니다.

4. 데이터 업로드

드디어 사전준비가 끝나고 데이터를 업로드할 준비가 되었습니다. 업로드할 데이터는

  1.  전국 리 포인트
  2.  전국 리 폴리곤
  3.  AI 발생지 포인트
  4.  AI 발생지 폴리곤
  5.  시도 경계

이렇게 5개 입니다. 포인트와 폴리곤을 구분하는 이유는 폴리곤은 확산 과정과 분포 현황 2개의 지도를 만들 것이기 때문입니다. 데이터셋 업로드를 위해 카토에서 NEW DATASET을 클릭합니다.

압축한 두 ZIP 파일(리 포인트와 폴리곤), 그리고 두 CSV 파일(AI 포인트와 폴리곤)을 업로드합니다. (CSV 파일 업로드시 팁: 종종 인코딩 에러가 발생하여 업로드가 되지 않는 경우 가 있는데, 그럴 때에는 메모장으로 CSV 파일을 열고 인코딩을 UTF-8로 설정하여 다시 저장하면 에러가 해결되어 깔끔하게 업로드 됩니다.)

그리고 업로드 된 각 데이터셋을 열어 내용을 확인합니다. 최초에는 AI 테이블들의 the_geom(지오메트리) 레코드가 모두 null이지만, 하단의 토글을 눌러 SQL 뷰를 선택하고 다음과 같은 식으로 Join을 통한 the_geom 업데이트를 해줍니다. (TIP: CARTO Builder는 PostgreSQL과 PostGIS의 문법과 기능을 지원합니다.)

(TIP: date 컬럼은 추후 POP-UP창에 텍스트로 보기 쉽게 표출할 수 있도록 ai_date 컬럼을 만들고 date형을 char형으로 캐스트하기 위해 다음과 같은 SQL문을 적용하였습니다.

UPDATE bird_ai_li_1229_pg
SET ai_date = to_char(“date”, ‘YYYY년 MM월 DD일’)

그리고 시도명만 표시할 수 있도록 do_nm  컬럼을 만들고 정규식을 사용하여 시도명만 잘라내어 업데이트 하였습니다.

UPDATE bird_ai_li_1229_pg
SET do_nm = regexp_matches(_, ‘[^\s]+’)

그런데 시도명에 중괄호{}가 감싸져 이를 공백으로 제거하는 작업도 해줬습니다.

UPDATE bird_ai_li_1229_pg
SET do_nm = replace(do_nm, ‘{‘ , ”)

UPDATE bird_ai_li_1229_pg
SET do_nm = replace(do_nm, ‘}’ , ”)

)

지오메트리가 업데이트된 테이블은 다음과 같이 완성됩니다.

AI 정보 포인트 데이터셋

AI 정보 폴리곤 데이터셋

리 포인트 데이터셋

리 폴리곤 데이터셋

이렇게 리 코드를 기본키화 시켜 놓으면, 앞으로 업데이트시에는 다음과 같이 테이블에 Inert만 하고 지오메트리만 Update해주면 되기 때문입니다.

그럼 마지막으로 AI 폴리곤 데이터셋의 테이블에서 우측 하단의 CREATE MAP을 클릭하여 지도를 생성합니다. 이제 본격적인 지도 시각화 과정이 남았습니다.

5. 지도 시각화 및 디자인

생성된 지도의 LAYER 패널에서 ADD를 선택하여 시도경계 레이어를 추가해줍니다. 그리고 베이스맵 레이어는 데이터가 눈에 잘 띄도록 검은색으로 변경해줍니다.

그리고 시도별 폴리곤이 다른색으로 보이도록 스타일을 설정합니다.

또 POP-UP(인포윈도우)을 폴리곤 Hover시 다음과 같은 내용이 보이도록 설정합니다. (HTML 사용 가능)

또 가축의 규모를 Buffer로 보여주기 위해 포인트 레이어를 추가하여 이름변경 후, 레어어 설정에서 하단의 SQL을 선택합니다. 그리고 PostGIS의 버퍼 생성 쿼리문을 입력합니다. 가축의 규모에 비례하여 커지는 원을 생성합니다.

다음으로 시도경계의 스타일을 생성하여 경계가 잘 보이고 FILL을 투명하게 합니다. 또 라벨을 만들어 어느 시도인지 표시가 되도록 다음과 같이 설정합니다.

또 카토 빌더에서는 위젯을 통한 필터링이 가능한데요, 빌더 메뉴에서 WIDGETS 버튼을 누른 후 ADD로 추가가 가능합니다. 그러면 다음과 같이 가능한 위젯들이 나타납니다. 카테고리별 필터 위젯, 히스토그램 위젯, 수식(합, 평균, 최대값 등), 시계열 필터 등의 위젯 추가가 가능합니다.

추가할 위젯과 Source를 선택하고 이름을 설정해주면 다음과 같이 위젯 추가가 완료됩니다.

이제 폴리곤(AI 분포 현황) 지도가 완성됐으니 포인트(AI 발생 과정-시계열) 지도를 만들어줍니다. 메뉴의 Duplicate를 이용해서 지도를 복제하고, 조금만 수정하여 시계열 지도를 만들도록 합니다.

버퍼로 생성한 규모 원은 없애고 폴리곤 색상은 시도별로 동일한 노란색으로 변경했습니다. 포인트를 레이어의 STYLE을 ANIMATED로 설정하고, Accum. 을 선택하여 시계열 포인트가 계속 축적되도록 설정합니다.

그리고 포인트로 위치 라벨을 생성하고, 토글을 이용하여 CSS 설정창에서 다음과 같이 zoom 레벨이 9 이상일 때 라벨이 보이도록 설정합니다.

이제 지도 메뉴 좌측 상단의 PUBLIC을 클릭 후 UPDATE 버튼을 클릭하면 지도가 저장되고, 링크를 복사하거나 홈페이지에 임베드하여 배포할 수 있습니다.

완성된 지도

1. AI 발생현황 지도

2. AI 분포지도

전국으로 퍼져버린 AI 현황을 보면 얼마나 사태가 심각한지 알 수 있습니다. AI 때문에 농민분들의 피해가 이만저만이 아닐텐데, 하루 빨리 문제가 해결되어 정상화 되는 날이 왔으면 좋겠습니다. CARTO Builder 사용법에 대한 문의사항이 있으시면 help@sphinfo.co.kr로 연락주시기 바랍니다. 긴 글 읽어주셔서 감사합니다.