도로명주소DB의 도로중심선을 활용한 최단거리 기능 소개

도로명주소DB에는 도로중심선이 있습니다. 예전에 도로중심선을 네트워크 DB로 가공하는 글을 포스팅한 적이 있었는데요. 찾으시는 분을 위해 주소를 정리하면 아래와 같습니다.

도로중심선만으로 네트워크 데이터 구축하기 ㅡ 1/3
도로중심선만으로 네트워크 데이터 구축하기 ㅡ 2/3
도로중심선만으로 네트워크 데이터 구축하기 ㅡ 3/3

아울러 이러한 네트워크 DB를 이용하는 알고리즘 중에 하나인 최단경로를 탐색하는 A*에 대해 정리하는 글은 아래와 같습니다.

최단 경로 탐색 – A* 알고리즘

이러한 과거의 작업 내용을 토대로 두 지점간의 최단 경로를 분석해 그 결과를 제공하는 서비스를 개발하였고, 기능에 대한 실행이 아래의 동영상입니다.

사실, 도로명주소DB의 도로중심선만으로 길찾기 서비스를 개발하는 것은 충분하지만, 길찾기 서비스의 품질으로써 도로중심선은 추가적인 보완이 필요합니다. 도보용으로는 적당하지만, 차량용과 같이 보다 더 나은 서비스 개발을 위해서는 나라에서 제공하는 표준 노드/링크 데이터를 활용하는 것을 권장합니다. 그럼에도 도로명주소DB의 도로중심선을 이용한 최단 경로를 개발한 이유는 상수관, 하수관, 가스관, 전력선, 통신선 등과 같은 설비들의 관망 해석에 대한 기반 기술 마련입니다. 이러한 관망은 최단경로라는 의미보다는 어떤 조건을 만족하는 관망을 탐색하여야 하는데, 어떠한 조건에 대한 과제를 “최단거리”라고 정한 것 뿐입니다. A*라는 알고리즘을 이해하고 구현함으로써 이를 응용하고 확장해 어떠한 조건에서의 관망이라도 탐색할 수 있습니다.

FingerEyes-Xr에서 WKT 문자열로부터 GraphicRow 생성하기

서버 측으로부터 뭔가를 요청해서 얻은 결과가 Geometry 일때, 그 Geometry의 형식은 WKT가 가장 일반적입니다. WKT는 Well-Known Text의 약자입니다.

예를 들어, 두 개의 좌표 사이의 최단경로에 대한 결과로써, Polyline 형태로 경로에 대한 연속된 좌표 리스트값을 WKT로 요청하는 서비스 호출이 아래와 같다고 합시다.

var url = "http://localhost/Gp?command=wlkroute;start=(132648 283024);end=(155054 243212);db=gdb";

위의 요청에 대한 결과는 두 지점간의 최단경로에 대한 연속된 좌표값을 가지는 WKT 형식입니다. 이런 WKT 형식의 데이터를 지도 상에 시각화 하기 위해 FingerEyes-Xr에서 그래픽 요소로 추가하고자 한다면.. 아래와 같은 코드를 적용할 수 있습니다.

var url = "http://localhost/Gp?command=wlkroute;start=(132648 283024);end=(155054 243212);db=gdb";
$.ajax({
    url: url,
    dataType: "text",
    type: "GET",
    statusCode: {
        200: function (response) {
            response = JSON.parse(response);
            var wkt = response.wkt;

            var map = ...;
            var layers = map.layers();
            var lyrName = "gl_route";
            var grp = new Xr.layers.GraphicLayer(lyrName);

            layers.remove(lyrName);
            layers.add(grp);

            var rs = grp.rowSet();
            var psd = new Xr.data.PolylineShapeData([[]]);

            psd.fromWKT(wkt);

            var pgr = new Xr.data.PolylineGraphicRow(0, psd);
            pgr.penSymbol().width(10).color("red").opacity(0.5);

            rs.add(pgr);

            var mbr = psd.MBR();
            map.coordMapper().zoomByMBR(mbr);
            map.update();
        }
    }
});

9번 코드가 서버단에서 받아온 WKT 문자열이고, 이 문자열을 22번 코드에서처럼 그래픽 요소의 좌표값으로 해석하기 위해 fromWKT 함수를 사용합니다. 여튼.. 이러한 서버단에서 보내온 WKT 형식의 지오메트리에 대한 시각화의 예제 화면은 아래와 같은데요.

위의 화면은 두 지점에 대한 최단 경로입니다.

Mr.Tiler-Xr을 이용한 배경맵 디자인 기능

Mr.Tiler-Xr을 통한 배경맵 디자인 기능에 대한 소개입니다. 공개된 DB를 활용했고, 활용한 레이어는 행정구역도, 실폭도로, 도로중심선, 건물입니다. 보다 더 다양한 레이어를 사용하면 더욱 세련된 배경지도를 디자인할 수 있습니다.

위처럼 디자인된 배경지도는 다시 Mr.Tiler-Xr에서 타일맵(Tile Map)으로 가공되어 웹에서 서비스 될 수 있습니다. 전국범위에 대해서도 매우 빠르게 가공될 수 있고, 변경된 영역에 대해서만 가공되어 다시 전체에 반영될 수 있습니다.

특정 지점으로부터 가장 가까운 지오메트리의 가장 가까운 교차점

아래의 이미지를 보면, Polyline 형태(GIS에서는 linestring이라는 용어를 사용함)의 레이어인 Link1가 있고, 빨간 포인트로 표시된 지점이 있다. 여기서.. Link1의 지오메트리 중 빨간 포인트에서 가장 가까운 녀석을 구하고, 이렇게 구한 녀석에 대해서 빨간 포인트와 가장 가까운 교차점을 구하고자 한다.

이러한 문제에 대해 해결할 수 있는 다양한 쿼리문 중 하나는 다음과 같다.

SELECT 
    fid,
    st_astext(
        st_closestpoint(
            the_geom, 
            st_geomfromtext('POINT(149761 265625)')
        )
    ),
    st_distance(
        st_closestpoint(
            the_geom, 
            st_geomfromtext('POINT(149761 265625)')
        ),
        st_geomfromtext('POINT(149761 265625)')
    ) as dist
FROM 
    network_link
ORDER BY 
    dist
LIMIT 1;

위 쿼리에 대한 결과는 아래와 같다.

ID가 557인 녀석이며, 예상했던 것처럼 교차점과 거리에 대한 결과를 볼 수 있다.