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

단순 선형 데이터인 도로중심선을 이용해 노드와 링크 DB를 생성하기 위한 툴을 DuraMap-Xr을 이용해 개발하였습니다. 아래는 해당 툴의 화면입니다.

이 툴을 이용해서, 입력된 도로중심선에 대해 생성된 Node와 link 데이터를 표현해 보면 아래와 같습니다. 먼저 입력된 도로중심선입니다.

위의 도로중심선이 아래처럼 노드와 링크 데이터로 분리되어 생성됩니다.

생성된 노드 DB에 대한 속성 데이터는 아래와 같습니다. 노드에 표시된 숫자는 각 노드에 연결돈 링크의 개수입니다.

그리고 링크 DB에 대한 속성 데이터는 아래와 같습니다.

그러나 위의 노드와 링크에 대한 SHP 파일만을 가지고는 최단 경로 찾기에 대한 알고리즘(A*)을 효율적으로 적용하기 어렵습니다. 특히 Link에 대해서는 빠르고 효율적인 Node 참조가 가능 수 있도록 SQLite와 같은 DBMS에 저장해 둘 필요가 있으며 이러한 목적으로 아래와 같은 툴을 사용하여 Link에 대한 데이터를 SQLite 파일로 생성할 수 있습니다.

위의 SQLite 파일안에는 Link 테이블이 존재하며 Link에 대한 SHP 파일 중 도형 정보 이외의 속성정보를 그대로 가지고 있습니다. 또한 LinkID와 StartNode 그리고 EndNode에 대한 인덱싱 정보를 가지고 있어서 빠른 Query가 가능합니다. 이로써 최단 경로 알고리즘에서 사용하기 위한 기본적인 노드, 링크에 대한 데이터 파일이 준비되었습니다.

“도로중심선만으로 네트워크 데이터 구축하기 ㅡ 2/3”에 대한 10개의 댓글

  1. 안녕하세요 좋은 정보 감사드립니다.

    제가 하는 간단한 프로젝트 중에 하나가

    도로중심선에 대한 SHP 파일을 통해 노드와 링크 데이터로 구성된 네트워크 데이터를 구축하는 것입니다.

    관리자님께서 올려주신 글이 많은 도움이 되었습니다.

    혹시 데이터와 링크 DB를 생성하는 툴에 대해서 조금 더 자세히 알려주실 수 있으신가요?

    감사합니다.

    1. 안녕하세요, 김형준입니다.
      좀더 부연 설명을 드리면..
      노드와 링크 데이터를 생성하기 위한 데이터는 오직 도로명주소 DB에서 제공되는 도로중심선에 대한 shp 파일만을 사용하였습니다.
      이 shp 파일에서 좌표값을 읽기 위해 DuraMap-Xr이라는 GIS 엔진을 사용하였습니다.
      또한 이 입력 shp 데이터가 undershot과 overshot이 매우 많이 발생하는데요. (이 두 shot에 대한 내용은 글에 언급되어 있습니다)
      이 문제는 선을 연장하거나 자르거나 해서 해결하였고… 이렇게 만들어진 노드, 링크 데이터를 db화 하기 위해 사용한 dbms는 sqlite를 사용한 것입니다.
      글의 내용과 많은 부분 중복되어 도움이 될까 싶기는 합니다만.. 이렇습니다..

      1. 안녕하세요 답변 너무너무 감사드립니다.

        제가 꼼꼼히 읽는다고했지만 지식이 부족해서 놓친부분이 많았네요. 그 DuraMap-Xr을 이용해서 개발하신 툴(아마도 Network DB Builder 인것 같은데…)은 쉐어를 안해주시나요? 혹시나 해서 여쭈어봅니다…

        감사합니다.

        1. 안녕하세요, 김형준입니다.
          해당 프로그램을 공개할 계획이 없답니다.
          향후에 네트워크 데이터 자체를 주기적으로 가공해 공개할 계획이랍니다.

          1. 아 넵 여튼 감사합니다.
            올려주신 글들이 너무나도 큰 도움이 되고 있습니다.
            감사합니다.

  2. 안녕하세요.
    먼저 좋은글 작성해주셔서 감사합니다.

    저는 현재 달리고 있는 차량이 어느 도로(link id 기준)를 달리고 있는지 알고 싶어하는 학생인데요,,

    차량의 위치(위도, 경도) / 도로 link id / 도로를 잇는 node id / node의 위도, 경도

    이 네가지 변수를 가지고 앞서 말씀드린 문제를 해결할 수있는 방법이 있을거라고 생각하시나요?! Python만 활용 중인데 Qgis나 다른 프로그램을 써서라도 가능성이 있어보이신다면 시도해보려고 합니다..!

    1. 안녕하세요, 김형준입니다.
      내가 지금 어떤 도로 위에 있는지에 대한 가장 간단한 방법은 현내 내 위치에서 가장 가까운 도로(링크id)를 검색하면 됩니다.
      하지만 이건 말 그대로 가장 간단한 방법이고 내 이전 위치를 기반으로 지금 내 위치를 추론할 수도 있습니다.
      예를들어서, 내가 막 갈림길 중 하나를 선택해 진입했다고 할때.. 이전에 내가 어느 도로에 있었는지에 따라 어떤 갈림길로 진입했는지를 보다 더 정확이 예측할 수 있답니다.
      아직까지 내 현재 위치를 매우 정밀하게 측정하는 기반 기술이 마련되지 않아서 이런 예측이 필요한 경우가 많습니다.

  3. 안녕하세요.
    제가 최단거리 기능을 개발하고있는데 써주신 글이 많은 도움이 되었습니다.

    undershot , overshot 를 연장하거나 잘라서 해결하셨다고 써주셨는데 혹시 다른방법은 없을까요?
    전국 데이터를 기반으로 기능을 만들어야하는데 삼거리에서는 거의 전부가 undershot 이나 overshot이 발생하더라고요
    전국데이터를 전부 정제하는 작업을 하려면 시간이많이 소요되고 나중에 데이터업데이트시에도 많은 비용이 발생할것같은데 알고계신 다른 방법이 있으면 알려주시면 감사하겠습니다.

    1. undershot, overshot에 대한 선을 연장하거나 잘라서 해결하는 것은 자동화 방안이고..
      가장 명확한 방법은 사람이 눈으로 보고, 직접 선의 길이를 적당하게 편집하는 것이 아닐까 싶습니다..
      네트워크 DB가 비싼 이유가 다 있겠죠..

      1. 도로중심선이나 기타 여러가지 데이터를 국가에서 제공해주어서 많은 기업들이 그 데이터를 사용할줄 알았는데
        아니였군요. 많은 비용을 사용해서 자체 데이터를 정제나 구축해서 쓰는거였군요.. 의문점이 풀렸습니다~
        답변해주셔서 감사합니다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다