학창시절 수학시간으로 돌아가봅니다.
모눈종이가 있고 가로로 한줄, 세로로 한줄 화살표를 그리고 그 위에 수많은 점들을 찍고 그 점들을 이어나갑니다.
그 중 하나의 점, 좌표에 대해서 이야기해보려고 합니다!
우리가 흔히 수학시간에 x, y 좌표라고 불리는 것들이 지도에서는 아래와 같이 사용됩니다.
x 좌표라고 불렀던 것이 경도로 y 좌표라고 불렀던 것이 위도로 사용되고 있습니다.
경도와 위도가 한쌍으로 만나면 그것이 하나의 점, 좌표가 되는 것입니다!
수학시간에 모눈종이를 배경으로 하여 1,2,3 으로 증가를 하면 좋겠지만 공간 데이터에서는 도라는 개념을 사용합니다.
또한 경도와 위도의 1도가 갖는 각 수치 또한 다릅니다. 1km 거리를 경도, 위도로 표시하면 아래와 같습니다.(약간의 오차는 존재합니다.)
위 수치를 이용한다면 하나의 점을 이용하여 Nkm 이후의 점을 구할 수도 있고 새로운 폴리곤을 만들 수도 있겠죠?!
수치가 의미하는 것도 다르고 모눈종이에서 그려지는 것이 아닌 맵에 표시되어서 낯썰긴 하지만 그래도 이 점은 같았습니다.
x좌표를 의미하는 경도가 왼쪽에서 오른쪽으로 갈수록 수치가 증가한다는 점과 y좌표를 의미하는 위도가 아래에서 위로 갈수록 수치가 증가한다는 점이었습니다.
너무 당연한 말이 아니냐고 생각할 수도 있지만 가끔 이런 개념이 헷갈려서 헤맬때가 있었습니다-!
x좌표가 경도를, y좌표가 위도인 것은 알게 됐는데 이값을 어떤식으로 DB에 저장할 수 있을까요?
예를 들어 광화문역 특정 위치의 좌표는 아래와 같습니다.
그렇다면 126.97725 | 37.570892 라는 값을 저장하기 위해서 DB 소수형 컬럼을 두개나 추가한다는 것은 너무 슬픈 일입니다.
MySQL에서는 다양한 Geo 타입의 컬럼을 제공하는데
그중 하나의 좌표값을 저장할 수 있는 Point라는 타입을 제공하고 있습니다.
alter table test_tb add column test_point point;
insert into test_tb(test_point) values(ST_GeomFromText('point(126.97725 37.570892)'));
이렇게 추가한 포인트 컬럼 위에 광화문역 좌표값을 넣습니다.
위에 있는 값 그대로로는 포인트 컬럼에 저장시킬 수 없습니다. insert 문처럼 공간 타입의 데이터들을 저장하고자 할때 해당 값을 ST_GeomFromText() 함수로 감싸면 geo 형식으로 파싱을 하여 공간 데이터 컬럼에 저장할 수 있게끔 됩니다.
그렇게 insert 시킨 값을 select 해보면..
정체모를 데이터를 만날 수 있습니다. 이런식의 데이터로는 경도,위도 값이 어떤지도 알 수 없으며 각각의 값을 뽑아낼수도 없습니다.
저장했던 좌표값만 가져오고자 할때는 아래 함수를 사용할 수 있습니다!
POINT(126.97725 37.570892)
해당 함수는 문자열 그대로를 가져오는 함수입니다. 하지만 해당 함수로는 당장 어떤식의 좌표값이 들어있는지를 확인할 때는 유용하나 해당 값을 뽑아서 경도-위도로 분리하고자 할때는 문자열이기 때문에 번거롭습니다.
{"type": "Point", "coordinates": [126.97725, 37.570892]}
확인도 하면서 각각의 좌표값을 뽑아내고자 할때는 위와 같은 함수를 사용할 수 있습니다. (geojson 형식으로 이후에 다뤄보겠습니다.)
해당값을 그대로 가져와서 코드상에서 분리할 수도 있고 json_extract() 로 필요한 값만을 발라내는 것도 방법이 됩니다.
이러한 포인트 타입을 이용하면 개별적인 상점과 같은 위치들을 마커로 표시해줄 수 있겠죠?!
그렇다면 이러한 포인트 데이터를 이용하여 서비스 지역이나 주차금지 구역을 표시할까요? 아닙니다! 그 수많은 점들을 포인트 타입으로 저장하다가는 디비에 감당하기 힘든 양의 포인트 데이터들이 쌓일겁니다.
그래서 다음글에서는 점들이 이어져서 하나의 공간을 만드는 폴리곤 데이터에 대해서 작성해보도록 하겠습니다.