DB

[MySQL] (GIS2️⃣) 공간 데이터 저장 및 조회 실습: POINT, LINESTRING 활용법

인생아 2025. 7. 18. 13:45
반응형

MySQL에서 POINTLINESTRING은 가장 기본적인 공간 타입이다.
이 글에서는 공간 데이터를 어떻게 저장하고, 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

 

반응형