반응형
MySQL에서 POINT와 LINESTRING은 가장 기본적인 공간 타입이다.
이 글에서는 공간 데이터를 어떻게 저장하고, SQL로 어떻게 조회하는지 실전 위주로 정리한다.

📌 실습 환경 설정
MySQL 8.0 이상 버전을 사용하는 것이 권장된다.
공간 인덱스와 ST_계열 함수들이 제대로 동작하려면 아래 설정을 확인하자.
SHOW VARIABLES LIKE 'have_geometry';
결과가 YES여야 한다.
📍 POINT 데이터 저장 실습
테이블 생성
CREATE TABLE stores (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
location POINT NOT NULL,
SPATIAL INDEX(location)
);
✅ SPATIAL INDEX는 MyISAM, InnoDB에서 모두 지원
✅ location 컬럼은 좌표 데이터를 저장
반응형
데이터 삽입
INSERT INTO stores (name, location)
VALUES
('카페A', ST_GeomFromText('POINT(126.9784 37.5665)', 4326)),
('서점B', ST_GeomFromText('POINT(126.9820 37.5700)', 4326));
- 첫 번째 숫자: 경도 (longitude)
- 두 번째 숫자: 위도 (latitude)
- 4326은 WGS 84 좌표계
데이터 조회
SELECT id, name, ST_AsText(location) AS coordinates FROM stores;
결과 예시:
1 | 카페A | POINT(126.9784 37.5665)
2 | 서점B | POINT(126.982 37.57)
ST_AsText()는 좌표를 문자열로 변환해 보여준다.
🚶 LINESTRING 데이터 저장 실습
테이블 생성
CREATE TABLE roads (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
path LINESTRING NOT NULL,
SPATIAL INDEX(path)
);
도로 경로 삽입
INSERT INTO roads (name, path)
VALUES (
'중앙대로',
ST_GeomFromText('LINESTRING(126.9784 37.5665, 126.9820 37.5700)', 4326)
);
위 쿼리는 두 지점을 잇는 선(경로)을 생성한다.
반응형
경로 확인
SELECT name, ST_AsText(path) FROM roads;
예시 결과:
중앙대로 | LINESTRING(126.9784 37.5665, 126.982 37.57)
✅ 추가 함수 예제
좌표 추출하기
SELECT ST_X(location), ST_Y(location) FROM stores;
- ST_X(): 경도 추출
- ST_Y(): 위도 추출
경로 길이 구하기
SELECT ST_Length(path) FROM roads;
단위는 좌표계에 따라 달라지므로 실제 거리 계산은 다음 글에서 다룬다.
💡 실무 팁
- ST_GeomFromText() 대신 ST_PointFromText()도 사용할 수 있음
- 자주 쓰는 좌표는 생성 컬럼으로 위도/경도 분리해서 관리하면 인덱싱에 유리함
- 좌표 오차가 민감한 서비스(배달/교통)는 항상 SRID 설정을 정확히 해야 함
📘 공식 문서 참고
https://dev.mysql.com/doc/refman/8.0/en/creating-spatial-columns.html
반응형
'DB' 카테고리의 다른 글
| [MySQL] (GIS6️⃣) 실무에서 자주 쓰는 공간 쿼리 예제 모음 (0) | 2025.07.18 |
|---|---|
| [MySQL] (GIS5️⃣) ST_Distance로 거리 계산하는 방법과 주의사항 (0) | 2025.07.18 |
| [MySQL] (GIS4️⃣) 공간 인덱스의 원리와 설정 방법 (1) | 2025.07.18 |
| [MySQL] (GIS3️⃣) POLYGON과 공간 포함관계 쿼리 실습 (4) | 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 |
| [MySQL] (JSON4️⃣) WHERE 절에서 JSON 조건 처리하는 방법 (0) | 2025.07.17 |