VWorld의 WMS 지도 서비스

VWorld에는 TMS 방식의 다양한 배경지도(단순 배경지도와 항공영상 지도 등) 뿐만이 아니라 유용한 WMS 방식의 지도 서비스도 제공하고 있습니다. 이를 VWorld에서 OpenAPI 키를 발급받아 TMS나 WMS를 지원하는 OpenLayers나 FingerEyes와 같은 클라이언트 맵엔진에서 사용할 수 있습니다.

이 글은 VWorld에서 제공하는 WMS 지도 서비스를 이용하는데 필요한  WMS 파라메터에 대해 정리한 글입니다. 저는 제게 익숙한 FingerEyes를 이용해 VWorld의 WMS 지도 서비스를 살펴보았습니다. OpenLayers에 익숙하다면 쉽게 적용이 가능할 것으로 판단됩니다. 참고로 VWorld는 자체적인 2D Map API를 지원하고 있으므로 이를 이용할 수도 있습니다.

먼저 자연환경 보전 지역에 대한 WMS 지도 서비스 요청입니다. 참고로 _KEY_KEY_라고 되어 있는 부분은 VWorld에서 직접 OpenAPI Key를 발급받아 지정하시면 됩니다.

var wmsLayer:XrWMSLayer = new XrWMSLayer("wms", 
    "http://2d.vworld.kr:8895/2DCache/gis/map/WMS2?APIKEY=_YOUR_KEY_&", 
    "LT_C_UQ114", 
    "EPSG:900913");

map.layers.addLayer(wmsLayer);

그 결과에 대한 지도는 아래와 같습니다. 참고로 배경맵은 VWorld의 TMS 지도 서비스를 사용하였습니다.

사용자 삽입 이미지
다음은 개발제한구역에 대한 WMS 지도 서비스 요청입니다.

var wmsLayer:XrWMSLayer = new XrWMSLayer("wms", 
    "http://2d.vworld.kr:8895/2DCache/gis/map/WMS2?APIKEY=_YOUR_KEY_&", 
    "LT_C_UD801", 
    "EPSG:900913");

map.layers.addLayer(wmsLayer);

결과는 아래와 같습니다.

사용자 삽입 이미지
그리고 다음은 지적도에 대한 WMS 지도 서비스 요청입니다.

var wmsLayer:XrWMSLayer = new XrWMSLayer("wms", 
    "http://2d.vworld.kr:8895/2DCache/gis/map/WMS2?APIKEY=_YOUR_KEY_&", 
    "LP_PA_CBND_BUBUN%2CLP_PA_CBND_BONBUN", 
    "EPSG:900913");

    map.layers.addLayer(wmsLayer);

결과는 아래와 같습니다.

사용자 삽입 이미지
그리고 다음은 새주소도로에 대한 WMS 지도 서비스 요청입니다.

var wmsLayer:XrWMSLayer = new XrWMSLayer("wms", 
    "http://2d.vworld.kr:8895/2DCache/gis/map/WMS2?APIKEY=_YOUR_KEY_&", 
    "LT_L_SPRD",
    "EPSG:900913");

map.layers.addLayer(wmsLayer);

결과는 아래와 같습니다. 참고로 새주소도로는 도로 위의 도로명에 대한 표시입니다.

사용자 삽입 이미지   
그리고 다음은 토지이용계획도에 대한 WMS 지도 서비스 요청입니다.

var wmsLayer:XrWMSLayer = new XrWMSLayer("wms", 
    "http://2d.vworld.kr:8895/2DCache/gis/map/WMS2?APIKEY=_YOUR_KEY_&", 
    "LT_C_LHBLPN", 
    "EPSG:900913");

map.layers.addLayer(wmsLayer);

결과는 다음과 같습니다.

사용자 삽입 이미지
그리고 다음은 국토계획구역에 대한 WMS 지도 서비스 요청입니다.

var wmsLayer:XrWMSLayer = new XrWMSLayer("wms", 
    "http://2d.vworld.kr:8895/2DCache/gis/map/WMS2?APIKEY=_YOUR_KEY_&", 
    "LT_C_UQ141",   
    "EPSG:900913");

map.layers.addLayer(wmsLayer);

결과는 다음과 같습니다.

사용자 삽입 이미지
그리고 다음은 사업지구경계도에 대한 WMS 지도 서비스 요청입니다.

var wmsLayer:XrWMSLayer = new XrWMSLayer("wms", 
    "http://2d.vworld.kr:8895/2DCache/gis/map/WMS2?APIKEY=_YOUR_KEY_&", 
    "LT_C_LHZONE", 
    "EPSG:900913");

map.layers.addLayer(wmsLayer);

다음은 그 결과입니다.

사용자 삽입 이미지
그리고 다음은 도시지역도에 대한 WMS 지도 서비스 요청입니다.

var wmsLayer:XrWMSLayer = new XrWMSLayer("wms", 
    "http://2d.vworld.kr:8895/2DCache/gis/map/WMS2?APIKEY=_YOUR_KEY_&", 
    "LT_C_UQ111", 
    "EPSG:900913");

map.layers.addLayer(wmsLayer);

결과는 다음과 같습니다.

사용자 삽입 이미지
이외에도 향후 더 다양한 WMS 지도 서비스를 제공할 것으로 생각됩니다. 이처럼 국가에서 제공하는 양질의 유용한 지도 데이터 서비스를 활용하여 민간업체에서 더 나은 서비스를 연구 및 기획하여 실제 개발할 수 있을 것입니다.

실습강의자료 ㅡ 스마트기기융합서비스개발

경일대의 공간정보공학과에서 진행한 모바일 GIS 실습자료입니다. 모바일 GIS 엔진인 블랙포인트를 이용하여 실습을 진행하였습니다. 다음과 같은 내용을 중심으로 실습을 하였습니다.

  1. 스마트 폰 또는 태블릿 PC의 화면에 지도를 표시하고
  2. 지도를 레이어(Layer) 단위로 구성하며
  3. 구성된 레이어의 색상 등의 심벌을 지정하고
  4. 구성된 레이어의 라벨을 표시하며
  5. 표시된 건물을 터치하면 터치된 건물의 속성 정보를 제공하고
  6. 현재 내 위치로 지도를 이동함

아래의 이미지는 최종 실습 결과물에 대한 실행화면 예시입니다.

사용자 삽입 이미지

그리고 아래는 실습을 위한 수업자료입니다.

반복문의 반복 횟수를 줄이는 코드 작성

반복문의 속도를 최적화하기 위한 방법중의 하나로 반복 횟수를 줄이는 것이 있습니다. 이에 대해서 제프 그린버그(Jeff Greenberg)가 제안한 내용이 있는데요. 처음 제안될때 작성된 샘플 코드가 C이지만 이를 JavaScript로 해석해 보았습니다. 먼저 개선해 나갈 반복문의 코드가 다음과 같습니다.

function task(arg) {
    var sum = 0;
    for (var i = 0; i < 10; i++) {
        sum += i;
    }
    return sum;
}

var start = +new Date();
var result = 0;
var repeatCounts = 9999999;

//========================================
for (var i = 0; i < repeatCounts; i++) {
    result += task(i);
}
//========================================

var end = +new Date();
var diff = end - start;
alert("result = " + result + ", " + diff + " msec");

최적화 대상이 되는 반복문은 13ㅡ17번입니다. 반복문 안에서 실해된 코드를 별도의 함수인 task로 뽑아놨습니다. task는 1부터 10까지의 합계를 구하는 간단한 연산을 수행하는 함수입니다. 반복문의 속도를 측정하기 위해서 반복문 앞뒤로 시간을 측정하고 있습니다. 이 반복문을 수행하였더니 제 타블릿PC에서는 8.6초가 나왔습니다. 이제 동일한 결과를 얻으면서도 반복 회수를 줄이는 방식으로 최적화를 한 코드는 다음과 같습니다. 위의 13ㅡ17번에 대한 반복 코드에 대한 변경된 부분만 언급하였습니다.

//========================================
var iters = Math.floor(repeatCounts / 10);
var startAt = repeatCounts % 10;
var i = 0;

do {
    switch (startAt) {
        case 0: result += task(i++);
        case 9: result += task(i++);
        case 8: result += task(i++);
        case 7: result += task(i++);
        case 6: result += task(i++);
        case 5: result += task(i++);
        case 4: result += task(i++);
        case 3: result += task(i++);
        case 2: result += task(i++);
        case 1: result += task(i++);
    }
    startAt = 0;
} while (iters--);
//====================================

한번의 반복으로 최대 10번의 반복을 대신하고 있습니다. switch 문을 보면 break문이 없다는 점을 유념해 해석해 보면 그 원리를 이해할 수 있습니다. 실행해 보면 소요되는 시간이 6.3초로 2.4초 단축된 것을 알 수 있습니다.

[GIS] 여러 개의 SHP 파일을 하나로 합쳐주는 툴 ㅡ MergeSHPFiles

속성이 동일한 SHP 파일들을 하나로 병합해 주는 툴입니다. 병합할때 저장할 속성을 선택할 수 있는 편의 기능을 제공합니다. UI는 아래와 같습니다.

사용자 삽입 이미지
각 UI에 대한 기능을 간단히 설명하면 다음과 같습니다.


  1. 병합할 SHP 파일을 추가합니다. 병합할 SHP 파일의 속성에 대한 필드 구조는 동일해야 합니다.
  2. 병합하기 위해 추가한 SHP 파일을 제거합니다.
  3. 병합할 SHP 파일에 대해서 저장할 속성 필드를 선택할 수 있는 리스트입니다.
  4. 병합할 SHP 파일의 리스트입니다.
  5. 병합되어질 결과 SHP 파일명입니다.
  6. 그림에서 빠졌군요 ㅡOㅡ;
  7. 병합할 SHP 파일을 지정합니다. 이미 존재하는 SHP 파일을 지정해서는 않됩니다.
  8. 병합을 실행합니다.
아래에 실행 파일과 소스를 함께 올립니다. 이 프로그램은 듀라맵을 이용하므로 먼저 듀라맵을 PC에 등록하셔야 합니다.