DB

[MySQL] (GIS3️⃣) POLYGON과 공간 포함관계 쿼리 실습

인생아 2025. 7. 18. 14:48
반응형

MySQL의 GIS 기능 중 하나는 영역(지역)을 나타내는 POLYGON 타입이다.
이를 활용하면 매장, 구역, 지역 경계 등의 포함 여부를 SQL로 직접 판단할 수 있다.

🔷 POLYGON이란?

POLYGON은 다각형 형태의 영역을 정의하는 공간 데이터 타입이다.
최소 3개의 꼭짓점으로 폐곡선을 만들어야 하며, 시작점과 끝점은 동일한 좌표여야 한다.

예시:

POLYGON((126.97 37.56, 126.98 37.56, 126.98 37.57, 126.97 37.57, 126.97 37.56))

위는 서울 시청 인근 사각형 범위를 나타내는 POLYGON이다.

🏗️ POLYGON 테이블 생성 및 데이터 삽입

CREATE TABLE regions (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(100),
  area POLYGON NOT NULL,
  SPATIAL INDEX(area)
);
INSERT INTO regions (name, area)
VALUES (
  '시청 주변',
  ST_GeomFromText('POLYGON((126.97 37.56, 126.98 37.56, 126.98 37.57, 126.97 37.57, 126.97 37.56))', 4326)
);

✅ 좌표는 시계방향(clockwise) 으로 나열
✅ SPATIAL INDEX로 빠른 포함 여부 확인 가능

반응형

📍 포함 여부 판단: ST_Contains()

가장 많이 쓰는 공간 함수는 ST_Contains()다.
특정 좌표가 POLYGON 내부에 포함되는지 여부를 판단할 수 있다.

POINT 테이블 생성 및 삽입

CREATE TABLE places (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(100),
  location POINT NOT NULL,
  SPATIAL INDEX(location)
);
INSERT INTO places (name, location)
VALUES 
('카페A', ST_GeomFromText('POINT(126.975 37.565)', 4326)),
('서점B', ST_GeomFromText('POINT(126.981 37.571)', 4326));

포함 여부 조회

SELECT p.name, r.name AS region_name
FROM places p
JOIN regions r
ON ST_Contains(r.area, p.location);

결과 예시:

카페A | 시청 주변

✅ 카페A는 사각형 영역 안에 있음
✅ 서점B는 바깥에 있어서 결과에 없음

반응형

🔄 반대로도 쓸 수 있음: ST_Within()

ST_Within(A, B)는 A가 B 안에 있는지 확인한다.

SELECT p.name
FROM places p
JOIN regions r
ON ST_Within(p.location, r.area);

ST_Contains(B, A)와 동일한 결과를 반환한다.

🧠 실무에서의 활용 예

  • 특정 반경이나 지역 내 매장 찾기
  • 마케팅 타겟팅 (예: 3km 내 고객)
  • 지도 기반 지역 검색
  • 행정구역/배달지역 등 분기 처리

⚠️ 실무 팁

  • POLYGON은 폐곡선 필수, 마지막 좌표 = 첫 좌표
  • 좌표 순서 바뀌면 면적 계산이나 포함 여부 오류 발생
  • 여러 구역이 겹칠 수 있으므로 JOIN 시 중복결과 주의
  • POLYGON이 복잡해질수록 성능 저하 발생할 수 있음

📘 공식 문서 참고

https://dev.mysql.com/doc/refman/8.0/en/functions-that-test-spatial-relations-between-geometries.html

 

반응형