Vworld의 3d data api에서는 여러가지 3차원 정보들을 받아올 수 있다. 여기서는 지형 정보를 받아오는 법을 다룬다. 자바(JAVA) 언어를 다룰 수 있어야 쓸 수 있다.

 

DEM(수치표고모형)은 고저차가 많은 우리나라 지형에서 여러가지 분석에 정말 무궁무진하게 활용할 수 있다. 작년 서울도시건축비엔날레에서 브이월드에서 DEM을 취한 후, 보행로의 경사도를 측정하여 보행시간계산에 반영하여 전시 작업을 했었다. 아래 영상에서 0:43 이후에 보행로의 수직 단면을 시각화한 영상을 볼 수 있다.





vworld에서 dem 자료를 소개한 내용은 여기서 볼 수 있다. 아래에 내용을 옮겨본다.



해상도는 1m라고 하는데, 실제로 받을 수 있는 최대 레벨인 15를 적용해서 데이터를 요청하면 대략 1.5m 해상도의 높이들이 들어온다. 사실, 이것도 너무 자세하고 데이터도 큰 탓에 예를 들어 서울 전역을 다룰 경우에 1.5미터는 활용하기가 쉽지 않다. 라이노에 올려놓을 경우 레벨 11인 24m 그리드로 받았을 때 110MB정도의 용량이 된다.


Vworld에서는 이 DEM을 OPEN api를 통해서만 제공한다. 따라서 특정 영역을 한번에 다운로드 받을 수 없고, 부분적으로 request를 보내고 response를 받은 후 데이터를 처리하여 원하는 수치들로 변환시켜야 한다. 이 곳에 기본적인 설명이 있다.



기본 소개


OPEN api를 이용하려면 우선 브이월드에서 회원가입을 하고 api 키를 발급받아야 한다. 찾아보면 어렵지 않으니 하나 받아두어야 아래에서 소개하는 코드에 집어넣어 동작시킬 수 있다. 신청할 때, '서비스할 웹주소'를 적게 되어 있는데, http://localhost:4141 으로 적어서 신청하면 추가적인 코드 수정 없이 사용할 수 있다. DEMCrawler.java 의 268번 라인에 해당 부분이 있다.


바로 위에서 링크한 <3D 데이터API레퍼런스>를 읽어보면, 사실 설명이 pdf문서로까지 자세히 써 있는데, 읽어봐도 이해하기 쉽지 않다. 바이너리 파일을 직접 다루어야 하고, 레퍼런스에서 가르쳐주지 않는 좌표변환방법을 찾아내야 하며, 3차원 모델로 만들려면 좌표들을 재조합해서 면으로 만들 수 있어야 한다.


그래서 아래에서는 그 과정들을 코드가 알아서 처리하도록 해 두었으며, 사용하는 사람은 다음의 내용들만 입력하면 된다. DEMCrawler.java 의 37~70번 라인에 해당 부분이 있다.


1. 데이터를 받으면 지속적으로 저장할 폴더. 한번 설정하면 바꾸지 않는다.

2. 현재 구성해보고자 하는 특정 영역만 저장할 폴더. 매번 바꾸는 것을 권장한다.

3. api키

4. 받아오고자 하는 영역의 좌하단, 우상단 경위도 좌표

5. 데이터 해상도 1~15 (15레벨이 존재하지 않는 지역도 많이 있음)


1번과 2번의 폴더를 구분하는 이유는, 한번 받아온 같은 해상도의 같은 영역은 다시 받지 않기 위함이다. 그래도 특정 사각 영역을 받아오고자 할 때 해당 영역들은 한 폴더에 모여 있어야 다루기 수월하므로 2번 폴더를 별도로 두었다.

물론 자바 언어를 실행시킬 수 있어야 원하는 내용을 얻을 수 있다. 그리고 계산 자체는 그렇게 복잡하지 않기 때문에 다른 언어 사용자들이 해당 언어로 바꾸는 작업이 어려울 것이라 생각하지는 않는다. 모든 필요와 요구에 대해서 상세히 설명하지 못하는 부분을 이해해 주셨으면 한다.




코드 작동 순서


1. 

일단 영역의 경계점 좌표를 입력하면 브이월드에서 다루는 Idx,Idy 영역번호로 변환한다. 원래 소개하는 절차에서는 query를 보낸 후 받아와야 하지만 계산이 어렵지 않으므로 직접 계산하였다.


2. 

idx,idy의 list를 산출해 낸 뒤 request를 보내서 .bil 파일들을 받아온다. 바이너리 파일이며, 격자 구간들의 높이값들이 들어있다. 받아오기 전에 저장 폴더의 목록과 대조하여 이미 존재하는 파일은 다시 받지 않는다.

동시에 지형에 매핑할 dds(텍스쳐)파일도 받아온다. 


3. 

bil파일 정보를 세 가지 형태의 text 파일로 변환하여 저장한다.

*. 둥근 지구 그대로의 3차원 좌표

*. 경도,위도,해발고도(m)

*. x좌표, y좌표, 해발고도 (UTMK좌표계)


4. 

둥근 지구의 형태와 평평한 지구를 가정한 두 가지 형태의 모델링 파일을 저장한다.

.obj파일이며 여러가지 3d 프로그램에서 import 가능하다.

항공사진 텍스쳐가 입혀지도록 했다.



코드 내용


https://github.com/vuski/getVworld3D

이 곳에서 볼 수 있다.


https://github.com/vuski/getVworld3D/blob/master/src/vworld/DEMCrawler.java

여기에 핵심적인 내용들이 있다.

주석을 되도록 많이 달아놓아서 다른 언어 사용자들이 포팅하는데 도움이 되도록 했다.


부가 설명


*.

웹페이지의 설명에는 NASA의 world wind 좌표계를 사용한다고 되어 있는데, 잘 되지 않아 시행착오를 거치다보니 그 방식에서 약간 수정했다는 사실을 알게 되었다. 지구구면체를 장반경과 단반경값을 다르게 넣지 않고 장반경으로 두 축의 길이를 사용했던 것이다.


*.

작은 영역에서 미세하게 다룰 때는 평평한 지구를 가정한 UTMK 좌표와 모델을 사용하면 된다. 그러나 넓은 영역에서 정밀하게 사용할 때는 지구구면체로 작업해야 한다. 사실 그 정도 필요가 있는 사람들이라면 이 정도는 스스로 판단할 수 있을 거다. 지구 구면체에서 서울 전체가 산이 없는 평지라고 가정하고 동쪽에서 서쪽 끝을 직선으로 잇게 되면 정 가운데쯤 가서 20m정도 뜨게 된다. 지구는 둥그니까.


*.

서울은 일부 산지만 제외하면 모두 레벨 15로 존재한다. 그러나 다 받아서 라이노 같은 프로그램에 올려볼 생각은 하지 않는 것이 낫다. 몇 블록 크기의 지역만 15로 받아내도 파일이 꽤 무거워지기 때문이다. 경기도의 경우 13레벨이 최고였던 것으로 기억한다. 같은 경기도라도 일부 지역은 최대 제공 해상도가 더 떨어지는 경우도 있다. 이 글의 맨 위에 첨부한 그림처럼 서울 전체를 받을 경우 레벨 11 정도가 적당하다.


*. 

이 코드를 배포하는 이유는 공간정보 사용자 커뮤니티를 활성화하기 위함이다. 이런 유용한 데이터의 사용자가 많아져서 데이터를 생산하는 공공기관이 좀 더 업데이트와 서비스를 잘 해줬으면 좋겠다. 현재 이런 api 방식 말고, 다운로드 받을 수 있는 국토정보플랫폼의 DEM은 90m 해상도라 좀처럼 사용할데가 별로 없다.


*.

모두 필요하지 않음에도 불구하고 한번에 너무 넓은 영역을 잡아서 받으려고 한다면, 트래픽과 서버 부담 문제로 결국은 돌아돌아 다른 사람에게 의도치 않은 피해를 입힐 수 있다. 소수의 무심한 행동이 전체에게 피해를 줄 수 있음을 생각해보자.


*. 

위경도와 UTMK 좌표 변환은 이곳을 참고했다. 공개한 소스코드에도 별도로 분리하여 명시해두었다.


*.

다른 언어로 포팅할 경우, 깃헙 등에서 연결시켜 공개해 주셨으면 좋겠다.




경사지형과 건물 예시(상명대 부근)




COMMENT : 1 TRACKBACK : 0

  • 도리돈 2018.07.03 08:54 신고

    1. 일단 영역의 경계점 좌표를 입력하면 브이월드에서 다루는 Idx,Idy 영역번호로 변환한다
    여기서 계산하는 공식이 있을까요 이해가 잘 되지않네요 ㅠㅠㅠ
    좋은정보 감사합니다!!

Category

Etc.

Date

2018.03.24 03:31

위로가기