공간 데이터베이스란 말 그대로 공간 정보를 저장할 수 있는 데이터베이스를 뜻한다.
좀 더 명확한 개념을 이야기해보자면 공간에 존재하는 점, 선, 폴리곤등을 포함하는 객체의 데이터를 저장하고, 검색하는데 최적화된 데이터베이스라고 정의할 수 있다.
공간 데이터베이스는 단순히 공간 데이터를 저장해줄 뿐 아니라 공간 데이터를 활용한 공간 함수을 함께 제공한다.
🛣 Mysql의 공간 데이터 타입 (Spatial Data Type)
Mysql에서는 공간 데이터를 저장할 수 있도록 타입을 제공하고 있다.
타입정의예시
Point | 좌표 공간의 한 지점 | POINT(10 10) |
LineString | 다수의 Point를 연결해주는 선분 | LINESTRING(10 10, 20 20, 30 30) |
Polygon | 다수의 선분들이 연결되어 닫혀있는 상태 | POLYGON((10 10, 10 20, 20 10, 10 10)) |
Multi-Point | 다수의 Point 집합 | MULTIPOINT(10 10, 20 20) |
Multi-LineString | 다수의 LineString 집합 | MULTILINESTRING((10 10, 20 20), (15 15, 25 25)) |
Multi-Polygon | 다수의 Polygon 집합 | MULTIPOLYGON(((10 10, 10 20, 20 10, 10 10)), ((40 40, 30 30, 40 40))) |
GeomCollection | 모든 공간 데이터들의 집합 | GEOMETRYCOLLECTION(POINT(10 10), LINESTRING(20 20, 30 30)) |
📊 Mysql의 공간 함수
Mysql에서는 다양한 공간 함수를 제공하고 있다. 그 중에서 자주 사용되는 함수들은 아래의 표와 같다.
공간 연산 함수기능
ST_Intersection (g1 Geometry, g2 Geometry) : Geometry | g1과 g2의 교집합인 공간 객체를 반환한다 |
ST_Buffer (g1 Geometry, d Double ) : Geometry | g1에서 d 거리만큼 확장된 공간 객체를 반환한다 |
ST_StartPoint (l1 LineString) : Point | l1의 첫 번째 Point를 반환한다 |
ST_EndPoint (l1 LineString) : Point | l1의 마지막 Point를 반환한다 |
ST_PointN (l1 LineString) : Point | l1의 n번째 Point를 반환한다 |
공간 관계 함수기능
ST_Equals (g1 Geometry, g2 Geometry): Boolean | g1과 g2가 동일하면 True, 다르면 False를 반환한다 |
ST_Intersects (g1 Geometry, g2 Geometry): Boolean | g1과 g2의 교집합이 존재하면 True, 존재하지 않으면 False를 반환한다 |
ST_Contains (g1 Geometry, g2 Geometry): Boolean | g2가 g1 영역 안에 포함되는 경우 True, 그렇지 않으면 False를 반환한다 |
ST_Distance (g1 Geometry, g2 Geometry): Double | g1과 g2간의 거리를 반환한다 |
다양한 함수들이 많으니 공식 문서를 참고해서 원하는 기능의 함수를 잘 찾아서 사용하면 좋을 것 같다.
Mysql 공간 함수
좌표 사이의 거리 구하기
제가 사용중인 MySQL 8.0 버전에서 두 좌표의 거리를 계산할 수 있게 해주는
ST_Distance_Sphere 라는 함수를 사용할 수 있습니다
내용은 간단합니다
ST_Distance_Sphere(g1: geometry, g2: geometry)
Point는 geometry형에 속하므로 g1, g2에 Point 자료형을 넣어서 계산해주면 됩니다
실제로 실행해보겠습니다
SET @my_home = Point(127.0569, 37.2876);
SELECT id, name, ST_Distance_Sphere(coordinates, @my_home) as 'distance' FROM locations;
결과는 meter 기준입니다
km로 변환하면 13856.469km가 나오네요
############ 참고 설명 ############
기하학 인수는 (경도, 위도) 좌표 값을 지정하는 점으로 구성되어야 합니다.
경도와 위도는 각각 해당 지점의 첫 번째 좌표와 두 번째 좌표입니다.
두 좌표 모두 각도입니다.
경도 값은 (-180, 180] 범위에 있어야 합니다. 양수 값은 본초 자오선 동쪽입니다.
위도 값은 [-90, 90] 범위에 있어야 합니다. 양수 값은 적도 북쪽입니다.