안녕하세요 캡틴개구리입니다.

오늘은 OpenLayers 와 Leaflet에서 WFS 이용하는 방법을 알아보도록 하겠습니다.


먼저 결과화면은 아래와 같습니다.

서비스바로가기

관련 라이브러리 함수

Openlayers3 와 Leaflet 라이브러리를 받을 수 있는 곳은 아래와 같습니다. 

OpenLayers3 :  https://openlayers.org/ 

Leaflet : http://leafletjs.com/

VWORLD :  http://map.vworld.kr


좌표계

 * OpenLayer3 : EPSG 3857

 * Leaflet : EPSG 4326


1. OpenLayers3(이하 OL3)

활용 라이브러리 : ol.source.Vector, ol.format.GeoJSON, ol.loadingstrategy.bbox, ol.layer.Vector, ol.style.Style, ol.style.Stroke, ol.layer.Tile, ol.source.XYZ,

ol.Map, ol.View 

OL3에 WFS를 올리는 방식은 WMS를 올리는 방식과 유사합니다. 그럼 먼저  <script></script>부분부터 살펴보도록 하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<script type="text/javascript">
    $(document).ready(function(){
 
 
        var vectorSource = new ol.source.Vector({
            format : new ol.format.GeoJSON(),
            url: function(extent) {
                return 'http://***.****.****/geoserver/progworks/wfs?service=WFS&' +
                'version=1.1.0&'+
                'request=GetFeature&'+
                'typename=progworks:z_upis_c_uq152&' +
                'outputFormat=application/json&'+
                'srsname=EPSG:3857&' +
                'bbox=' + extent.join(','+ ',EPSG:3857';
            },
            strategy: ol.loadingstrategy.bbox
        })
 
        var vector = new ol.layer.Vector({
            source: vectorSource,
            style: new ol.style.Style({
                stroke: new ol.style.Stroke({
                    color: 'rgba(0, 0, 255, 1.0)',
                    width: 2
                })
            })
        });
 
 
        var raster = new ol.layer.Tile({
            source: new ol.source.XYZ({
                url: 'http://xdworld.vworld.kr:8080/2d/Base/201802/{z}/{x}/{y}.png'
            })
        });
        
 
        var map = new ol.Map({
            
            layers: [raster,vector],
           
            target: document.getElementById('map'),
           
            view: new ol.View({
              center: [14128579.824512570.74],
              maxZoom: 19,
              zoom: 14
            })
        });
                        
    });
 
</script>
cs

wfs를 불러올때 중요한 부분은 16행 부분이라 생각합니다. 여기에 선언한 ol.loadingstrategy.bbox 라이브러리는 wfs요청문에 bbox(Spatial Filter)가 자동으로 추가되어 서버에 요청을 하는것으로, 줌 레벨이 변결 될 경우, 이전 영역보다 작다면 서버에는 재요청을 하지 않도록합니다. 


<body></body>부분은 아래와 같습니다.

1
<div id="map"></div>
cs


2. Leaflet

활용 라이브러리 : L.map, L.tileLayer, L.Util.extend, L.Util.getParamString, L.geoJson 

<script></script>부분부터 살펴보도록 하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<script type="text/javascript">
    $(document).ready(function(){
                
        
        var leafletMap = L.map('leafletMap').setView([37.52470308242787126.9234],14)
                
        L.tileLayer('http://xdworld.vworld.kr:8080/2d/Base/201802/{z}/{x}/{y}.png').addTo(leafletMap);
          
        var owsrootUrl = 'http://***.****.***/geoserver/progworks/wfs';
        
        var defaultParameters = {
            service : 'WFS',
            version : '1.1.0',
            request : 'GetFeature',
            typeName : 'progworks:z_upis_c_uq152',
            outputFormat : 'application/json',
            format_options : 'callback:getJson',
            SrsName : 'EPSG:4326',
        };
        
        var parameters = L.Util.extend(defaultParameters);
        
        var URL = owsrootUrl + L.Util.getParamString(parameters);
        
        var WFSLayer = null;
        
        var ajax = $.ajax({
            url : URL,
            dataType : 'json',
            jsonpCallback : 'getJson',
            success : function(response){
                WFSLayer = L.geoJson(response, {
                    style : function(feature){
                        return{
                            stroke: 'rgb(255, 0, 0)',
                            fillcolor : 'rgba(0, 0, 0, 0.3)',
                        }
                    }
                }).addTo(leafletMap);
            }
        })
    });
</script>
 
cs

23행에서 선언한 URL에 wfs의 경로와 정보를 담고 그 정보를 이용하여 JQuery ajax를 이용하여 wfs를 받아옵니다.

받아온 정보를 이용하여 L.geoJson 라이브러리를 이용하여 Leaflet 지도에 추가합니다.


<body></body>부분은 아래와 같습니다.

1
2
<div id="leafletMap"></div>
 
cs

결과화면은 아래와 같습니다.


서비스바로가기

안녕하세요 캡틴개구리입니다. 요즘 갑자기 추워졌습니다 감기조심하세요~~~

오늘 소개할 내용은 OpenLayers와 Leaflet에서 WMS를 이용하는 방법을 알려드리겠습니다. 

참고사항으로 OpenLayers는 OepnLayers3를 이용하고 있습니다. 

결과 서비스 화면은 아래와 같습니다. 

서비스바로가기


Openlayers3 와 Leaflet 라이브러리를 받을 수 있는 곳은 아래와 같습니다. 

OpenLayers3 사이트  :  https://openlayers.org/ 

Leaflet 사이트 : http://leafletjs.com/

VWORLD 사이트  :  http://map.vworld.kr


 * OpenLayer3 : EPSG : 3857

 * Leaflet : EPSG :4326


1. Openlayesr3

 Openlayers3(이하 OL3)에서 WMS를 지도위에 올려보도록 하겠습니다. 


이번글은 지난번에 올린 "Openlayers와 Leafle에서 Vworld 배경지도 이용하기"와 연결됩니다. 


OL3에서 지도를 이용할때, 이전에는 OL3의 라이브러리를 이용하여 URL만 Vworld로 변경했었습니다. 이번에는 지도위에 WMS를 이용하여야 하기 때문에 한단계 더 진행하도록 하겠습니다.


사용할 라이브러리를 아래와 같습니다.


--> 지도 띄우기 : ol.Map, ol,View 

--> WMS 이용하기 : ol.layer.Tile, ol.source.TileWMS


지도를 띄우고, 그 지도에 TileWMS를 올리기 위해서 <script></script>부분에 들어갈 내용은 아래와 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<script type="text/javascript">
    $(document).ready(function(){
        //openlayers 지도 띄우기        
        var layerName = 'z_upis_c_uq152';
        var wmsSource = new ol.source.TileWMS({
            urls: [
                "http://progworks.paas.lx.or.kr/wms.do"
               , "http://progworks01.paas.lx.or.kr/wms.do"
               , "http://progworks02.paas.lx.or.kr/wms.do"
               , "http://progworks03.paas.lx.or.kr/wms.do"
               , "http://progworks04.paas.lx.or.kr/wms.do"                
               , "http://progworks05.paas.lx.or.kr/wms.do"                
               , "http://progworks06.paas.lx.or.kr/wms.do"                
               , "http://progworks07.paas.lx.or.kr/wms.do"                
            ],
            params: {'LAYERS' : layerName,
                        'FORMAT':'GIF',
                        'TRANSPARENT':'TRUE',
                        'STROKECOLOR' : 'rgb(255, 0, 0)',        
                        'FILLCOLOR' :  'rgba(0, 0, 0, 0.3)'
                        
                    },
            serverType: 'geoserver',
        });
        
        var layer = new ol.layer.Tile({
            source : wmsSource,
            minResolution: 0.1,
            maxResolution: 20,            
            layerName : layerName,
            layerCategory : 'WMS',
            type : 'WMS',
            visible : true,
            opacity :0.8
        });
 
        var map = new ol.Map({
            target: 'map',
            layers: [
                  new ol.layer.Tile({
                    source: new ol.source.XYZ({
                        
                        url: 'http://xdworld.vworld.kr:8080/2d/Base/201802/{z}/{x}/{y}.png'
                    })
                  }),
            ],
            view: new ol.View({
                center: [14128579.824512570.74],
                zoom: 14,
                minZoom: 10,
                maxZoom: 19,
            }),
            
          });
        map.addLayer(layer);  
    })
</script>
cs

6행 : OL3 지도위에 올릴 WMS 파일을 변수에 넣었습니다. 활용 데이터 출처는 "국가공간정보포털 오픈마켓 교통시설(현황)"데이터입니다.

7행 : WMS의 포맷에 따라 사용하는 라이브러리가 다릅니다. 저같은 경우, ol.source.TileWMS를 이용하였습니다.

 - urls : wms 데이터 위치

 - params : layer의 이름, 포맷, 스타일 등등

 - serverType : 사용하는 서버 타입

28행 : 5행에서 변수 wmsSource에 담은 값을 가지고 ol.layer.Tile 라이브러를 이용하여 layer를 생성하도록 하겠습니다.

 - source : 5행에 선언한 변수명

 - minResolution : 0.1(해상도)

 - maxResolution : 20(해상도)

 - layerName : 4행에 선언한 데이터 변수명

56행 : 지도에 추가하는 부분입니다.

<body></body>부분은 아래와 같습니다.

1
<div id="map"></div>
cs


2. Leaflet

 두번째로 Leaflet에서 WMS를 올려보도록 하겠습니다.

Leaflet 또한 포스팅한 글 "Openlayers와 Leafle에서 Vworld 배경지도 이용하기"와 연결됩니다.

--> 지도 띄우기 : L.map , L.tileLayer

--> WMS 이용하기 : L.tileLayer.wms

<script></script>부분을 먼저 살펴보도록 하겠습니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<script type="text/javascript">
    $(document).ready(function(){
        
        var leafletMap = L.map('leafletMap').setView([37.52470308242787126.9234],14)
        
        L.tileLayer('http://xdworld.vworld.kr:8080/2d/Base/201802/{z}/{x}/{y}.png').addTo(leafletMap);    
        
        var wmsLayer = L.tileLayer.wms('http://***.***.**/geoserver/progworks/wms', {
            layers: "progworks:z_upis_c_uq152",
            format: 'image/png',
            transparent: true,
            version: '1.1.0',
            tileSize: 256,
            zIndex: 100,
            crs: L.CRS.EPSG4326
        }).addTo(leafletMap);
    })
</script>
cs

4행과 6행은 지난번 Leaflet에서 Vworld 지도를 불러오는 부분입니다. 

wms를 불러오기위한 부분은 8행입니다. 이제 8행부분에 대하여 살펴보도록 하겠습니다.

8행 : Leaflet에서 wms를 이용하기 위하여 사용하는 라이브러리 L.tileLayer.wms 입니다. L.tileLayer.wms(wms 데이터 위치, 옵션)형태로 넣어주시면 됩니다.

16행 : OL3와 마찬가지로 지도에 추가하는 부분입니다. 

<body></body>부분은 아래와 같습니다.

1
<div id="leafletMap"></div>
cs


OL3와 Leaflet의 결과 화면입니다.


서비스바로가기

안녕하세요 캡틴개구리입니다. 오늘은 Openlayers와 leaflet에서 Vworld 배경지도를 불러오도록 하겠습니다. 

일단 결과는 아래와 같습니다.

서비스바로가기

Openlayers3 & leaflet 라이브러리를 다운받으실 수 있는 위치를 함께 알려드리겠습니다.


OpenLayers3 사이트  :  https://openlayers.org/ 

Leaflet 사이트 : http://leafletjs.com/

VWORLD 사이트  :  http://map.vworld.kr


1. Openlayers3 및 leaflet의 라이브러리를 추가한다.
  Openlayers3 및 leaflet의 라이브러리를 원하는 위치에 추가합니다.

1
2
3
4
5
6
7
8
9
 
 
<link type="text/css" rel="stylesheet" href="<c:url value='/css/openlayers/ol.css'/>" />
<link type="text/css" rel="stylesheet" href="<c:url value='/css/leaflet/leaflet.css'/>" />
<script src="<c:url value='/js/openlayers/ol.js'/>"></script>
<script src="<c:url value='/js/leaflet/leaflet.js'/>"></script>
 
 
 
cs

2-1 . 지도 띄우기 (Openlayers3)

 Openlayers3와 leaflet의 지도를 웹상에 띄우는 방법은 유사했습니다. 

소스를 추가할 부분은 <script></script>부분과 <body></body>부분 두곳입니다. 먼저 <script>부분은 아래와 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
<script type="text/javascript">
    
        //openlayers 지도 띄우기 (EPSG : 4326)
        var map = new ol.Map({
            target: 'map',
            layers: [
                  new ol.layer.Tile({
                    source: new ol.source.XYZ({
                        //Vworld Tile 변경
                        url: 'http://xdworld.vworld.kr:8080/2d/Base/201802/{z}/{x}/{y}.png'
                    })
                  })
            ],
            view: new ol.View({
                //경도,위도 (EPSG : 4326)
                center: [14128579.824512570.74],
                zoom: 14,
                minZoom: 10,
                maxZoom: 19
            }),
            logo:false
          });
                
    
</script>
 
 
 
cs

변수 map 선언 후, Openlayers3 라이브러리 중 Map을 불러오는 함수를 이용합니다. (new ol.Map)

target의 map은 <div>의 id로 사용됩니다. 그리고 Vworld 지도 이미지정보를 받기 위해서 url부분에 

url: 'http://xdworld.vworld.kr:8080/2d/Base/201802/{z}/{x}/{y}.png'

반드시 넣어주셔야합니다. 참고로 현재 화면에 보이는 url은 테스트용으로 실제로 사용하실려면 api-key를 신청하셔서 사용하시면 됩니다.

화면 실행 시, map 의 View위치는 ol.View()에 넣으시면 됩니다. center : [경도, 위도], zoom : map 확대 레벨, minZoom & maxZoom : map 최대 최소레벨 표시

다음은 <body>부분입니다. 사실 <body>부분은 너무나 간단합니다...너무나 간단하여 스타일과 함께 보여드리겠습니다.(스타일은 변경하셔도 무방합니다.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
 
<style>
#map {
    height: 390px;
    width: 100%;
    
    
}
</style>
 
<body>
 
    <div id="map" class="map"></div>
            
</body>
 
 
cs

참고로 <script>의 target이 <div>의 id라고 말씀드렸었습니다. 따라서 라이브러리를 통해 불러온 지도를 <div>내에 표출하는것입니다. 

이로인해 Openlayers를 이용한 Vworld 지도 띄우기는 끝입니다. 


2-2 . 지도 띄우기 (leaflet)

leaflet 또한 Openlayers3과 유사한 방법으로 지도를 띄울 수 있습니다. leaflet의 라이브러리 추가는 글 1번에서 Openlayers 라이브러리와 함께 보여드렸기때문에 넘어가도록 하겠습니다.

소스를 추가할 부분은 <script></script>부분과 <body></body>부분 두곳으로 Openlayers3와 동일합니다. <script>부분은 아래와 같습니다.

1
2
3
4
5
6
7
8
<script type="text/javascript">
    
        //leaflet 지도 띄우기 (EPSG : 4326)
        var leafletMap = L.map('leafletMap').setView([37.5247030824278714129046.928310394],14)
        //Vworld Tile 변경
        L.tileLayer('http://xdworld.vworld.kr:8080/2d/Base/201802/{z}/{x}/{y}.png').addTo(leafletMap);
    
</script>
cs

leaflet는 Openlayers와 유사하지만 좌표를 넣는 부분에서 차이를 보입니다. Openlayers3의 경우, 경도 위도 순으로 좌표계를 입력하지만

leaflet의 경우 위도 경도 순으로 좌표를 넣어야합니다. --> setView([위도, 경도],줌레벨)

그리고 Vworld를 지도에 띄우기 위해 L.tileLayer에 Vworld 테스트용 API키를 입력합니다.

<body>부분은 Openlayers와 마찬가지로 매우 간단합니다.

1
2
3
4
5
6
7
8
9
10
11
<style>
#leafletMap{
    height: 390px;
    width: 100%;
    
}
 
</style>
 
<div id="leafletMap" class="lea"></div>
cs


이렇게 소스를 넣으시고 html를 조정해주신다면 쉽게 Openlayers 와 leaflet에 Vworld 배경지도를 이용하실 수 있으실 겁니다. 

서비스바로가기



Qgis를 이용한 지형 형상 편집하기

 

* 본 작업은 Qgis 3.4 버전에서 이루어졌음을 알립니다.

 

지형 형상 편집 작업을 하는 시기는 다양합니다. 그 중에서도 단순화 작업을 한 후에 지형 형상 편집 작업을 하는 경우가 많습니다.

독자분들에게 기능적 설명을 하고 이해를 돕기위해 본 게시물에서도 단순화 작업을 진행한 데이터를 활용해 보도록 하겠습니다.

 

1. Qgis를 열고 지형 형상 편집작업을 실행 할 데이터를 불러옵니다.

단순화 작업을 진행한 데이터를 불러와서 확대해보니 사진과 같이 지형 간 이격이 보이는 것을 확인할 수 있습니다.

우리는 이것을 슬리버(Sliver) 라고 부릅니다.

 

2. 작업을 하기위한 스냅핑 (Snapping) 도구를 활성화 합니다.

 - 먼저, Qgis 상단 툴박스에서 마우스 우클릭을 하여 패널창을 엽니다.

 - 패널창 하단 '스냅 툴바' 토글을 활성화 시킵니다.

 - 사진과 같이 스냅핑 도구가 생성 된것을 확인할 수 있습니다.

 

3. 스냅핑 도구와 편집 도구 설명

 

4. 지형 형상 편집 작업 

작업에 이용할 도구들을 모두 활성화 했습니다. 

이제 지형 형상 편집 작업을 시작합니다.

수정하고자 하는 지형의 꼭짓점과 꼭짓점을 맞추어 편집을 합니다.

3. 에서 설명하였던 "교차 영역에 스냅 허용" 도구로 인해 각 지형의 꼭짓점이 맞춰집니다.

 

Tip. 꼭짓점이 없는 면의 경우 중간중간 x자 형식의 구분점이 있으니 이를 활용하여 스냅을 할 수 있습니다.

 

 

 

 

 

 

 

 


| ckan 은 라이선스의 제약이 없는 오픈소스기반의 강력한 데이터 플렛폼이다. 출처 - ckan.org

강력한 오픈소스 제품의 개발 

 모든 오픈소스 제품들은 모든 사람들이 정보이용에 평등 해야 한다는 GNU 선언 및 다양한 재능기부활동, 현장의 수요에 의해서 개발되고 배포된뒤 계속해서 개선과정을 거쳐 발전하는 생태계를 이루고 있다. 특히 수요가 많은 분야에서는 다양한 사람들의 참여로 상용제품을 능가하는 강력한 제품이 등장 
하기도 한다. 
ckan의 활용 사례를 소개하기 전에 오픈소스 데이터플렛폼포털로 ckan이 개발되기 위해 수요를 제공한 공개데이터(OpenData) 에 대해 간략히 소개 한다. 


지식 표현의 증대 , 공개데이터의 부각 

 인터넷이 발달 하고,인공지능등의 새로운 기술적 진보가 진행 되면서 다양한 지식의 표현 방법을 연구 하다 보니, 다수의 데이터를 필요로 하게 되었다. 
이러한 수요로 데이터를 손쉽게 수급 받고, 자유롭게 활용하는 방법이 연구 되었다. 


다양한 데이터의 수요 증가 

 다양한 데이터의 수요가 증대되었고, 다양한 데이터를 공공의 이익을 위해  제약조건없이 사용하기 위한 노력들을 하고 있으며, 이런 노력의 일환으로
 데이터를 쉽게 개방하고 체계적으로 관리하기위한 OpenSource 프로그램  ckan (comprehensive knowledge archive network)을 개발하고
 보급하여 사용하도록 하였다. 


공개데이터(OpenData) 와 공공데이터

데이터를 공공데이터의 잠재성을 높게 평가하고 있는 외국의 사례를 조사하다 보니 개방형 데이터, 개방형 정부의 데이터로 볼 수 있으며 원문 그대로의 OpenData 는 포괄적인 의미이기 때문에 별도의 설명이 필요 하다.


공개데이터 (OpenData)란?

공개데이터 (OpenData)는 자유롭게 사용이 가능한 데이터를 의미 한다. 
다양한 기관에서 많은 데이터를 생산하지만 생산기관의 제약 조건으로 데이터를 제대로  수급 받기 어렵고 사용하더라도 변경, 재 개방을 하기 어려운 점이 있으나. 간단하게 OpenData는 이런 제약조건이 없는 데이터이다.
 
 이런 공개데이터를 활성화 시키기 위해서 영국의 Open Knowledge International에서는  공개데이터의 엄청난 잠재력을 인지 하고, 지속적으로 가치를 향상 시키는 활동을 하고 있다.


공공데이터는?

정부와 공공기관에서 생산한 데이터를  일반 국민이 자유롭게 활용할 수 있도록  다양한 형태로 개방·제공하고, 이를 활용하여 다양한 고부가가치를 창출하도록 지원하고 있다.

  • 대한민국에서 공공데이터의 정의 와 관계법령은 공공데이터 포털에 정의되어 있다.

공공데이터 의 공개데이터(OpenData)로 사용

 공공기관, 정부 에서 생산,개방하는 공공데이터개방데이터(OpenData) 조건으로 개방하여 공공데이터의 무한한 잠재력을 발전시키고, 데이터 개방으로 정부의 책임 강화, 건강한 삶 보장, 복지 증진 새로운 산업을 발굴하는데 사용하도록 하는 선순환 구조를 만들 수 있다.

 
공개데이터 관련 내용 출처 


ckan 이란 무엇인가? 

ckan 은 공공데이터 및 오픈 데이터를 효율적으로 공개/공유하는 데이터 포털 플랫폼이다. 

ckan의 개발 주체는 비영리 단체인 OKI(Open Knowledge International) 산하 Open Knowledge Labs이며, 공개데이터(OpenData)의 활성화를 위해 데이터 생산자, 생산기관에서 웹 상에서 단순하게 , 빠르게 공개 하는 것을 돕기위해서 만든 오픈소스데이터 포털이다.  


ckan 의 장점

 메타데이터기반으로 공개데이터를 체계적으로 관리 할 수 있다. 체계적으로 관리를 할 수 있어서 공개데이터의 가치를 올릴 수 있다. 공개데이터(OpenData)를 쉽게 이용하기 위해서 데이터 카탈로그 기능을 기반으로 데이터 검색, 메타데이터 제공, 데이터셋 제공을 하고 있다. 

 

표준화된 데이터 적제 체계를 구성 하고 있어 ckan 을 도입한 기관간의 데이터 연계가 가능 하며, 다양한 익스텐션(Extension) 을 구성하여 시맨틱 웹(Semantic Web)과 같이 인터넷과 같은 분산환경에서 데이터에 대한 정보와 데이터 사이의 관계-의미 정보(Semanteme)를 공유하여 제공 할 수 있다. 

출처 : https://ckan.org/2011/05/03/under-the-hood-of-ckan/


 

ckan 은 오픈소스로 라이선스 제약 없이 무료로 사용 할 수 있다. GitHub 을 통해서 배포 되고  다수의 오픈소스 개발 참여자들과 함께 완성도 높은 데이터 포털을 구성 할 수 있다. 

출처 - ckan.org


 

다양한 확장 프로그램을 통해서 데이터 표현기능을 다채롭게 구성 할 수 있다. 

 예) 공간정보 속성 사용 : 데이터 셋의 공간정보 속성을 이용해서 공간정보와
       연결되는 데이터들을 지도상에서 표출 할 수 있는 속성을 제공 한다.  

출처 - ckan blog


 
ckan 활용 사례

ckan 의 Government Working Group으로 활동 하고 있는 호주, 캐나다, 미국에서 공개데이터 포털로 사용하고 있으며 

  1. ckan을 사용하여 더 나은 서비스와 상호 운용성을 창출하는 정부를위한 개발 활동 조정 
  2. ckan 개발을위한 효율성 증대  
  3. ckan을 사용하는 개발자, 중개자 및 정부가 Github을 통해 오픈 소스 소프트웨어에 기여하고 사용하도록 보장

  등을 목표로 하고 있다.

 출처 - https://ckan.org/about/government-working-group/

 

 

 

 

 


국가별 데이터 포털 활용 사례 

 국가기관에서 공공데이터의 개방을 위해 ckan 을 데이터포털로 사용하고 있는 대표적인 사례 소개  

  대한민국

 

 

 국가공간정보포털

 공공데이터 포털

 수원시공공데이터

 싱가포르

 

   https://data.gov.sg/

 싱가포르 개방데이터(OpenData) 

싱가포르의 공공데이터를 다양한 형태의 차트를 통해서 제공해 주고 있다.


 미국

 

   https://www.data.gov/

 미국 개방데이터(OpenData) 

 다양한 테마를 기준으로 분류해서 정부 기관에서 생산한
공공데이터를 제공하고 있다.



  영국

 

   https://data.gov.uk/

 영국 개방데이터(OpenData) 

 주제를 기준으로 분류된 공공데이터를 개방하고 있고,

 개인이나 기관에서 데이터를 손쉽게 등록할 수 있는 메뉴를 제공한다.



프로그웍스는 전자정부프레임워크 기반의 기존 시스템 환경에서 표준 인터페이스 정의를 통해 성공적으로 ckan을 적용한 경험을 가지고 있습니다.

esri 의 클라우드 컴퓨팅 적용 사례


esri 의 클라우드 컴퓨팅 단편적인 이야기

■ esri 는?

Desktop GIS 프로그램을 기반으로 시작한 세계적인 GIS 프로그램 업체이다. 



Jack과 Laura Dangermond (둘은 부부이다.)가 1969 년 컴퓨터 매핑과 공간 분석을 사용하여 광범위한 지리적 인 문제를 해결하기 위해 환경 시스템 연구소 (Environmental Systems Research Institute)를 설립하였으며, 이 회사는 토지이용 컨설팅 업무를 주로 수행 했었다 .

이 후 GIS 분야에서 지난 수십년간 다양한 토지이용 모델과 관련 컴퓨터 소프트웨어를 개발,공급 해 왔다. 시장의 수요와 기술의 발전에 관련 도메인의 거의 독점적인 입지를 다지며사업을 확장하여 미국내 10 개 지사와, 전세계 200개 국가에 80개 이상의 공급 업체와 제휴 하고 있다.


사진 출처 - JACK AND LAURA DANGERMOND 


 출처 Wiki 백과 - esri 

■ esri 의 주요 제품

01

데스크탑 GIS

주력제품은 유명한 ArcGIS for Desktop Ver.10.6 이다.  ArcGIS for Desktop 은  ArcMap , ArcCatalog , ArcToolbox , ArcScene ,  ArcGlobe 및 ArcGIS Pro를 포함한 여러 통합 응용 프로그램으로 구성되어 있다. 
이 제품군의 주요 구성 요소 인 ArcMap , ArcCatalog 및 ArcToolbox 를 사용하면 사용자가 지리 정보를 작성, 분석, 매핑, 관리, 공유 및 게시 할 수 있다.

서버 GIS

데스크탑 기반의 ArcGIS 기능을 웹브라우저 기반을 확장하는데 사용된다.  ArcGIS Server , ArcGIS Online 등의 제품이 있다. 

모바일 GIS

ArcPad 가 대표적인 제품으로 다양한 스마트디바이스에 배포 할 수 있는 제품 군이다.
(ArcGIS 기반이 되는 Components 제작기반이 주로 Microsoft 의 기술을 많이 상속 받아서 Widows 기반 스마트 장치 제품에 편중이 심하다. )

개발자 GIS

전체 제품군이 Arc Object 로 불렸던것 같다. ArcGIS를 구성하는 Object 들을 제공하여 개발자가 ArcGIS를 특정 목적에 맞게 커스터마이징 하여 개발 할 수 있다. 

온라인 GIS

ArcGIS Online 이 있다.  Esri, ArcGIS 사용자 및 기타 신뢰할 수있는 데이터 공급자가 게시 한 컨텐츠, 지리 정보를 공유하고  검색 할 수있는 웹 응용 프로그램이다. 사용자는 그룹을 만들고 그룹에 가입 할 수 있으며, 공개 또는 그룹 내에서 공유 된 항목에 대한 액세스를 제어 할 수 있다.

 출처 Wiki 백과 - ArcGIS 

■ esri 의 클라우드 컴퓨팅 전략 

GIS anywhere

클라우드의 SaaS(Software-as-a-Service) 개념으로  GIS 소프트웨어는 esri 가 공급 하고 사용자는 공간데이터분석, 매핑업무에 집중 한다. 라는 개념이다. 공간정보분석의 막강한 성능과 다양한 분야에서의 신뢰성은 esri 의 데스크탑GIS 에서 이미 달성 했지만, 시대가 변해 인터넷이 매우 빠른 속도로 정보를 교환하고, 대용량의 데이터를 필요로 하는 시대가 되었다.  클라우드 개념이 도입되면서 SaaS(Software-as-a-Service) 형태로 제품을 서비스 하는 시장이 개척 되었고, esri도 주력 제품인 ArcGIS for Desktop의 기능을 웹 기반 클라우드에 올리기 시작 한다. 

분석기능이 무겁다

하지만 초창기에 웹 기반에서 모든 분석기능을 다 제공 하기 위해서는 하드웨어적인 한계가 분명 했고, 이어서 유연하게 GIS 데이터의 표출과 공유 쪽으로 초점이 모아졌다.   공유와 표출에 초점을 맞 추다 보니 무거운 공간분석을 수행하는 역할은 ArcGIS Desktop 을 이용하고, 데이터 분석 결과를 DBMS에 적재한 뒤 서버GIS 에서 Web기술을 이용해서 결과를 표출하고 조회 할 수 있는 기능을 제공하는 형태가 되었다. 

웹 기반 클라우드를 활용 하다.

.net 이전시대에서 CGI 가 비주류로 물러나며, 웹 표준에 대한 논란 이전, 모질라와 MS 가 으르렁 거리며 독과점 소송을 이어가던 시절 이며, VB 스크립트 후발로 ASP가 생산성의 가치를 높이고 있던 시절 에  esri 제품에서 웹브라우저에서 지도를 표출 하는 것은 Map Object 나 ArcIMS를 이용해서 였다.
서버사이드에서 직접 오브젝트를 호출해서 웹 페이지에 지도 객체를 띄우거나 자바스크립트를 이용한 지도 라이브러리를 작성 해서 사용 했었다. 

  


이미치 출처 - 
https://www.cursosgis.comhttps://gisandscience.com/ 

이후 ArcGIS Server 가 등판되고, esri 는 ArcGIS Desktop에서 편집한 지도를 손쉽게 웹으로 올릴 수 있는 체계를 공급 하였다. 이 시기에 IIS 에서 ASP 기반의 웹 서비스가 .net 으로 버전 업되고,  웹서버에 올라간 지도를 Restful API 로 공유를 하는 기술이 적용 되었다.

Arcgis Online  출시

발행된 지도가 손쉽게 웹에 배포 되자 웹의 특성을 이용한 여러 사람들의 동시접근 과 동시 이용을 위해서 Arcgis Online 이 출시 되었다.
실제 ArcGIS Server에서 출발한 웹 기능을 다수의 사용자와 데이터 공유, 할 수 있도록  ArcGIS Online 에서 제공 하고 있으며, Esri 의 개발자를 위한 레퍼런스 기술 관련 페이지 (esri Mapbook) 에서도  Arcgis Online 을 이용하여 지도를 공유하고 있다.
이후에 클라우드 기술이 중요하게 부각 되면서 서버 제품군을 클라우드환경에 맞춰서 개선하여 개발 하기 시작 했다. 

ArcGIS Online - 출처 esri.com

 사용자들의 공간정보 활용 및 공유가 중점 

ArcGIS Server 에서 발행한 지도를 공유 하는 것이 중점이라고 생각 한다.
ArcGIS Online 기반에서는 지도를 편집하거나 데이터를 공유하고 웹상에서 발행하는 작업이 가능 하다. 
간단한 작업으로 지도에 POI를 생성해서 바로 발행 하고, 서비스에 반영하거나  Esri 에서 제공하는 배경지도와 전 세계에 다양한 지역의 주제도를
이용할 수 있었다. (안타깝게도 대한민국에서 활용할 수 있는것은 배경지도 정도였다. )

esri제품의 클라우드 유형 

 ArcGIS 의 Cloud Service Model 은 다음 세가지로 구분되었으며,  ArcGIS 배포형태, 관리 주체에 따라 구분되어진다. 

    • Non-Colud

 - 일반적으로 사용자 머신에 배포 되는 ArcGIS Enterprise 

    • Infrastructur-as-a-Service (IaaS) 

 - 클라우드 기반 머신에 배포 되는 ArcGIS Enterprise

    •  Software-as-a-Service (SaaS)

- ArcGIS Online 과 Esri Managed Cloud Service(EMCS)

- 웹들 통해서 접근 되는 비 배포 방식

 Esri Cloud 지원 제품의 관리 주체 별로 구분

    •  사용자가 직접 관리하는 On-premise*, 혹은 AWS, Azure 
    •  Esri 에서 관리 하는 Esri Managed Cloud Service(EMCS)

 


Esri Cloud 지원 제품의  IaaS방식 배포 방식에 따른 분류 

 아마존 AWS 와 MS Azure 에서 Esri 제품 이미지가 준비되어  클라우드 기반 가상머신에 이미지를 적용 한 뒤에 사용자가 제품을 설정 
 할 수 있도록 설정도구*를 제공 한다.

 * Azure : ArcGIS Enterprise Cloud Builder 
 * AWS : Amazon's CloudFormation Templates 

  구글클라우드에 ArcGIS 이미지와 설정 도구는 아직 지원을 안 하는데  Google Earth 때문에 구굴을 경쟁사로 인식 해서가 아닌가 한다. 
 하지만 ArcGIS Enterprise 이미지가 없을 뿐이고, ArcGIS Enterprise 제품은 다양한 IaaS 기반에서 사용 할 수 있다. 

esri ArcGIS Enterprise 는 다양한 IaaS 에 설치 가능 하다. 

Azure와 AWS 에서 ArcGIS Enterprise 사용 

    • Azure 와 AWS 의 강점을 이용해서 IoT 기기들과 연결이 용이함. 
    • Cloud Storage 를 이용한 무거운 Server Tiles 저장 및 관리 가능 
    • 단일장애점 (*SPOF (single point of failure) ) 제거 

*단일장애점 : 시스템 구성 요소 중에서, 동작하지 않으면 전체 시스템이 중단되는 요소

*용어 - 출처 : WiKi 백과

esri Cloud 활용 사례

※ 참고 문헌 

esri - Deploying and Using ArcGIS Enterprise in the Cloud - Witt Mathot, Larry Boden
ArcGIS 의 클라우드 활용 사례는 위 문헌을 참고 할 것. 

■ 대용량 공간데이터의 공간연산 및 표출 

대용량 데이터의 시대 

데스크탑GIS 에서 클라우드 서비스까지 쭉 올라왔지만 최근 기술의 요구사항은 대용량 데이터를 이용한 분석 서비스를 제공하는데 어느정도의 효율성이 나오느냐가 관건 이다.(이 글에서는 DBMS에 저장되는 대용량 공간정보의 방식은 논하지 않았다.)

esri 에서 ArcGIS Enterprise를 이용한 클라우드기반 어플리케이션 배포를 제공 하지만 클라우드 고유의 기능인 Auto-Scaling을 이용한 기술 보다는 표출에 따라 유연한 서버 증설등에 무게를 두고 있는 것 같다.  

앞서 이야기 했듯이 esri 의 클라우드 서비스는 사용자들의 공간정보 공유 및 활용이 중점 인지라 표출에 따른 성능을 우선으로 한다면 빠른 표출이 중요한 관건이다. 하지만 아직까지는  데스크탑GIS의 Components를 활용해서 ArcGIS Enterprise 제품을 IaaS 환경에서 특정 공간분석 모델을 대용량 데이터 기반으로 연산 할 수 있는 기능을 구현 하는 것 은 esri에서 제공하는 제품을 클릭 몇 번으로 기능을 구현 하는 것 보다 숙련된 소프트웨어 엔지니어의 역량 영역으로 봐야 할 것이다. 


 

개요

geoserver에 wms 스타일 중 ogc:Filter를 사용하여 필드 값에 따라 특정 스타일을 부여하는 작업을 하려고 함

이전에 만들었던 경량화 읍면동 파일에 mesure_cnt 명의 컬럼을 추가하고 이 컬럼에 1~ 16 까지의 랜덤한 숫자를 부여하여 일정 구간 마다 opacity 값을 변경 아래의 결과물을 만들었다.


1. 스타일 작업

geoserver 폴리곤 스타일 가이드를 참고하였다. https://docs.geoserver.org/stable/en/user/styling/sld/cookbook/polygons.html

Attribute-based polygon

   <FeatureTypeStyle>
     <Rule>
       <Name>SmallPop</Name>
       <Title>Less Than 200,000</Title>
       <ogc:Filter>
         <ogc:PropertyIsLessThan>
           <ogc:PropertyName>pop</ogc:PropertyName>
           <ogc:Literal>200000</ogc:Literal>
         </ogc:PropertyIsLessThan>
       </ogc:Filter>
       <PolygonSymbolizer>
         <Fill>
           <CssParameter name="fill">#66FF66</CssParameter>
         </Fill>
       </PolygonSymbolizer>
     </Rule>
     <Rule>
       <Name>MediumPop</Name>
       <Title>200,000 to 500,000</Title>
       <ogc:Filter>
         <ogc:And>
           <ogc:PropertyIsGreaterThanOrEqualTo>
             <ogc:PropertyName>pop</ogc:PropertyName>
             <ogc:Literal>200000</ogc:Literal>
           </ogc:PropertyIsGreaterThanOrEqualTo>
           <ogc:PropertyIsLessThan>
             <ogc:PropertyName>pop</ogc:PropertyName>
             <ogc:Literal>500000</ogc:Literal>
           </ogc:PropertyIsLessThan>
         </ogc:And>
       </ogc:Filter>
       <PolygonSymbolizer>
         <Fill>
           <CssParameter name="fill">#33CC33</CssParameter>
         </Fill>
       </PolygonSymbolizer>
     </Rule>
     <Rule>
       <Name>LargePop</Name>
       <Title>Greater Than 500,000</Title>
       <ogc:Filter>
         <ogc:PropertyIsGreaterThan>
           <ogc:PropertyName>pop</ogc:PropertyName>
           <ogc:Literal>500000</ogc:Literal>
         </ogc:PropertyIsGreaterThan>
       </ogc:Filter>
       <PolygonSymbolizer>
         <Fill>
           <CssParameter name="fill">#009900</CssParameter>
         </Fill>
       </PolygonSymbolizer>
     </Rule>
   </FeatureTypeStyle>

<title> : 타이틀의 값이 범례에 표현될 값을 의미함

<ogc:PropertyIsLessThan> : 미만

<ogc:PropertyIsGreaterThanOrEqualTo> : 같거나 큼

<ogc:PropertyIsGreaterThan> : 이상


데이터 > 스타일 > Layer Preview(탭 매뉴)



사용 SLD CODE
<?xml version="1.0" encoding="ISO-8859-1"?>
<StyledLayerDescriptor version="1.0.0"
  xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd"
  xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc"
  xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <NamedLayer>
    <Name></Name>
    <UserStyle>
      <Title>A azure polygon style</Title>
      <FeatureTypeStyle>
       <Rule>
         <Name>0</Name>
         <Title>0</Title>
         <ogc:Filter>
           <ogc:PropertyIsLessThan>
             <ogc:PropertyName>mesure_cnt</ogc:PropertyName>
             <ogc:Literal>1</ogc:Literal>
           </ogc:PropertyIsLessThan>
         </ogc:Filter>
         <PolygonSymbolizer>
           <Fill>
             <CssParameter name="fill">#FF0000</CssParameter>
             <CssParameter name="fill-opacity">0.0</CssParameter>
           </Fill>
           <Stroke>
             <CssParameter name="stroke">#000000</CssParameter>
             <CssParameter name="stroke-width">0.5</CssParameter>
           </Stroke>
         </PolygonSymbolizer>
       </Rule>
       <Rule>
         <Name>1 ~ 5</Name>
         <Title>1 ~ 5</Title>
         <ogc:Filter>
           <ogc:And>
             <ogc:PropertyIsGreaterThanOrEqualTo>
               <ogc:PropertyName>mesure_cnt</ogc:PropertyName>
               <ogc:Literal>1</ogc:Literal>
             </ogc:PropertyIsGreaterThanOrEqualTo>
             <ogc:PropertyIsLessThan>
               <ogc:PropertyName>mesure_cnt</ogc:PropertyName>
               <ogc:Literal>5</ogc:Literal>
             </ogc:PropertyIsLessThan>
           </ogc:And>
         </ogc:Filter>
         <PolygonSymbolizer>
           <Fill>
             <CssParameter name="fill">#FF0000</CssParameter>
             <CssParameter name="fill-opacity">0.3</CssParameter>
           </Fill>
           <Stroke>
             <CssParameter name="stroke">#000000</CssParameter>
             <CssParameter name="stroke-width">0.5</CssParameter>
           </Stroke>
         </PolygonSymbolizer>
       </Rule>
        <Rule>
         <Name>6 ~ 10</Name>
         <Title>6 ~ 10</Title>
         <ogc:Filter>
           <ogc:And>
             <ogc:PropertyIsGreaterThanOrEqualTo>
               <ogc:PropertyName>mesure_cnt</ogc:PropertyName>
               <ogc:Literal>6</ogc:Literal>
             </ogc:PropertyIsGreaterThanOrEqualTo>
             <ogc:PropertyIsLessThan>
               <ogc:PropertyName>mesure_cnt</ogc:PropertyName>
               <ogc:Literal>10</ogc:Literal>
             </ogc:PropertyIsLessThan>
           </ogc:And>
         </ogc:Filter>
         <PolygonSymbolizer>
           <Fill>
             <CssParameter name="fill">#FF0000</CssParameter>
             <CssParameter name="fill-opacity">0.6</CssParameter>
           </Fill>
           <Stroke>
             <CssParameter name="stroke">#000000</CssParameter>
             <CssParameter name="stroke-width">0.5</CssParameter>
           </Stroke>
         </PolygonSymbolizer>
       </Rule>
       
        <Rule>
         <Name>11 ~ 15</Name>
         <Title>11 ~ 15</Title>
         <ogc:Filter>
           <ogc:And>
             <ogc:PropertyIsGreaterThanOrEqualTo>
               <ogc:PropertyName>mesure_cnt</ogc:PropertyName>
               <ogc:Literal>11</ogc:Literal>
             </ogc:PropertyIsGreaterThanOrEqualTo>
             <ogc:PropertyIsLessThan>
               <ogc:PropertyName>mesure_cnt</ogc:PropertyName>
               <ogc:Literal>15</ogc:Literal>
             </ogc:PropertyIsLessThan>
           </ogc:And>
         </ogc:Filter>
         <PolygonSymbolizer>
           <Fill>
             <CssParameter name="fill">#FF0000</CssParameter>
             <CssParameter name="fill-opacity">0.8</CssParameter>
           </Fill>
           <Stroke>
             <CssParameter name="stroke">#000000</CssParameter>
             <CssParameter name="stroke-width">0.5</CssParameter>
           </Stroke>
         </PolygonSymbolizer>
       </Rule>
        
       <Rule>
         <Name>16 ~ </Name>
         <Title>16 ~ </Title>
         <ogc:Filter>
           <ogc:PropertyIsGreaterThan>
             <ogc:PropertyName>mesure_cnt</ogc:PropertyName>
             <ogc:Literal>16</ogc:Literal>
           </ogc:PropertyIsGreaterThan>
         </ogc:Filter>
         <PolygonSymbolizer>
           <Fill>
             <CssParameter name="fill">#FF0000</CssParameter>
             <CssParameter name="fill-opacity">1</CssParameter>
           </Fill>
           <Stroke>
             <CssParameter name="stroke">#000000</CssParameter>
             <CssParameter name="stroke-width">0.5</CssParameter>
           </Stroke>
         </PolygonSymbolizer>
       </Rule>
      </FeatureTypeStyle>
    </UserStyle>
  </NamedLayer>
</StyledLayerDescriptor>



Qgis를 통한 데이터 좌표계 변환 및 저장

* 작업한 QGIS의 버전은 3.4 버전임을 알려드립니다.

 

* 원본 데이터 좌표계 확인

  • 원본 데이터의 좌표계를 확인합니다.

원본데이터의 좌표계가 EPSG:5179로 되어있습니다.

 

* 좌표계 변환 방법

- 레이어트리에서 좌표계를 변환하려는 데이터를 우클릭 합니다.- Set CRS 선택 후 원하는 좌표계 선택 및 확인을 클릭합니다.

 

* 데이터 저장 방법

- 레이어트리에서 데이터를 우클릭 후 내보내기/객체를 다른이름으로 저장하기를 선택합니다.

 

- 데이터를 저장할곳과 파일명을 지정합니다.

- 변환하고자하는 좌표계를 선택 후 확인을 눌러 저장합니다. 

 

* 좌표계를 변환하여 저장한 shp파일(데이터)을 QGIS로 불러옵니다.

좌표계가 WGS84(EPSG:4326)로 변환이 완료된 모습입니다.

 

-> 위와 같은 방법으로 다른 좌표계로 변환할 수 있습니다. 

 

 

 

 

 

도로명주소 전자지도 개발자센터에서 법정구역읍면동 데이터를 다운로드 후,
1. postgis 에서 simplify 작업
을 실행 하고
2. simplify 작업으로 인하여 발생한 sliver를 QGIS를 사용하여 수작업을 통한 제거작업을 진행한 서울지역 읍면동 법정경계 파일

tl_emd_seoul_4326.zip


공간정보산업 발전을 위한 성찰의 시간을 갖고자 합니다.


서론

곧 다음 해(2019년) 정보 예산안의 심의가 열릴 것이다. 작 년 이 맘때즘 기사화된 신문 지면을 참조하면 국가정보화 부문의 2018년도 실행 예산은 약 5조 2천억원으로, 중앙정부가 4조 2천억원, 지자체가 약 1조원을 투입하는 것으로 되어 있다. 어느 정도 규모인지 가늠하기도 힘든 금액임에도 불구하고 정보화사업을 주업으로 하는 대다수의 중소기업, 특히 공간정보 분야의 국가정보화사업을 주업으로 하는 중소기업들이 더욱 힘들 수 밖에 없는지 원인을 고민해 본다.


 공간정보 분야의 중소기업을 유독 힘들게 하는 여러 문제점들을 살펴보면, 상대적으로 미미한 공간정보산업규모, 신규 발주되는 사업의 축소와 기 구축 시스템의 유지관리비용 증가, 외산 솔루션 또는 공개SW 에 종속된 기반 기술력 부족으로 신규 시장 창출 역량 부족, 저임금과 잦은 출장으로 고용의 질이 좋지 못한 것, 마지막으로 경영난 타개를 위하여 전문 분야가 아닌 부문의 사업수행 실패로 인한 기업 신뢰도 하락 등을 들 수 있다.


본론

1. 상대적으로 미약한 공간정보산업 규모 및 신규 사업의 감소

국토교통부의 "2017년 공간정보산업조사 통계보고서"를 보면 2016년 기준 공간정보사업체수는 4,569개사이며, 그 중 약 67%가 공간 정보 관련 기술 서비스업에 종사하는 것으로 조사되고 있다. 또한 세부 매출 항목을 보면 "공간정보 시스템 통합 자문 및 구축 서비스업"이 약 1조 1천억원으로 조사되고 있다. 동 보고서에 기술된 한국산업은행의 "한국은행 기업분석 매출액 비교"를 보면 공간정보기업이 발생시키는 매출은 전체에서 약 0.8%이고, 이중 12%가 흔히 말하는 공간정보분야의 정보화사업부문 매출인 것이다.

정보화사업 부문 매출은 세부적으로 컨설팅 및 자문, 신규 구축, 유지보수(유지관리 및 운영)로 나뉘어 진다. 소프트웨어정책연구소 이슈리포트에는 2015년 기준으로 유지보수 부문의 비중이 50%를 넘어선 것으로 조사되었고 그 비중은 계속 증가하고 있는 추세이다. 이는 공공 및 민간 부문을 포함하여 약 5,000억원 규모의 공간정보 시장에서 3,000개 이상의 업체가 경쟁하는 시장이라는 것을 의미한다.

복지 및 교육 예산의 증가로 인해 실제 공공정보화산업 분야의 예산은 늘어나기 어려운 형편임을 고려할 때 산업계 스스로 정부에 의지하는 사업구조를 개편하지 못한다면, 이런 어려움에서 벗어나기 힘들 것이다.


2. 외산 솔루션에 의존적인 기술 환경

2000년대 중반 프리랜서와 함께 일할 경우 고급의 경우 월별 약 800만원부터 1,000만원까지 금액으로 계약을 진행했다. 현재 관리하고 있는 사이트의 경우 특급임에도 월 900만원 미만의 금액으로 계약을 진행할 수 있었다. 그 동안의 물가 상승률 등을 고려할 때, 오히려 프리랜서와의 계약 단가는 낮아졌는데 왜 경영난은 계속되는지 고민해보니 의외로 단순한 결론을 얻게 되었다.
외산 솔루션 의존도가 높다보니 최초 도입 후 유지관리비용이 지속적으로 상승했다. 이러한 유지관리예산이 지속적으로 증가함에 따라 과거대비 동일 비용으로 수행해야하는 업무가 많아졌고 고용을 창출할 수 있는 신규사업도 감소했다. 하지만 단순히 정보화 예산 부족만으로 원인을 따지기에는 뭔가 부족해 보인다.

첫째, ESRI사의 솔루션, Oracle을 선호하는 발주기관이 대다수를 차지하는 환경에서 기업은 요건에 따라 사업을 진행했으며 이는 기구축시스템의 유지관리비용(SW라이센스 비용)을 증가시켰고 신규 사업을 기획하고 진행할 수 있는 예산 축소의 원인이 되었다.
Oracle의 경우 유지관리를 위한 Subscription을 구매하지 않을 경우, 다음 해 유지관리 서비스를 받고자하면 이 전에 구매하지 못한 것까지 포함해서 구매해야 한다. 이 비용이 의외로 커서 두 해만 거르더라도 신규로 Oracle을 구매하는 비용에 도달하곤 한다.
또한 시스템을 구성하는 장비의 예비 파트비용은 모두 정보화 예산에 포함되는 금액으로 개발예산을 줄이는 원인이 된다. 국내의 많은 공간정보 또는 GIS 관련 시스템은 최초 구축 시 시군구서버, 시도서버, 중앙서버를 연계하는 방식으로 업무양 대비 과도한 장비를 도입하였고 현재는 이를 위한 유지관리에 많은 예산을 투입하는 실정이다.
(지자체가 발주하는 공간정보관련 사업은 대부분이 유지관리 사업임 : 나라장터 조회)


둘째, 더 이상 특별하지 않은 공간정보 어플리케이션을 들 수 있다. 서비스 부문으로 한정하면 대부분의 사이트에서 Geoserver를 이용하고, 웹 브라우저에서 OpenLayers 등을 이용하여 사용자페이지를 구성한다. 누구라도 공간정보 앱을 개발할 수 있게 된 것으로써 굳이 본사의 정규직 인력이 아닌 계약직 인력으로도 계약을 이행할 수 있도록 해주었다. 

그러나 발주처의 눈높이가 높아지고 정보화 기술의 발전에 따라 처리해야하는 데이터 양은 기하급수적으로 늘고 있는데 비해 공공부문 공잔정보시스템 개발에 적용하는 기술요소 또는 공개SW는 이를 따라가지 못하고 있다. 이는 사업 성과물에 대한 고객 불만족과 기업 불신의 원인이 되고 있다.
업체 스스로가 4차산업혁명, ICBM 등 최신 기술 트렌드에 맞는 뭔가를 제시할 수 없다면 공간정보서비스란 누구나 할 수 있는 그저 그런 것이 될 수 밖에 없을 것이다. 


3. 근속 년수 부족 및 인력 이탈

국토교통부의 "2017년 공간정보산업조사 통계보고서"를 보게 되면 근속년수가 1~3년 미만이 전체의 약 62% 정도를 차지하는 것을 볼 수 있다. 인력 이탈 원인은 누구라도 급여에 대반 불만족이 가장 크다는 것을 쉽게 짐작할 수 있다. 동일 년 수 대비 계약직(프리랜서) 직원이 받는 급여와 내 급여의 차이가 현저하다면 누구든 불만을 갖기 마련이다.(이직에 대한 고민을 하게 될 것이다.)

기업은 고용을 유지하기 위해 지속적으로 급여를 인상해야 하지만, 내가 만든 재화를 판매하는 것이 아닌 사업을 수주하여 발생하는 매출이라면 미래 불확실성으로 직원의 급여 인상에 소극적일 수 밖에 없고 양질의 일자리를 제공하기 위한 정규직 채용에도 적극적이지 못할 것이다.


근속 년수가 길지 않으므로 기술 개발의 연속성을 가져갈 수 없다. 공간정보분야의 대부분 국산 SW는 최초 개발된 원형에서 발전이 더디며 유지관리서비스 또는 외산 솔루션 대비 미흡한 것이 사실이다.

지속적으로 기술을 발전시키기 위한 인력확보의 전제조건은 만족할만한 보상의 제공이다. 소프트웨어산업협회는 매년 "SW대가산정가이드"를 공표하지만 실제 이를 준수하는지 관리감독하지는 않는다.  FP(Function Point)기준으로 개발규모를 산정하고 일일생산성 기준에 따라 투입인원을 산정하는 현재 방식에는 문제가 없지만 현장에 적용되는 괴리를 줄이지 못한다면 발주기관 또한 납품되는 시스템의 품질을 보장받기 어려울 것이고,  기업은 소비되는 자원 투입 방식의 인력관리를 진행 할 수 밖에 없을 것이다. 

부끄럽게도 국내 공간정보산업은 국가 발주 사업에 회사의 명운을 거는 분야이다. 이미 업체 스스로 왜곡된 시장구조를 바꿀 수 있는 능력을 갖추고 있지 못하며, 공간정보가 미래 먹거리를 지원하는 기반 정보라면 국내 기업이 만든 SW를 사용하도록 장려할 수 있는 제도적 지원 등이 동반되어야 할 것이다.


결론

전자정부의 발전에 따라 유지비용의 증가로 신규 사업예산이 줄어드는 것, 자체 기술력 부족으로 시장의 신뢰를 잃어버리는 것, 정부 의존적 사업구조로 인해 고용의 질을 보장하지 못하는 것 등 공간정보기업이 처한 어려운 상황에 대한 변명 아님 변명을 해보았다.
사견이지만 개발자 스스로도 외산 솔루션을 찾는 편함보다는 새로운 것을 창조하는 기쁨을 찾기를 바라며 짧지 않은 글 마무리 한다.


프로그웍스는 항상 고민하고 고품질의 서비스를 제공하기위한 개발자가 되겠습니다.

+ Recent posts