본문 바로가기
DB & SQL/이것이 MySQL이다

MySQL과 공간 데이터

by k-mozzi 2022. 6. 27.
반응형
Preface

 

이번 장에선 MySQL에서 공간 데이터를 저장하고 사용하는 방법을 공부했다.

 

원래 계획대로라면 이전 장의 PHP부터 공부하는 것이 맞지만, 카페 와이파이가 너무 느려 xampp를 다운로드를 할 수 없어 뒷쪽의 공간 데이터부터 보기로 했다.

 

공간 데이터가 대충 어떤 상황에서 사용되고 왜 필요한지 등은 이해할 수 있었지만, 공간 함수부터 시작하여 전체적으로 익숙치 않은 문법이라 느낌만 이해하고 넘어갔다.

 

마지막 부분엔 GIS 응용 프로젝트를 수행하는 파트도 있었는데, 지금 상황에서 굳이 이정도의 내용까지 익힐 필요가 없을 것 같다는 생각이 들어 생략했다.

 

추후 해당 내용이 필요할 때가 오면 다시 한 번 제대로 공부하자.


 

1. 지리정보시스템의 개념

 

 

- 지리정보시스템(GIS: Geographical Information System): 지도와 그에 따른 텍스트(속성) 정보를 컴퓨터에 입력한 후에, 그 입력된 전자지도를 다양한 곳에 응용하는 분야

→ ex) 구글 맵, 구글 어스, 네비게이션 etc.

 

 

- GIS를 표현하는 공간 데이터의 종류

1) 벡터 데이터: CAD(Computer Aided Design)에서 주로 사용되는 데이터(점, 선, 면 등)

2) 래스터 데이터: 일반 그래픽 이미지와 비슷한 개념이며, 인공위성에서 찍은 영상 데이터 등

 

 

- GIS를 구축하기 위해선 속성 데이터와 공간 데이터가 필요하다.

 

 

- 속성 데이터: 기존의 텍스트 기반의 데이터

 

 

- 공간 데이터: 지구상에 존재하는 지형정보를 표현한 데이터

→ 점, 선, 면이라는 3개의 개체로서 표현된다.

 

 

- MySQL애서 사용하는 공간 데이터 형식: Geometry

1) Point: 점

2) LineString: 선

3) Polygon: 면

4) MultiPoint, MultiLineString, MultiPolygon, GeometryCollection 등

 


 

2. MySQL에서 공간 데이터의 저장

 

 

- 기존의 공간 데이터의 관리 방식

MySQL 버전 지원 데이터 타입 저장 단위 비고
3.23 이전 없음 지도 파일의 저장경로 텍스트 저장  
3.23 ~ 5.0 이전 LONGBLOB 지도 파일 단위로 저장 지도 파일뿐 아니라 이미지/동영상 등 모든 파일이 저장됨
5.0 이후 LONGBLOB 지도 파일 단위로 저장
Geometry 개체(entity) 단위로 저장 지원 공간 데이터 전용

 

 

- MySQL에서 공간 데이터 개체가 데이터 형식으로 저장됨으로써 공간 쿼리가 가능해졌다.

→ 'select 하천이름 from 하천테이블 where 하천길이 > 10km' 등과 같은 쿼리가 가능하다.

 

 

- 공간 데이터 형식의 테이블 예시

drop database if exists Gisdb;
create database GisDB;
use GisDB;
create table Streamtbl(
	MapNumber char(10),	-- 지도 일련 번호
    StreamName char(20),	-- 하천 이름
    Stream geometry );	-- 공간 데이터(하천 개체)
    
    
insert into StreamTbl values('330000001', '한류천',
	ST_GeomFromText('LINESTRING (-10 30, -50 70, 50 70)'));
insert into StreamTbl values('330000001', '안양천',
	ST_GeomFromText('LINESTRING (-50 -70, 30 -10, 70 -10)'));
insert into StreamTbl values('330000002', '일산천',
	ST_GeomFromText('LINESTRING (-70 50, -30 -30, 30 -60)'));
    

create table BuildingTbl(
	MapNumber char(10),	-- 지도 일련 번호
    BuildingName char(20),	-- 건물 이름
    Building GEOMETRY );	-- 공간 데이터(건물개체)
    
    
insert into BuildingTbl values('330000005', '하나은행',
	ST_GeomFromText('POLYGON ((-10 50, 10 30, -10 10, -30 30, -10 50))'));
insert into BuildingTbl values('330000001', '우리빌딩',
	ST_GeomFromText('POLYGON ((-50 -70, -40 -70, -40 -80, -50 -80, -50 -70))'));
insert into BuildingTbl values('330000002', '디티오피스텔',
	ST_GeomFromText('POLYGON ((40 0, 60 0, 60 -20, 40 -20, 40 0))'));
    
    
select * from streamtbl;

select * from BuildingTbl;

select * from StreamTbl where ST_Length(Stream) > 140;

select BuildingName, ST_AREA(Building) from BuildingTbl
	where ST_AREA(Building) < 500;
    
select * from Streamtbl
union all
select * from Buildingtbl;

→ MySQL은 쿼리 결과에 공간 데이터 형식이 있을 경우 그래픽적으로 '공간 결과'를 제공해 준다. (spatial view)

 

 

- 공간 함수(spatial function): 공간 데이터를 처리하기 위한 함수

함수명 설명 비고
ST_GeomFromText( ) 문자열을 Geometry 형식으로 변환한다. Point, LineString, Polygon 등
ST_AsText( ) Geometry 형식을 문자열 형식으로 변환한다. Point, LineString, Polygon 등
ST_Length( ) LineString의 길이를 구한다.  
ST_Area( ) Polygon의 면적을 구한다.  
ST_Intersects( ) 두 도형의 교차 여부를 확인한다. 0: 교차 안 함, 1: 교차함
ST_Buffer( ) 도형에서부터 주어진 거리만큼 떨어진 좌표 집합을 구한다.  
ST_Contains( ) 한 도형 안에 다른 도형이 들어 있는지 확인한다. 0: 교차 안 함, 1: 교차함
ST_Distance( ) 두 도형을 합한 결과 좌표 집합을 구한다.  
ST_Union( ) 두 도형이 교차하는 좌표 집합을 구한다.  

 

728x90
반응형

댓글