[GIS] 개발 맵 엔진의 가중치 최소 비용 경로 분석 결과

개발 맵 엔진에 가중치 최소 비용 경로를 분석하는 확장 기능을 만들어 붙여 보았습니다. 이 글과 연결되는 이전의(클릭) 글을 먼저 참고하시길 권해 드립니다.
 사용자 삽입 이미지
목표지점을 설정하고.. 시작점을 지정하여, 각 시작점에서 목표지점까지 가는 최적의 경로를 분석해, 파랑색 선으로 나타낸 것입니다. 최적이 경로로 사용한 가중치 값은 경사도 입니다. 경사도를 비용으로 해 최소의 비용을 갖는 경로를 산출하는 것입니다

사실, 위의 개발된 결과에 대해 할말이 많을 듯 했습니다. 여러가지 어려움이 많았거든요. 이래 저래 해결하기 어려웠던 부분들로… 지지난주와 지난주 내내.. 머리속에서 이 문제들이 맴맴~ 거렸더랬습니다. 그런데 정작 마무리를 하니 뭘 써야할지 모르겠습니다.

4월 28일 Posted
비용 계산에 도로망을 이용해 보았습니다. 즉, 도로망이 지나가는 셀의 모든 값에 속도 40km/h로 주고 도로가 아닌 곳의 모든 셀에는 4km/h로 준 후, 이 속도를 기반으로 셀을 지나는데 소요되는 시간을 계산하여.. 이 시간을 비용으로 주고 최소 비용 경로를 뽑아 보았습니다. 아래가 그 결과의 일부를 보여주고 있는 이미지입니다. 노란색 작은 동그라미가 최종 목적지입니다. 도로를 따라 가장 시간이 적게 소요되는 경로를 뽑아 내고 있습니다. 비용을 무엇으로 주느냐에 따라, 이 분석 방법이 매우 다양한 곳에 적용될 수 있으리라는 생각이 듭니다.

사용자 삽입 이미지

[GIS] 가중치 최소 비용 경로 분석(Weighted Lowest Cost Path Analysis)

공간상의 어떤 지점을 통과하기 위해 드는 비용 값이 있다고 해 보겠습니다. 일단 어떤 지점을 통과한다는 것은 그 공간의 거리가 길수록 통과하는데 더 많은 비용이 들고, 거리가 짤을 수록 통과하는데 더 작은 비용이 듭니다.

여기에… 이 거리에 대한 비용은 기본적으로 반영하되, 그 지점을 통화하는데 드는 또 다른 비용을 추가적으로 고려하여, 임이의 지점에서 어떤 특정한 지점으로 이동할때 가장 최소의 비용이 드는 경로를 분석해 보는 것을 고민해 볼 필요가 있습니다.

여기서 또 다른 비용은 그 대상이 되는 분석에 따라 매우 다양한데, 쉽게 생각해볼 수 있는 것이 지형의 경사(Slope)입니다. 예를들어서, 노약자가 어느 지점에서 특정한 지점으로 이동할때… 단순히 가장 짧은 거리가 아닌 지형이 좀더 완만~한 경로를 선택해 가는것이 효율적이라 할 수 있겠습니다.

이 예에서 지형의 강사값이 바로 어느 지점을 통과하는데 드는 기본적인 비용인 거리에 대한 가중치로써의 역활을 한다는 점에서…. 이러한 분석을 “가중치 최소 비용 경로 분석(Weighted Lowest Cost  Path Analysis)”이라고 이름을 붙일 수 있겠습니다.

간단히 WLCP라고 하는 이 분석은 공간을 대상으로 하는 GIS 분석에서 매우 가치 있게 활용됩니다. 간단한 예로써 어떤 고객이 자신이 살고 있는 집에서 주위의 마트 중에 어느 마트에 갈것인지를 결정하거나 예측하는 경우를 생각해 보겠습니다.

사용자 삽입 이미지
위의 그림은 고객(화면 가운데의 용문동에 위치)이 갈 수 있는 주위의 4개의 마트를 표시한 것입니다. 고객과 마트의 거리만을 놓고 볼때 D 마트가 가장 가까워 고객은 D 마트로 방문할 가능성이 가장 큽니다.

하지만 고객은 이처럼 단순히 거리만 가깝다는 이유로 꼭 그 마트를 방문하지는 않습니다. 여기에는 다양한 변수가 존재하는데, 그 변수는 해당 마트까지 가는 것까지의 교통혼잡지수나 마트가 존재하는 지역의 문화 수준이나 생활 수준, 또는 해당 마트가 생필품을 주로 판매하는지, 아니면 고가의 사치품을 주로 판매하는지 등과 같은 변수가 작용하여, 고객은 자신이 방문할 방문할 마트를  결정하게 됩니다. 이러한 교통혼잡지수와 문화 수준, 생활 수준 등이 바로 WLCP 분석을 위한 가중치가 됩니다.

WLCP의 근본적인 필요성인, 최소의 경비가 소요되는 길을 찾는 것 뿐만 아니라.. 이 방법을 응용하여 길을 찾는 것이 아닌 반대로.. 어느 지점에 마트를 세워야 하는지 등과 같은 최적입지 분석이나 최적입지에 세워졌는지에 대한 검증 분석에도 충분히 활용될 수 있습니다. 문제는 얼마나 다양하고 정확하며, 꼭 필요한 가중치 변수를 사용하느냐가 문제이며.. 이 변수 선택의 몫은 이 변수들에 대해 가장 잘 알고 있는 해당 분야의 전문가의 몫일 것입니다.

만약 기회가 닿는다면, 개발 맵 엔진에 이 WLCP 분석을 확장기능으로써 개발하고, 간단히 어떤 지점에서 목적지까지  가장 경사가 완만한… 최단 거리를 구하는 예를 통해 검증해 보도록 하겠습니다.

[GIS] 개발 맵 엔진의 Slope, Aspect, Hillshade

지형이라는 주제로 제작된 라스터(Raster)의 셀(Cell)에 기반한 분석 중 경사(Slope)와 향(Aspect) 분석은 중요한 자리를 차지하며, 이 경사와 향은 지형에 대한 분석 및 응용의 파라메터로 사용됩니다. 이 글은 개발 중인 지도 엔진의 확장 기능의 하나로써 경사와 향을 분석하는 것과 이 경사와 향을 분석하는 기능을 응용하여 다시 지형의 음영도(Hillshade)를 만드는 확장 기능에 대한 소개입니다. 여기서 확장 기능이란 지도 엔진과는 별개의 파일 단위로써 엔진에 플러그인하여 별도의 스레드를 통해 실행시킬 수 있는 외부의 확장 실행 단위 모듈입니다.

경사와 향 값을 분석하기 위해서는 분석 대상이 되는 지역에 대한 DEM 데이터가 필요합니다. 이 DEM의 라스터 데이터로써 아래와 같은 데이터를 사용하였습니다.

사용자 삽입 이미지
이 데이터는 김한국님이 운영하는 비지니스 GIS 커뮤니티(www.biz-gis.com)에서 내려 받은 데이터입니다. 그리고 위의 이미지를 포함해서 앞으로 나오는 지도 화면은 모두 오픈메이트(www.openmate.co.kr)의 개발한 맵 엔진으로 생성한 화면입니다. 위의 데이터를 통해 경사값과 향을 계산하기 전에 간단히 경사와 향이 무엇인지에 대해 언급하겠습니다.

경사(Slope)란 어떤 지점의 지반이 수평을 기준으로 몇도 정도 기울어져 있는가를 말하는 것으로 다음 그림을 통해 쉽게 이해할 수 있을 것입니다.

사용자 삽입 이미지
바로 저 세타 각도가 경사 기울기에 대한 각도로써 각이 클 수록 지반의 경사가 급하고 각이 0이면 평편한 지반임을 나타냅니다.

향(Aspect)이란 지반의 경사면이 어디를 향하고 있는지에 대한 것입니다. 만약 지반의 경사면이 북쪽을 향하고 있다면 0도, 동쪽은 90도, 남쪽은 180도 그리고 서쪽은 270도가 됩니다. 완전히 평편할 경우 GIS 시스템마다 다른 값을 주게 되는데, 여기서는 Null 값을 줍니다. (사실 Null은 값이 없다는 의미이므로, 좀더 정화하게 한다면 0~360이 아닌 다른 값을 주어야 옳습니다. 예를들어서 -1과 같은 값이 적당하겠습니다)

실제로 구현된 경사와 향에 대한 실행 결과는 아래와 같습니다. 각각 경사와 향에 대한 이미지입니다.

사용자 삽입 이미지
가만이 보면 향의 분석 결과가 불완전하기는 하지만 음영기복도(Hillshade)와 비슷해 보입니다. 여기서 Hillshade는 태양광의 위치를 정해주면 태양광의 영향으로 지형 데이터를 입체감 있게 표현해 주는 방법입니다. 아래는 이러한 내용으로 개발한 맵 엔진에 구현된 Hillshade의 결과입니다.

사용자 삽입 이미지
태양의 위치는 북동쪽(270)이고 고도는 45도로 정했습니다. 위의 Hillshade의 결과는 비록 입체적으로 보이기는 하지만 마치 석고를 발라 놓은 듯이 매우 딱딱해 보입니다. 이를 좀더 예술적(?)으로 표현하기 위해 이 글의 가장 처음 보여드렸던 지형 데이터의 원본 이미지와 위의 Hillshade를 합성하게 되는데, 좀더 멋진 음영기복도를 위한 합성 방법은 Hillshade을 약간 투명하게 하고 Luminosity 방식으로 합성해야 하나, 개발한 맵 엔진에서는 Luminosity 방식의 합성을 지원하지 않아 그냥 투명도만 주어 새롭게 음영기복도를 만들어 보았습니다. 그 결과는 아래와 같습니다.

사용자 삽입 이미지
봄 계절에 맞게 색상을 넣어 보았습니다. 좀더 색상을 다체롭게 넣는다면 더 멋진 음영기복도 만들어 질 것으로 판단되며, 앞서 언급한 Luminosity 합성을 사용하면 보다 분명한 음영기복도가 만들어 질 것 입니다. 이상으로 개발한 맵 엔진에서 확장기능으로 개발한 경사, 향 그리고 Hillshade에 대한 소개를 마칩니다.

[GIS] IDW 구현에 대한 실행 결과

먼저 입력 데이터는 아래와 같습니다. 15개 정도 되는 포인트 데이터로 각각 값을 가지고 있습니다. 이제 나머지 지점에 대해서도 IDW를 이용해 값을 예측해 보도록 하겠습니다.

사용자 삽입 이미지
먼저 IDW 공식에서 power 파라메터의 값을 0.9와 1.2, 2.6, 4.0으로 산출한 결과입니다.  보간된 지점은 색상으로 표시하였습니다. 값이 높은 지점은 완전 불투명한 빨강색, 낮은 지점은 완전 투명한 초록색입니다.

먼저 pow = 0.9 인 경우입니다.

사용자 삽입 이미지
IDW 공식을 설명할때 pow값의 범위에 따라 보간된 양상이 다르다… 라고 언급했는데, 이 pow의 값이 달라지면서 어떤 양상을 보이는지 살펴 보시길 바랍니다. 다음은 pow = 1.2 입니다.

사용자 삽입 이미지
그리고 pow = 2.6 입니다.

사용자 삽입 이미지
끝으로 pow = 4.0 입니다.

사용자 삽입 이미지
pow가 클 수록 값이 넓게 퍼지면서 보간되는 모습입니다. 보간할 값의 특성에 따라 알맞은 pow 값을 결정해줘야함을 알 수 있습니다. 끝으로… 위의 IDW 구현에 대한 결과 이미지는 XGE 엔진의 확장 기능 형태로 개발되었습니다. 이미지 결과를 확인하기 위해 IDW 구현에 대해 독자적인 프로젝트로 구현하지 않고 현재 개발중인 맵 엔진을 이용하였습니다. 혹시 IDW를 자신의 프로젝트에 적용하고자 한다면 저에게 멜 주시길 바랍니다. IDW를 구현해 보면서, 이 IDW를 실시간 지형 생성 프로젝트에 적용해도 괜찬은 결과를 얻을 수 있겠다는 생각이 들었습니다. 몇개의 높이값만으로도 결정되지 않은 더 많은 지점의 자연스러운 높이를 쉽게 구할 수 있으니 말입니다.