지리정보시스템(GIS, Geographical Information System)이란
지표면과 지상공간에 존재하고 있는 각종 자연물(산,강,토지 등)과 인공물(건물,도로,철도 등)에 대한 위치 정보와 속성 정보를 컴퓨터에 입력 후, 이를 연계시켜 각종 계획 수립과 의사 결정 및 산업 활동을 효율적으로 지원할 수 있도록 만든 첨단 정보 시스템(출처:국토지리정보원, https://www.ngii.go.kr)
더 쉽게 표현하자면 지도와 그에 따른 텍스트(속성) 정보를 컴퓨터에 입력한 후에, 그 입력된 전자지도(Digital Map, 수치 지도)를 교통, 환경, 농업, 생활, 시설물 관리 등의 다양한 곳에 응용하는 분야라고 생각하면 되겠다.
예로 Google Earth의 경우에는 지형에 대한 인공위성 영상, 각 주요 건물에 대한 사진 정보, 해당 위치에 대한 지명 정보 등을 모두 함께 관리하는 통합된 GIS의 사례 중 하나다.

[그림 14-2]에서 표현된 속성 데이터는 지금까지 사용해 온 DB에 테이블 형태로 입력 관리할 수 있었다. 그런데, 공간 데이터(=지도 데이터)는 MySQL 5.0 이전에는 별도로 관리할 수가 없었으며 일반적으로 공간 데이터는 파일 형태로 별도로 관리해 왔다.
[그림 14-2]에 나온 GIS를 구축하기 위한 속성 데이터는 기존 DBMS에서 관리하고, 공간 데이터(파일)는 별도로 관리하게 됨으로써 데이터의 이중 관리라는 문제가 발생하며, 고가의 GIS 응용 프로그램 없이는 GIS를 활용하기가 어려운 것이 현실이었다. 이를 MySQL 5.0부터는 공간 데이터를 저장할 수 있는 새로운 공간 데이터 형식을 지원함으로써 진정한 속성 데이터와 공간 데이터의 '통합'을 지원하게 되었다.
GIS에 대한 기본적인 개념은 앞에서 설명했다. [그림 14-2]의 속성 데이터와 관련된 것은 기존에 우리가 사용해 왔던 문자, 숫자, 날짜 등의 데이터 형식들이다. 그리고, 기존에는 별도로 파일 단위로만 관리되던 공간 데이터를 각각의 개체로 저장/관리/검색하기 위해서 MySQL 5.0부터 Geometry라는 데이터 형식을 지원한다.
그렇다면, 이러한 공간 데이터란 정확히 어떤 형태를 지니는지 살펴볼 필요가 있다. 특히, 우리나라에서 구축 및 사용되고 있는 공간 데이터를 중심으로 알아보도록 하자.
공간 데이터(Spatial Data)는 쉽게 지구상에 존재하는 지형정보를 표현한 데이터라고 생각하면 된다. 즉, 종이지도에 표현된 강, 도로, 나무, 건물, 가로등, 전봇대 등의 모든 표현물을 디지털 지도(정식명칭은 수치지도)상에 옮겨 놓은 데이터를 말한다.
[그림 14-3]은 국토지리정보원(http://map.ngii.go.kr)에서 배포하고 있는 수치지도 샘플이다.(샘플 데이터를 제외하고는 유상으로 구매해야 함)

[그림 14-3]의 가운데 지도는 1/5,000 축척의 수치지도이며, 전국은 약 1만 6천여 개의 1/5,000수치지도로 제작되어 있다. 이 수치지도는 NGI,SHP,DXF 등의 포맷 파일로 각각 저장되어 있다.
[그림 14-3]의 제일 오른쪽 그림은 우리나라 전체를 포괄하는 수치지도의 색인도다. 즉, 제일 오른쪽의 작은 사각형 하나를 확대한 것이 가운데 한 장의 지도라고 생각하면 된다.
이렇게 국가에서 구축해 놓은 공간 데이터를 이용해서 많은 분야에서 이미 활용하고 있으며, 현재도 추가로 이를 활용하려고 시스템을 각 분야에서 개발하고 있다.
우리가 흔히 사용하는 자동차의 내비게이션은 이러한 공간정보가 활용되는 가장 보편적인 분야 중 하나다. 자동차의 내비게이션의 경우에는 공간 데이터와 더불어 GPS(위성위치정보)와 함께 활용되는 좋은 예이다. 또한, 구글 어스나 카카오맵, 네이버 지도 등과 같은 사이트도 공간정보를 적극 활용하는 응용 분야 중 한 가지라고 할 수 있다.
[그림 14-3]의 제일 왼쪽은 수치지도를 일부분 확대한 것이다. 이를 통해서 공간 데이터가 무엇으로 구성되는지 살펴보면, 공간 데이터는 주로 점(Point), 선(Line), 면(Polygon)이라는 3개의 개체로서 표현된다.

MySQL 5.0 이전에는 수치지도상에 표현되는 개체(강, 건물 등)를 저장할 수 없었다.
그래서 일반적으로는 공간 데이터는 DB의 내부에 행 데이터가 아닌 외부의 파일로 별도로 존재하게 되었다. 응용 프로그램에서는 DB의 내용과 파일의 내용을 별도로 처리할 수밖에 없었다.


[그림 14-4]를 보면 수치지도 테이블과 수치지도가 관련 없이 별도로 관리 및 저장되고 있다. 단지, 수치지도 테이블의 하나의 열에 전자지도가 저장된 지도 파일 경로를 문자 값으로 가지고 있어서, 이를 응용 프로그램에서 읽어 들여 필요 시에 지도 저장 폴더로부터 파일을 별도로 불러들이는 방식을 사용한다.
일반적으로 많이 사용되는 방법이지만, 수치지도를 표현하는 테이블과 실제 지도 파일이 이중 관리됨으로써 관리상 문제가 발생할 소지가 다분하다. [그림 14-4]의 예로 현재는 지도 파일이 C:\mapdata\에 저장되어 있으나, 만약 디스크공간 등의 문제로 D:\mapdata\와 같은 다른 곳으로 파일을 이동하게 되면 기존의 수치지도 테이블의 '지도 파일 경로'열의 내용도 모두 변경해줘야 하는 이중 작업을 해야만 한다.

[그림 14-5]의 방식은 수치지도 파일을 하나의 데이터로 취급하여 테이블의 열에 저장하는 방식을 취한 것이다. 이러한 방식의 장점은 [그림 14-4]와 같이 관리의 이중성을 없애고, 수치지도의 속성정보와 수치지도 데이터 파일 자체를 통합하여 하나의 테이블로 관리할 수 있게 되어 관리적인 측면에서 상당한 효율을 얻을 수 있다.

[그림 14-6]을 보면 데이터 개체 하나하나를 행 데이터로 취급함으로써 테이블에 저장하는 방식을 취한다. 쉽게 생각하면 '하천 이름'을 저장하기 위해서 CHAR 데이터 형식의 열로 생성하고 그 내부에는 '한류천'등과 같은 실제 데이터가 입력되는 것과 마찬가지로, 공간 데이터도 GEOMETRY와 같은 데이터 형식의 열로 생성하고 그 내부에는 실제 '하천의 개체(Line의 좌표 값들)'를 입력하게 된다.
우선 간단한 일반 텍스트를 입력하기 위한 방법과 공간 데이터를 입력하기 위한 예를 보면 다음과 같다.

일반 텍스트인 지도일련번호나 하천이름은 지금까지의 방식인 CHAR나 VARCHAR로 정의하고 입력하면 되며, 선형(LINESTRING)으로 이루어진 하천 개체는 공간 데이터 형식인 GEOMETRY 데이터 형식으로 정의하면 된다. 입력은 그 함수인 ST_GeomFromText()를 사용하여 입력할 수 있다. 이렇게 되면 [그림 14-6]의 하천 테이블의 첫 행이 입력되는 것이다.
MySQL에서 공간 데이터 개체가 데이터 형식으로 저장됨으로써 얻게 되는 또 한 가지의 특징은 공간 쿼리가(Spatial Query) 가능해졌다는 점이다.
일반 쿼리에서 SELECT 학생이름 FROM 학생테이블 WHERE 나이>25문과 같이 나이가 25살이 넘는 학생의 쿼리가 가능하듯이, SELECT 하천이름 FROM 하천테이블 WHERE 하천길이>10KM문과 같이 쿼리가 가능해졌다. 더 나아가 "현재 하천에서 100M 이내에 인접한 상점들의 목록을 출력하라", 'A상점에서 1KM 안에 있는 아파트의 목록과 위치를 출력하라"와 같은 공간 쿼리도 가능하다.
이러한 공간 쿼리는 별도의 GIS 소프트웨어가 있어야만 처리가 가능햇으나, MySQL에서 제공하는 기능들을 활용함으로써 별도의 GIS 소프트웨어가 없이도 가능하다.
실습을 통해서 익혀보자. 그런데, 공간 쿼리 결과를 공간 뷰어를 통해서 보기 좋게 출력하기 위해서 실세계의 X,Y좌표가 아닌, 가상의 좌표 값(-80~+80)을 사용했다. 실세계의 좌표와는 다르지만 실습 결과를 간략히 표현하기 위해서 모든 X 및 Y좌표가 -80~+80 범위에 존재한다고 가정하고 실습을 진행하자.