GIS

PostgreSQL/PostGIS에서 SQL 언어 학습하기

유병혁 2018. 5. 27. 15:31

본 글은 콜로라도대학교 덴버캠퍼스 지리학부 FOSS4G Lab의 리카르도 올리베이라(Ricardo Oliveira) 님이

작성하신 'Getting Started with PostGIS' 온라인 튜토리얼 시리즈를 한국어 사용자에 맞게 수정한 글입니다.

이 글은 GIS United 김우미 님과 함께 작성하고 있습니다.

 

안녕하세요? 앞서 QGIS에서 PostGIS 레이어를 추가해봤는데요,
이번 글에서는 SQL 쿼리를 통해 공간데이터를 다루어보도록 하겠습니다.

 

[1] 윈도우에서 PostgreSQL과 PostGIS 설치하기 | http://blog.daum.net/geoscience/1237
[2] PostgreSQL/PostGIS에서 DB 생성하고 공간데이터 추가하기 | http://blog.daum.net/geoscience/1249
[3] QGIS에서 PostGIS 레이어 추가하기 | http://blog.daum.net/geoscience/1250

 

SQL이란?
SQL은 관계형 데이터베이스 관리 시스템의 데이터를 관리하기 위해 설계된 프로그래밍 언어로,

구조화 쿼리 언어(Structured Query Language)라고도 합니다. SQL을 통해서 우리는 데이터에

대해서 질문을 던져볼 수 있고, 데이터를 실제로도 다뤄볼 수 있습니다.

이번 글에서는 기본적인 명령문 수행을 위해서 SQL을 어떻게 이용하는지 정리해보고자 합니다.

 

서울시 도로구간 위치정보(좌표계: WGS1984) 데이터셋으로 학습해보겠습니다. 공간데이터를 획득하기 위해

서울열린데이터광장(http://data.seoul.go.kr/)에 접속하고 '서울시 도로구간 위치정보'를 검색해보겠습니다.

 

아래 '서울시 도로구간 위치정보 (좌표계:WGS1998)' 데이터셋에서 MAP 버튼을 클릭합니다.

 

SHP 파일목록의 'TL_SPRD_MANAGE_W_SHP.zip'을 다운로드하고 압축을 해제합니다.

 

이전 글을 참고하여 Seoul DB에 TL_SPRD_MANAGE_W_SHP 쉐이프파일을 추가합니다.

 

해당 파일을 QGIS에서 레이어 추가해 보겠습니다. QGIS 2.18에서 '벡터 레이어 추가'를 사용하실 경우엔,

소스 유형은 데이터베이스, 데이터베이스 유형은 PostgreSQL, 연결은 Seoul로 선택해주시면 되겠습니다.

 

'추가할 벡터 레이어 선택' 창에서 해당 도로 레이어를 선택합니다.

 

아래와 같이 서울시 도로구간 레이어가 추가되었습니다.

 

이제 pgAdmin에서 SQL 구문을 시작해보겠습니다.

 

참고로, Query Tool은 pgAdmin 상단 메뉴에서 'Tools > Query Tool'를 선택하시면 됩니다.

 

'Select'은 가장 기본적인 SQL 쿼리문입니다. 특정 테이블에서 특정 조건에 기반한 데이터를 가지고 오고 싶을 때 사용합니다

도로 데이터셋에서 모든 데이터를 불러오겠습니다. 도로 데이터셋의 테이블 이름은 'tl_sprd_manage_w'로 설정되어 있습니다.

 

아래와 같은 쿼리를 작성하고 실행 버튼 혹은 F5를 누르겠습니다. *(별표)는 모든 데이터를 불러오겠다는 뜻입니다.

 

짠! 데이터의 테이블이 불러와졌습니다.

 

이 테이블 상의 데이터를 다뤄 보겠습니다. 그런데 테이블 명이 너무 기니, 테이블 명을 간단하게 바꿔보겠습니다.
다음과 같은 쿼리를 입력합니다. tl…로 시작하는 긴 테이블 명을 간단히 'road'로 바꾸어주겠습니다.

 

아래와 같이 테이블 명이 road로 변경되었습니다.

 

해당 테이블의 데이터를 보거나 편집할 때는 테이블 명을 우클릭한 후,

'View/Edit Data' 하부 메뉴를 선택하시면 됩니다. 첫번째 100줄을 확인해 보겠습니다.

 

아래와 같이 road 데이터 100줄이 표시됩니다. 여기서 road_lt 컬럼은 '도로 길이'를 나타냅니다.

 

avg 쿼리문을 사용하여 도로 길이의 평균값을 구해 보겠습니다.

 

짠! 서울시 도로 길이의 평균값을 구했습니다. 속도가 정말 빠르죠?! 같은 방식으로 합계나 특정 비율을 구할 수도 있습니다.

 

다음 질의문을 학습해 보겠습니다.

 

이번에는 폭이 5m 미만인 도로의 이름과 폭을 산출해 보겠습니다.

데이터에서 rn 칼럼은 도로명, road_bt 칼럼은 도로폭을 나타냅니다.

 

쿼리문은 다음과 같습니다. where는 가장 쓰임새가 많은 SQL 쿼리 중 하나입니다.

 

자, 결과가 추출되었습니다. 폭이 5m 미만인 도로들이 선택되었습니다.

 

이제 SQL 쿼리문으로 공간데이터를 다루실 수 있겠죠?! 참고할 만한 기본적인 쿼리문 몇 가지를 소개합니다.