반응형
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이 복잡해질수록 성능 저하 발생할 수 있음
📘 공식 문서 참고
반응형
'DB' 카테고리의 다른 글
| [MySQL] (연결최적화1️⃣) JDBC 드라이버 설정 핵심 옵션 정리 (0) | 2025.07.18 |
|---|---|
| [MySQL] (GIS6️⃣) 실무에서 자주 쓰는 공간 쿼리 예제 모음 (0) | 2025.07.18 |
| [MySQL] (GIS5️⃣) ST_Distance로 거리 계산하는 방법과 주의사항 (0) | 2025.07.18 |
| [MySQL] (GIS4️⃣) 공간 인덱스의 원리와 설정 방법 (1) | 2025.07.18 |
| [MySQL] (GIS2️⃣) 공간 데이터 저장 및 조회 실습: POINT, LINESTRING 활용법 (1) | 2025.07.18 |
| [MySQL] (GIS1️⃣) GIS란? 공간 데이터 타입(POINT, POLYGON 등) 완전 정리 (1) | 2025.07.18 |
| [MySQL] (JSON6️⃣) 실무에서 JSON 타입을 쓸 때 주의할 점 (4) | 2025.07.17 |
| [MySQL] (JSON5️⃣) JSON 쿼리 성능 튜닝 전략: 인덱싱과 최적화 팁 (0) | 2025.07.17 |