본문 바로가기

Function

VWORLD에서 건물 가져오기

2019.07.22 업데이트


전해들은 바가 있어 확인해보니, 브이월드 측에서 3d 데이터 Open API를 폐쇄했습니다.

안타깝지만, 관련 데이터는 어떠한 방법으로도 더 이상 사용할 수 없을 것 같습니다.

브이월드에 접속해서 건물을 눈으로 확인하는 방법 밖에 없겠네요.


---------------------------------------------------------------------------

2019.5.22 업데이트


-----------------------------------

브이월드 Open API 중 3D data api 를 이용하는데 도움을 줄 목적으로 작성된 본 게시물에서 언급하는 코드는 더 이상 존재하지 않습니다. 깃허브의 자료를 삭제하였습니다.


최근 브이월드의 운영 주체인 공간정보산업진흥원측에서 여러 차례 연락을 받았습니다.

요청 내용의 주요 골자는, 이 글 맨 아래에 첨부한 내용처럼 저장관련 부분 삭제입니다.


그래서 해당 코드를 삭제하고 업데이트 해 놓았었습니다.


그런데 오늘 다시 브이월드의 필수 설문 조사 메일을 받았습니다.

인증키 발급자들에게 모두 보낸 것 같은데요, 그 내용을 보면 가까운 시일 안에 매우 높은 확률로 서비스 제공 수준과 방식이 변경될 것 같습니다. 그렇게 된다면 어차피 이 코드도 쓸모없어지기 때문에 닫았습니다. 


공간정보산업진흥원에서 통화상으로 언급한 보안 및 국정원에 대한 언급 등으로 사실 상당한 스트레스를 받았고, 최근 분위기를 볼 때 여차하다가는 훅 갈 수도 있겠다는 생각이 들었습니다. 저에게 대면 면담을 요청하여 추가적인 문제가 발생하지 않았는지 조사하려고도 하였습니다. (강제로 해야 하는 일은 아닌 것 같아 거절하였습니다.)



[공공데이터의 제공 및 이용 활성화에 관한 법률] 제3조(기본원칙)은 아래와 같습니다. OPEN API도 공공데이터의 여러가지 형식 중 하나입니다. 

① 공공기관은 누구든지 공공데이터를 편리하게 이용할 수 있도록 노력하여야 하며, 이용권의 보편적 확대를 위하여 필요한 조치를 취하여야 한다.

② 공공기관은 공공데이터에 관한 국민의 접근과 이용에 있어서 평등의 원칙을 보장하여야 한다.

③ 공공기관은 정보통신망을 통하여 일반에 공개된 공공데이터에 관하여 제28조제1항 각 호의 경우를 제외하고는 이용자의 접근제한이나 차단 등 이용저해행위를 하여서는 아니 된다.

④ 공공기관은 다른 법률에 특별한 규정이 있는 경우 또는 제28조제1항 각 호의 경우를 제외하고는 공공데이터의 영리적 이용인 경우에도 이를 금지 또는 제한하여서는 아니 된다.

⑤ 이용자는 공공데이터를 이용하는 경우 국가안전보장 등 공익이나 타인의 권리를 침해하지 아니하도록 법령이나 이용조건 등에 따른 의무를 준수하여야 하며, 신의에 따라 성실하게 이용하여야 한다.


그리고 저작권법 24조의 2를 보면 공공저작물의 자유이용에 대한 원칙이 있습니다. 이 조항은 공공데이터때문에 신설된 조항이기도 합니다.

① 국가 또는 지방자치단체가 업무상 작성하여 공표한 저작물이나 계약에 따라 저작재산권의 전부를 보유한 저작물은 허락 없이 이용할 수 있다. 다만, 저작물이 다음 각 호의 어느 하나에 해당하는 경우에는 그러하지 아니하다.


저는 항상 이 두 가지 원칙에 근거해서 공공데이터를 이용해왔습니다.


그런데 지도 및 그와 유사한 공공측량성과에 대해서는 위의 법률에도 조금씩 언급된 '예외조항'과 관련이 있는 것 같습니다. 이런 부분에 대한 이용상의 한계가 좀 더 명확하게 명시되었더라면 저도 많은 시간을 들여 이런 일을 하지 않았을 것 같은데, 여러가지로 많이 안타깝습니다.



또 한편으로 이러한 이용제한에 대한 안타까움도 있습니다.


구글에서 '브이월드'로 검색하면 첫 페이지에 기사 두 개가 뜹니다. 한 가지는 브이월드 데이터의 가치를 설명하고 있습니다.

https://it.donga.com/19623/

"한국의 구글맵이 아닙니다. 모두의 브이월드입니다"


다른 한 곳에서는 브이월드의 이용률 저조를 언급하고 있습니다.

https://www.mk.co.kr/news/business/view/2016/11/762202/

`한국판 구글어스` 표류…300억 투입 `브이월드` 활용기업 미미


브이월드 자료를 받아서 저장 후 이용하려고 이 곳에 오신 분들은 아마도 비슷한 생각을 하실 것 같습니다.

"저장하지 않고 화면에서 지형과 건물을 쳐다보는 것 만으로 도대체 무슨 일을 할 수 있다는 것일까?"

"혹은 자료를 별도로 저장하지 않고 실시간으로 브이월드에서 끌어와 쓰는 웹 서비스 운영 정도에 이 데이터 활용을 제한해둔다면 과연 이용할 수 있는 사람이 얼마나 될까?"


제가 운영하는 회사의 수익구조는 사실 이 브이월드의 자료와 관계가 거의 없습니다.


개인적으로 필요해서 만들어놓은 코드가 1년 넘게 컴퓨터 한구석에서 잠자고 있는 것이 안타까웠기 때문에, 추가적인 시간을 써서 다른 사람들도 이용할 수 있는 코드로 업데이트 하여 1년 전 쯤 공개하기로 결정했던 것입니다. 이러한 일로 누군가 저에게 물질적인 보상을 해 준 일도 없고, 제가 요청한 일도 없습니다. 이 자료를 이용하는 사람들이 많아져서 데이터의 가치가 좀 더 높게 평가받고, 그럼으로써 현재 업데이트 되지 않고 있는 지역들이 좀 더 잘 업데이트 된다면 모두에게 좋은 일이 될 것이라 생각했습니다.


공간정보산업진흥원에서 통화상으로 대면 면담을 저에게 요청하면서 '이런 게시물을 올린 의도가 무엇인지' 물어볼 예정이라고 하였는데요, 만약 이 글을 보게 된다면 위의 문장으로 그 질문에 대한 답변이 되기를 바랍니다.



이 데이터의 활용도는 무궁무진하지만 한 가지 생각나는 예를 들자면,

최근 많이 언급되는 보행 중심의 생활SOC사업처럼 거주지로 부터 10분거리에 얼마나 많은 생활공공시설이나 근린시설을 이용할 수 있는지에 대해 국가 차원의 사업들이 벌어지는 것 같습니다. 상세한 해상도의 수치표고모형을 이용하면 도로의 경사도를 반영하여 좀 더 정확한 보행시간을 계산할 수 있습니다. 급경사 구간을 찾아낸다면 보행약자에 대한 지원도 할 수 있습니다. 데이터를 저장하지 않고 단발적인 Open API 요청을 통해 이런 계산을 하는건 무척 효율이 떨어지는 일입니다.


언젠가는 관련 법이 개정되어,

많은 예산을 들여 구축한 이 데이터가 잘 활용됨으로써 세금을 낸 많은 사람들이 직간접적으로 혜택을 볼 수 있기를 진심으로 바랍니다.



2019.5.22 

브이더블유랩 소장 김승범

---------------------------------------------------------------










Vworld의 3d data api에서는 여러가지 3차원 정보들을 받아올 수 있다. 여기서는 건물과 교량 모델링 데이터를 받아오는 법을 다룬다. 자바(JAVA) 언어를 다룰 수 있어야 쓸 수 있다.


Vworld.kr 에 접속하면 전국 곳곳의 지형과 건물들을 3차원으로 볼 수 있다. 이 데이터들은 3d data api를 통해서 제공하며, 일괄적으로 다운로드 받는 방법은 없다. 따라서 우선 이용하려면 api key를 신청해서 받아야 하고, building 3d data 에서 제공하는 xdo 바이너리 파일을 받아서 파싱한 후 3d 프로그램에서 쓸 수 있도록 재구성해야 한다. 아마도 그래픽스 전공자들에게는 어려운 일이 아닐 것 같지만, 일반 사용자들이 그 방법을 습득하고 재구성하기는 쉽지 않다. 


여기에서는 영역의 좌표점들을 보냈을 때 건물 데이터와 최상위 텍스쳐 데이터를 받아서 3d프로그램에서 읽어들일 수 있는 범용 파일 형식 중 하나인 obj 으로 해석하여 변수에 저장한다. 

불필요한 트래픽을 막기 위해 한번 받았던 영역과 겹치는 부분들은 중복다운받지 않고 기존 파일에서 추출하여 저장할 수도 있지만, 그렇게 하면 국토부 보안관리규정과 관련된 위법의 소지가 있으므로 공간정보산업진흥원의 전화를 받게 될 것이다. 코드를 실행시켜 해당 내용을 다운받은 후 별도의 처리를 통해 이용하고, 코드가 종료되면 하드디스크 등 저장장치에 파일이 남아있지 않아야 한다. 해당 규정을 이 글 맨 아래에 옮겨 놓았으니 이용자들은 각별히 주의하기 바란다. (2019.05.20 업데이트). 



3차원 건물 구축지역은 많지 않다. 서울의 경우 아쉽게도 5년~9년 전이 최신 데이터다. 데이터를 이용하는 사용자 층이 두터워지고 활용도가 높아지면, 담당 부서에서도 지속적으로 데이터 구축을 추진해 줄것이라 기대하면서 아래의 코드를 공개한다. 단, 불필요한 영역을 과도하게 끌어와 서버의 부하를 증가시킬 경우 이 서비스를 지속적으로 이용하고 싶은 타인에게 의도치 않게 피해를 줄 수 있음을 한 번쯤 생각해보자.


아래는 구축된 영역을 나열해놓은 것. 추가적인 지역은 여기서 확인할 수 있다. '3차원도고해상도구축지역' FAQ를 조회하면 된다.





기본 소개


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



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


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


1. 데이터를 받으면 임시로 담아둘 폴더. 해당 폴더가 자신의 컴퓨터에 없으면 만든 후 사용한다.

2. api키와 referer(서비스할 웹주소. 자신의 컴퓨터에서 작업한다면, localhost로 둔다. 위의 문단 참고)

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

4. 건물을 받아올 경우와 교량을 받아올 경우 선택


모든 필요와 요구에 대해서 상세히 설명하지 못하는 부분을 이해해 주셨으면 한다.

구체적인 자바 코드 사용 방법은 다음의 게시물을 참고하면 된다.


http://www.vw-lab.com/54




코드 작동 순서


1. 

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


2. 

idx,idy의 list를 산출해 낸 뒤 request를 보내서 .dat 파일들을 받아온다. 바이너리 파일이며, 해당 단위 구간 안의 건물들 데이터 목록(xdo형식)이 들어있다. 


3.

dat 파일을 파싱하여 xdo파일들 목록을 얻고, 다시 요청하여 xdo파일들을 받아온다. 하나의 dat파일에 0개~십수개의 xdo파일들이 있다.


4.

xdo 파일들을 읽어낸다. 여기에는 obj 형식으로 건물 데이터를 재조합할 때 필요한 정보들이 있다. vertex 좌표값, vertex normal, 텍스쳐 매핑에 필요한 vertex UV, face 구성 순서, 텍스쳐 이미지 이름과 최하위 해상도 텍스쳐가 들어 있다.


5. 

xdo 파일에 있는 텍스쳐 이름을 꺼낸 후 최상위 해상도의 텍스쳐 파일을 요청하여 얻어온다.


6.

obj 형식으로 문자열이 저장된 변수를 만든다. 한 세트의 idx idy 구역안에 있는 건물들은 하나의 obj변수에 넣는다. 그룹(g)으로 구분한다.

건물에 텍스쳐를 입히려면 obj, mtl, jpg들의 세가지 형식이 조합되어야 한다.

obj에는 좌표값 등 물리적인 정보와, 각 그룹(건물)마다 어떤 material 정보를 사용할 것인지를 명시해준다.

mtl은 obj에서 부여했던 material 정보그룹의 고유번호들을 매개로 diffuse 색, 투명도, 텍스쳐 이미지 등 여러가지를 지정해줄 수 있다. mtl에서 지정한 jpg들까지 한 폴더 안에 있어야 텍스쳐들이 건물에 입혀진다. 



7.

obj 파일은 두 가지 좌표계로 변수에 저장된다.

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

*. 평평한 지구를 가정한 상태에서 UTMK(EPSG:5179) 좌표계에 건물들을 각각의 해발고도에 위치시킨다. 대부분 이 방식이 편리할 것 같다.



코드 내용


https://github.com/vuski/getVworld3D

이 곳에서 볼 수 있다.


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

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

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


코드 이용하는 방법은 아래를 참고한다.

http://www.vw-lab.com/54



부가 설명


*.

이 코드를 통해서 건물 혹은 교량을 받아올 수 있다.

건물을 받을 경우 그대로 사용하면 되고, 교량을 받을 경우 아래 부분의 주석 처리를 서로 바꿔줘서 변수 값이 대체될 수 있도록 한다.


*. 

독도는 별도로 데이터를 분리해 놓았다. 지형과 건물 모두 건물에 한꺼번에 통합되어 있다.


//교량은 레벨 14에서 받아와야 한다.

//static String layerName = "facility_bridge";

//static int level = 14;

//건물은 레벨 15에서 받아와야 한다.

static String layerName = "facility_build";


static int level = 15;


//독도의 지형과 건물은 레벨 13에서 받아와야 한다. //static String layerName = "facility_dokdo"; //static int level = 13;


*. 

위경도와 UTMK 좌표 변환은 proj4j 라이브러리를 사용했다. 여러가지 좌표계 상호 변환을 할 수 있는 유명하고 강력한 라이브러리다. lib 폴더에 넣어놓았다. 다음의 경로에 설명이 있다.

https://trac.osgeo.org/proj4j/


지속적으로 변환설정값을 호출할 경우 많이 느려지기 때문에 static으로 두어 앞으로 꺼냈다.

csName2를 바꿔주면 다른 좌표계로도 바꿀 수 있다.


static String csName1 = "EPSG:4326";

static String csName2 = "EPSG:5179";

static CoordinateTransformFactory ctFactory = new CoordinateTransformFactory();

static CRSFactory csFactory = new CRSFactory();

static CoordinateReferenceSystem crs1 = csFactory.createFromName(csName1);

static CoordinateReferenceSystem crs2 = csFactory.createFromName(csName2);

static CoordinateTransform trans = ctFactory.createTransform(crs1, crs2);

static ProjCoordinate p1 = new ProjCoordinate();

static ProjCoordinate p2 = new ProjCoordinate();


*.

기본적으로 받아오는 좌표들은 둥근 지구를 가정하여 건물이 이리저리회전되어 있다. vworld.kr에서 바로 볼 수 있는 3차원 지도 역시 둥근 지구 위에 올라가 있다. 

이 코드에서는 둥근 지구와 동시에 해당 파일들을 다시 평평한 평지 위로 되돌려서 변수에 저장한다.

혹시나 브이월드에서 좌표 변환을 시도했는데 잘 안되었던 사람들이 있다면 아래 부분이 핵심이므로 참고하면 된다.


float[] xyz = rotate3d(vx, vy, vz, lon, lat);


vertex[i][0] = p2.x + xyz[0];

vertex[i][1] = p2.y -1 * (xyz[1]);
vertex[i][2] = xyz[2] +objxyz[2] -6378137;
vertex[i][3] = vnx;
vertex[i][4] = vny;
vertex[i][5] = vnz;
vertex[i][6] = vtu;

vertex[i][7] = (1.0f-vtv);


rotate3d 메서드는 아래와 같이 구현하였다.


private static float[] rotate3d(float vx, float vy, float vz, double lon, double lat) {

float x,y,z;

double p = (lon)/180 * Math.PI;

double t = (90-lat)/180 * Math.PI;


 //원래 회전공식대로 하니까 90도 회전된 결과가 나와 z축을 중심으로 다시 -90도 회전을 했다.

y = (float) (Math.cos(t)*Math.cos(p)*vx - Math.cos(t)* Math.sin(p) * vy - Math.sin(t)*vz);

x = -1 *(float) (Math.sin(p)*vx + Math.cos(p)*vy);

z = (float) (Math.sin(t)*Math.cos(p)*vx -Math.sin(t)*Math.sin(p)*vy + Math.cos(t)*vz);

return new float[]{x,y,z};

}


*. 

모델링의 기본 material 속성은 아래와 같이 두었다.

값들을 추가하거나 원하는 대로 변경할 수 있다. 아래에서 설명하는 mtl파일 상세 페이지를 참고하면 된다.


Ka 0.000000 0.000000 0.000000

Kd 1.000000 1.000000 1.000000

Ks 1.000000 1.000000 1.000000

Tf 0.0000 0.0000 0.0000

d 1.0000

Ns 0



*. 

obj 파일에 대한 개략적인 정보는 아래를 참고한다.

https://en.wikipedia.org/wiki/Wavefront_.obj_file#Vertex_texture_coordinate_indices


obj 파일에 대한 상세한 정보는 아래를 참고한다.

http://paulbourke.net/dataformats/obj


mtl 파일에 대한 상세한 정보는 아래를 참고한다.

http://paulbourke.net/dataformats/mtl/


*.

obj 변수에 담기는 좌표는 UTMK 좌표값이다. <0,0> 언저리에 있지 않으므로 이용할 때 주의한다.

UTMK좌표계를 이용하는 까닭은, 각자의 고유 좌표를 유지하고 있어야, 여러가지 지리 정보를 조합해도 어긋남 없이 잘 들어맞기 때문이다. 원점이 아니라 다소 불편하더라도 이동하지 말고 그대로 사용할 것을 권장한다.



*.

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



-----------------------------

2019.05.20 추가



공간정보산업진흥원 측의 요청으로 파일 저장 부분을 삭제하고 업데이트 하였습니다.

따라서, 3d 데이터를 받아서 이용하시려는 부분은 이용하는 코드를 추가적으로 작성하셔서 사용하셔야 합니다.


관련 메일을 내용을 아래에 옮겨놓습니다. 이용하시는 분들은 해당 부분 유의하셔서 이용하시기 바랍니다.


++++++++++++++++++++++++++

안녕하세요, 브이월드 운영기구 입니다.


브이월드 3차원 데이터는 국토교통부 국가공간정보 보안관리규정에 따라 기타공간정보 '공개제한' 정보로 규정하고 있으며 해당 규정 제 10조 1항 3호(공간정보의 복제·출력 등 제한)에 따라 공개가 제한되는 공간정보는 보안 담당관의 허가를 받을때를 제외하고는 복제 또는 출력을 할 수 없다고 명시하고 있습니다.

[별표 1] 국가공간정보 세부 분류기준 참조


또한, 브이월드 API 이용약관 제10조 6항 4조(서비스의 이용)와 제12조(저작권) 위배의 소지가 있음을 알려드립니다.


따라서, 공개제한 자료로 분류되어 있는 브이월드 3차원 데이터 저장 관련 VWLAB 게시물 중 브이월드 3D데이터 저장 관련된 내용과 코드를 삭제 및 해당 게시물들의 제목도 변경해주시면 감사하겠습니다.


자세한 사항은 아래에 공간정보규정 URL 참고해주시기 바랍니다.


1. 국토교통부 국가공간정보 보안관리 규정

http://www.law.go.kr/admRulLsInfoP.do?admRulId=61075&efYd=&admRulNm=%EA%B5%AD%ED%86%A0%EA%B5%90%ED%86%B5%EB%B6%80%EA%B5%AD%EA%B0%80%EA%B3%B5%EA%B0%84%EC%A0%95%EB%B3%B4%EB%B3%B4%EC%95%88%EA%B4%80%EB%A6%AC%EA%B7%9C%EC%A0%95#AJAX


2. 브이월드 오픈API 이용약관

http://www.vworld.kr/dev/v4dv_apicla_a001.do


3.국가공간정보 기본법

http://www.law.go.kr/%EB%B2%95%EB%A0%B9/%EA%B5%AD%EA%B0%80%EA%B3%B5%EA%B0%84%EC%A0%95%EB%B3%B4%EA%B8%B0%EB%B3%B8%EB%B2%95/(12736,20140603)


4.공간정보의 구축 및 관리 등에 관한 법률

http://www.law.go.kr/%EB%B2%95%EB%A0%B9/%EA%B3%B5%EA%B0%84%EC%A0%95%EB%B3%B4%EC%9D%98%EA%B5%AC%EC%B6%95%EB%B0%8F%EA%B4%80%EB%A6%AC%EB%93%B1%EC%97%90%EA%B4%80%ED%95%9C%EB%B2%95%EB%A5%A0


추가문의 사항이 있으시면 해당메일 혹은 고객센터로 연락주시면 답변드리겠습니다.

감사합니다.


공간정보산업진흥원

정 보 화 사 업 팀

Tel  :      1661-0115

Fax :      031-627-0594

E-mail :  vworld@spacen.or.kr

경기도 성남시 분당구 판교로 242 PDC(판교디지털센터)타워 C동 601호, 13487

++++++++++++++++++++