업무를 위해 지도에 대한 정보를 알 필요가 있었다. 이전에 자전거 정류소 제안 관련 프로젝트를 진행하면서, 처음으로 공간정보에 대해 배웠었는데, 그나마 익숙한 단어가 나와서 다행인 듯 하다. 이번 포스팅에서는 지도가 어떤 의미를 갖는지, 그리고 그 지도라는 것을 만들기 위해 필요한 각종 용어들에 대해 훑어보는 시간을 가지려 한다.
지도란?
- 물리적 실체 -> 데이터
- 지도는 나라의 재산
- GIS(Geographic Infomation System)
- 공간 데이터 + 속성 데이터 통합 관리 시스템
측지
- 지구 타원체
- 지구의 단면은 타원
- 장반경 a, 단반경 b라 했을 떄, aa−b=f f를 편평률이라 한다.
- a, b가 많이 차이나면 값이 크다 == 많이 찌그러져 있다.
- 그리고 이렇게 타원체로 만든 것을 지구 타원체라 한다.
- 타원체를 가정하는 여러 것들이 있다.
- 고도 측정
- 기준이 필요
- 지구를 원으로? 혹은 타원으로 가정할 것인가?
- 실제 지구는 울퉁불퉁한데 어디를 기준으로 할 것인가?
- 그래서 해발고도, 표고 이런말이 있는 것.
- 해발고도
- 바다가 없음에도 가상의 해수면선을 육지 안에 그은 상태로 측정
- 이러한 상황에서 특정 위치의 고도를 측정하고자 한다면, 이 해수면성에 수선을 내린 거리를 해발고도라 한다.
- 왜 그런데 굳이 가상의 해수면을 그려서 판단하나?
- Geoid
- 지구의 표면은 해발고도 0미터이다.
- 즉, 이는 지구 표면을 이야기 한다. (0미터이면 정확히 표면을 의미)
- 물을 지구에 퍼트렸다고 생각해도 좋다.
- 그러면 물이 중력에 따라 특정 모양(타원에 가까울 것)을 가지고 분포해있을 것이다.
- 이 상황에서 이 표면의 특정점을 찍고 접선을 그으면 중력 방향에 수직이 될 것
- 이러한 가상의 표면(해수면)을 지오이드라 하고, 이를 기준으로 해발고도를 측정한다.
- 어떠한 기준을 만든 것이라 생각하면 될 듯.
- EGM96이 Geoid의 표준
- Geoid는 실제 지구의 표면을 대상으로 만든 것이기 때문에 완전한 타원이 아니다.
- 오히려 찌그러진 감자에 가깝다.
- 그런데 우리는 타원체를 가정하고 지도를 만들기 때문에, 우리가 계산한 값과 실제 지오이드를 통해 계산된 고도는 달라질 가능성이 높다.
- 이러한 문제를 해결하기 위해, 타원체를 이동해서 값을 가져온다. 대신 그 반대편 위치에 있는 국가의 경우 정확도가 많이 달라진다.
- 측지계 (Datum)
- 지구상의 위치를 경/위도로 표현하기 위한 기준이 되는 좌표계 + 지구 형상을 규정한 타원체를 총칭
- 이 때 기준점을 정확하게 측정하여 상수로 정의
- 기준점이 다르면 같은 타원체를 사용해도 다른 값이 나오게 됨
좌표와 좌표계
- 좌표계
- 한점에 대해 유일한 좌표를 부여하기 위한 체계
- 직교좌표계 (x, y, z)
- 구면좌표계 (r θ, ϕ)
- 지리좌표계 (λ, ϕ)
- 지표면에만 있다고 가정하고 위, 경도로만 표현하는 것
- 지심좌표계 (x, y, z)
투영
- 3D를 어떻게 2D로 만들까?
- 지구 중심에 광원이 있다고 가정, 그림자를 투영
- 투영면의 종류에 따라
- 광원의 위치에 따라
- 심사(정중앙)
- 평사(표면)
- 정사(무한이 먼 광원, 평행)
- 예시
- 메르카토르 도법
- 원통, 심사
- 정형법: 각도를 유지
- 모든 면이 같은 면적과 같이 보이기 때문에, 지도에서의 각과, 실제 배를 돌리때의 기수각이 같다는 점에서 이러한 단어가 붙음
- 지도의 위쪽으로 갈수록 실제 면적이 길게 표현됨
- 특성상 북극, 남극의 경우 투사가 되지 않아 표현자체가 어렵다는 단점이 존재
- 골피터스 도법
- 면적이 유지
- 즉, 실제 메르카토르 도법으로 왜곡되는 지면적을 반영한 지도
- 정거 도법
- 거리를 유지
- 적도를 기준으로 거리가 항상 일정
- 방위 도법
- 방위가 유지
- 북쪽 끝에서 방향을 가지고 나아갔을 때, 그 방향이 유지
- 절충 도법
- 다 적당히 맞는다.
- 근데 하나라도 맞는 건 없다.
- 투영 좌표계
- 메르카토르 도법 기준
- 원통과 지구가 맞닿는 곳: 적도(횡축 longitudinal)
- 원점: 아프리카 앞바다 위치
- Web Mercator
- WGS84(타원) 좌표계를 사용하지만 투영시 지구를 구형으로 가정하는 좌표계
- 왜곡이 커지나 연산이 간단
- 원통과 지구가 맞닿는 축: 경도(종축 transverse)
- 경선을 X축, 위선을 Y축으로 삼는 원통 투영
- 이게 유용할 수 있는데, 보통 세로가 긴 국가의 경우(우리)가 그렇다.
- 세로선을 기준으로 투영하기 때문에, 좌우(적도 방향)으로 많이 멀어지지 않는다면 상대적으로 정확한 지도가 될 수 있다.
- 한국측지계 2002
- 실제로 해당 방식이 대한민국 표준으로, 한반도 인근 영역을 경도 2도 단위로 나누어 메르카토르 투영을 한 방식이다.
- 나누어서 처리하기 때문에, 원점이 여럿정의되고, 좌표가 불연속된다는 문제가 있음
- TM 128(Katech)
- UTM (Universal TM) 투영
- 이런 방식을 전세계에 적용해서 6도 기준으로 36존으로 분리하여 좌표계를 만드는 방법이 있다.
- 이 때, 각각의 존을 투영할 때, 메르카토르 도법 기준이기 때문에 원기둥을 투영면으로 사용하는데, 특이하게 원기둥이 한쪽면에는 접하나, 원쪽 부분이 안으로 들어가있는 형태를 취한다.
- 구에 원기둥을 접하는 형태로 만들 때, 필연적으로 접하지 않는 부분은 투영하면서 왜곡이 생길 수 밖에 없는데, 이는 접한 면으로부터 거리가 멀어질 수록 그 정도가 심하다.
- 그래서 아예 원기둥을 구에 완전히 접하는 형태가 아닌, 윗면, 아랫면을 안으로 넣어 이러한 왜곡을 줄이고자 한 것
- UTM-K 좌표계
- 그래서 UTM 방식을 사용하려고 해서 보니, 우리나라가 애매하게 걸쳐있음
- 그래서 임의로 밀고, false easting, false northing과 같이 선형변환을 해버리고 사용
- 127.5도 N, 38도 E 원점을 사용하는 UTM 좌표계
- 그래서 우리나라를 커버하면서 오차가 없는 좌표계
좌표계
- EPSG
- 무지하게 많은 좌표계들을 한번에 알아볼 수 있는 코드
- 좌표계 변환 방식
- 측지계가 같으면 쉽게 변환이 가능
- 하지만 측지계가 다르면 복잡한 로직이 필요
- 3-Parameter Tarnslation
- 7-Parameter Transformation (Helmert)
- 원점 시프트 (dx, dy, dz)
- 축척(원기둥 투영면 설정시, 윗면 아랫면이 구로 들어가는 정도를 나타내는 변수) 변경 (μ)
- 회전 (rx, ry, rz)
- 10-Parameter Transformation (Molodensky-Badekas)
- 축척 변경 (μ)
- 회전 (rx, ry, rz)
- 회전 지점 (px, py, pz)
공간 데이터
- OGC Simple Feature Access
- Point
- LineString(Polyline)
- 두 개 이상의 좌표를 갖는 geometry
- Line
- LinearRing
- 분류
- Simple
- Non-Simple
- Simple, closed
- 교차하지 않는 다각형모양을 가진 선
- LinearRing
- Non-Simple, closed
- Polygon
- 면
- hole을 가질 수 있다.
- 즉, Exterior Ring (n = 1)과 Interior Rings (n >= 0) 일 수 있다.
- 방향
- Exterior Ring
- Interior Ring
- 적어도 안쪽 링과 바깥쪽의 방향이 반대여야 함. 그렇지 않으면 유효하지 않음
- Multi Point
- Multi LineString
- Multi Polygon
- GeometryCollection
- Box / Bounds
- 점 2개로 정의
- 우상단, 좌하단의 점
- min, max
- left-bottom, right-top
- south-west, right-top
- Feature
- Geometry 정보 + 속성 정보 (type, name, roadType, lane)
- 형상과 속성을 갖춘 기본 데이터
공간 연산
- 관계 연산 (True or False)
- Equals
- Disjoint
- 두 개가 하나도 겹치지 않는, 즉 서로소인 경우
- Intersects
- Touches
- Crosses
- 교차할 때
- 그런데, 비교하고자 하는 두개의 gemoetry가 서로 차원이 다르거나 (점, 선, 면) 혹은 선이어야만 연산이 성립
- 점 & 선, 선 & 면, 선 & 선만 정의가 가능
- Within / Contains
- Overlaps
- 결과 연산 (결과가 Geometry)
- Intersection
- Difference
- SymDifference
- Union
- Buffer
- 특정 Geometry에서 x만큼 떨어진 geometry를 줌
- 당연히 음수도 가능
- ConvexHull
- 특정 Polygon을 감쌀 수 있는 최소 면적 다각형
- Envelope
- 특정 Polygon을 감쌀 수 있는 최소 Box
- a.k.a
- Minumun Bounding Rectangle
- Bounding Box
- Bounds
- Envelope
- BOX
- DE-9IM
- Dimensionally Extended 9-Intersection Model
- 두 지오메트리같의 공간관계를 interesection을 통해 구하는 위상 모델
- 예시
- 두개의 Polygon이 있을 때, 연산을 다음과 같이 정의한다.
- E (Exterior)
- I (Interior)
- B (Border)
- dim (dimension)
- 특정 geometry의 차원 (점: 0, 선: 1, 면: 2)
- A, B Polygon에 대해서 각 3개의 연산 속성 (E, I, B)를 가질 수 있고 이를 모두 dim 연산을 한다면 3x3 행렬이 도출된다.
- 이 행렬 관계의 모양을 기반으로 관계 연산의 결과를 알 수 있다.
- 한번에 2개 이상의 관계를 알아봐야 한다면 연산량 측면에서 해당 모델이 더 좋을 수 있다.
공간 인덱스
- 점, 선, 면
- 저장은 어떻게?
- Grid
- 전체 공간을 Tessellation하여 셀로 나누고, 데이터를 셀에 넣는 방식
- Tessellation
- 일정한 형태의 도형들로 평면을 빈틈없이 채우는 것을 말함
- a.k.a
- 공간을 다 특정도형으로 쪼개고, 또 그 안에서 쪼개는 방식으로 저장하는 것
- 무조건적으로 다 분할해야 함
- QuadTree
- 전체 공간을 재귀적으로 가로/세로 2등분하여 4개의 자식 노드를 가진 트리 구조를 사용하는 공간 인덱스
- 4개의 노드를 가지도록 분할하여 저장
- 특정 geometry가 해당 분할 공간에 하나만 있다면, Grid와 달리 세부 분할하여 저장되지 않고 해당 노드에 저장되어 깊이가 더 깊이 안들어감
- OcTree(3차원)
- KD-Tree
- 데이터가 점인 경우 사용할 수 있는 자료구조
- 각 레벨 마다 하나의 차원을 정렬하는 트리형태의 공간 인덱스
- Binary Tree인데, 각 Level에 따라서,
- 짝수 Level: X좌표를 가지고 왼쪽 오른쪽 분할
- 홀수 Level: Y좌표를 가지고 왼쪽 오른쪽 분할
- 결국 공간을 항상 2분할 하는 그림이 됨
- R(Rectangle)-Tree
- B-tree에 기반한 공간 인덱스
- 밸런싱, 페이징 같은 B-tree 특성 유지
- 데이터 베이스에서 주로 사용
- 탐색 알고리즘
- 가장 가까운 Geometry를 찾아라.
- 지금 박스로 추상화했는데, 박스의 중심과 거리를 재는 것이 맞을까?
- 원하는 결과와 다른 결과가 나올 수 있다.
- 그래서 k라는 변수를 하나 추가하여 문제를 해결한다.
- k는 자료구조에서 탐색을 진행할 때, 가장 가까운 녀석으로부터 boundary를 말한다.
- 만약 3이면 min, next, next까지 총 3개를 보는 것
- 적당한 k를 찾는 것은 huristic
- 즉 KNN을 수행후 실제 거리를 구하는 것.
추가 참고자료
- 널리 쓰이는 데이터 교환 포맷들
- 좌표계
- Feature/Geometry
- Text: WKT, GeoJSON, KML, GML
- Binary: WKB, Shapefile
- 더 알아보기
출처