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( ) | 두 도형이 교차하는 좌표 집합을 구한다. |
'DB & SQL > 이것이 MySQL이다' 카테고리의 다른 글
| PHP 기본 프로그래밍 (0) | 2022.07.02 |
|---|---|
| Visual Studio Code에서 PHP 코드 실행하기 (2) | 2022.07.02 |
| 전체 텍스트 검색과 파티션 (0) | 2022.06.26 |
| 스토어드 프로그램 (2) (0) | 2022.06.25 |
| 스토어드 프로그램 (1) (0) | 2022.06.23 |
댓글