공간데이터

선봉·2023년 3월 14일
0

MySQL

목록 보기
35/36

공간데이터

지형 정보를 표현한 데이터

데이터 형식 : Geometry

Geometry 데이터 유형은 다양한 유형의 기하학적 데이터를 저장할 수 있으며,
이러한 데이터는 점, 선, 면, 다각형, 다중 선, 다중 면 등이 될 수 있습니다.

Geometry 데이터 유형은 다음과 같은 데이터 유형을 포함합니다.

  1. POINT - 지리 좌표를 저장합니다. 위도와 경도 또는 X와 Y 좌표를 사용하여 정의할 수 있습니다.
  2. LINESTRING - 일련의 좌표로 구성된 라인을 나타냅니다.
  3. POLYGON - 일련의 좌표로 구성된 폴리곤을 나타냅니다.
  4. MULTIPOINT - 여러 좌표를 그룹화하여 저장합니다.
  5. MULTILINESTRING - 여러 라인을 그룹화하여 저장합니다.
  6. MULTIPOLYGON - 여러 폴리곤을 그룹화하여 저장합니다.
함수명설명비고
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: 포함X
1: 포함
ST_Distance()두 도형 사이의 거리를 구함
ST_Union()두 도형을 합한 결과 좌표 집합을 구함
ST_Intersection()두 도형이 교차하는 좌표 집합을 구한다.

실습

DROP DATABASE IF EXISTS  GisDB;
CREATE DATABASE GisDB;

USE GisDB;
CREATE TABLE StreamTbl (
	MapNumber CHAR(10),-- 지도일련번호
    StreamName CHAR(10), -- 하천이름
    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 BuildingTbl
UNION ALL
SELECT * FROM StreamTbl;


  • 함수 사용
SELECT * FROM StreamTbl WHERE ST_Length(Stream) > 140; -- 길이가 140초과인 하천
SELECT * FROM BuildingTbl WHERE ST_AREA(Building) <500; -- 면적이 500미만인 건물 조회
-- 안양천과 겹치는 건물 조회
SELECT StreamName, BuildingName, Building, Stream
	FROM BuildingTbl, StreamTbl
    where st_intersects(Building, Stream)=1 and StreamName = '안양천';

select st_buffer(Stream,5) from StreamTbl; -- 하천을 조금 두껍게 표현 (보기좋게)

profile
백엔드 개발자

0개의 댓글

관련 채용 정보