본문 바로가기
Computer Science/OSM project

[Openlayers] 타일/래스터 데이터를 제공하는 오픈소스 소프트웨어

by 롱일스 2020. 7. 31.
반응형

 

 

이번 포스트에서는 Openlayers 사용 시에, 지도 source 소스로 사용되는 타일 tile, 래스터 raster 데이터를 제공하는 오픈소스 소프트웨어들에 대해 알아보겠습니다.

 

 


<자신만의 맵 서버가 있어서 그 맵 서버를 통해서 지도의 소스를 제공하는 경우!!>

 

1) Geoserver: http://geoserver.org

웹 브라우저, 데스크톱 GIS 등 표준 클라이언트에 다양한 형식의 지도와 데이터를 제공할 수 있는 서버 소프트웨어입니다.

2) Mapnik: http://www.mapnik.org

고품질의 안티앨리어싱 그래픽, 지능형 라벨 배치, 확장 가능한 SVG 심볼화가 제공하는 깨끗하고 부드러운 피쳐 에지를 갖춘 아주 좋은 맵 렌더링을 위한 툴킷입니다. 가장 일반적으로 맵닉은 OpenStreetMap 메인 맵 레이어를 렌더링하는 데 사용됩니다.

3) Map server: http://www.mapserver.org

C로 작성된 오픈 소스 지리 데이터 렌더링 엔진입니다. MapServer GIS 데이터 검색 외에도 사용자가 웹 콘텐츠로 이동할 수 있는 지리적 이미지 맵, 즉 지도를 만들 수 있도록 해줍니다. GeoServer와 마찬가지로 오픈 웹 표준을 통해 지도 게재를 허용합니다.

4) Degree: http://www.deegree.org/

Degree는 공간정보 인프라와 지리공간 웹을 위한 오픈소스 소프트웨어다. GeoServer Mapserver와 오픈 웹 표준을 통해 지도를 제공하는 기능을 공유합니다.

5) MapCache

http://mapserver.org/mapcache/, GeoWebCache

http://geowebcache.org 또는 MapProxy http://mapproxy.org.

MapCache는 지도 프록시 응용프로그램으로 주요 목적은 동적 웹 서버를 위한 타일을 만들고, GeoServer, MapServer, Mapnik, Degree 또는 다른 지도 서버를 사용하여 요청된 지도 이미지를 캐싱합니다.

 


그러면, 이렇게 맵 서버에서 얻은 소스 파일을 어떻게 Openlayers에 적용할까d요?

GeoServer를 예로 들어 보겠습니다.만약에 타일형태가 아닌 WMS 형식으로 이미지로 받아오려면 ol.source.ImageWMS를 사용하면 됩니다.

var untiled = new ol.layer.Image({
	    source: new ol.source.ImageWMS({
	      ratio: 1,
	      url: 'http://localhost:8080/geoserver/angpangdi/wms',
	      params: {'FORMAT': format,
	           'VERSION': '1.1.1',  
	        "LAYERS": 'angpangdi:planet_osm_line',
	        "exceptions": 'application/vnd.ogc.se_inimage',
	      }
	    })
          });

나는 타일로 된 WMS 형식으로 지도를 띄우고 싶다 하시면 ol.source.TileWMS 로 가져오시면 됩니다.

 var tiled = new ol.layer.Tile({
	    visible: false,
	    source: new ol.source.TileWMS({
	      url: 'http://localhost:8080/geoserver/angpangdi/wms',
	      params: {'FORMAT': format, 
	           'VERSION': '1.1.1',
	           tiled: true,
	        "LAYERS": 'angpangdi:planet_osm_line',
	        "exceptions": 'application/vnd.ogc.se_inimage',
	         tilesOrigin: 13539152 + "," + 4162331
	      }
	    })
          });

 

전체적으로 Openlayers3로 지도를 띄우는 html 코드를 첨부하겠습니다. (이 경우에도 GeoServer가 소스입니다.)

<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="//localhost:8080/geoserver/openlayers3/ol.css" type="text/css" />
    <style>
        .ol-zoom {
          top: 52px;
        }

        body {
            font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
            font-size: small;
        }
        iframe {
            width: 100%;
            height: 250px;
            border: none;
        }
    </style>

    <script src="//localhost:8080/geoserver/openlayers3/ol.js" type="text/javascript"></script>
    <title>OpenLayers map page by angpangdi</title>
  </head>

  <body>
       <div id="map">지도</div>   

       <script type="text/javascript">

      // if this is just a coverage or a group of them, disable a few items,
      // and default to jpeg format
          var format = 'image/png';
          var bounds = [13539152, 4162331,
  	            15199717, 5555446.5];

          var untiled = new ol.layer.Image({
	    source: new ol.source.ImageWMS({
	      ratio: 1,
	      url: 'http://localhost:8080/geoserver/angpangdi/wms',
	      params: {'FORMAT': format,
	           'VERSION': '1.1.1',  
	        "LAYERS": 'angpangdi:planet_osm_line',
	        "exceptions": 'application/vnd.ogc.se_inimage',
	      }
	    })
          });
          var tiled = new ol.layer.Tile({
	    visible: false,
	    source: new ol.source.TileWMS({
	      url: 'http://localhost:8080/geoserver/angpangdi/wms',
	      params: {'FORMAT': format, 
	           'VERSION': '1.1.1',
	           tiled: true,
	        "LAYERS": 'angpangdi:planet_osm_line',
	        "exceptions": 'application/vnd.ogc.se_inimage',
	         tilesOrigin: 13539152 + "," + 4162331
	      }
	    })
          });
          var projection = new ol.proj.Projection({
	      code: 'EPSG:3857',
	      units: 'm',
	      global: true
          });
          var map = new ol.Map({
	    controls: ol.control.defaults({
	      attribution: false
	    }).extend([mousePositionControl]),
	    target: 'map',
	    layers: [
	      untiled,
	      tiled
	    ],
	    view: new ol.View({
	       projection: projection
	    })
          });

        </script>
  </body>
</html>

위에서 처럼 지도이미지/타일 layer만 평성한다고 되는 게 아니라 view, projection, map 변수가 다 있어야지 지도가 화면에 뜹니다.

 

 다음 포스트에서는 Openlayers로 실습하기에 가장 좋은 Open Street Map 로부터 가장 간단하게 맵을 띄워보는 실습을 하도록 하겠습니다. 

 

 

(출처: OpenLayers 3 Beginners Guide by Thomas Gratier, Paul Spencer, Erik Hazzard)

728x90
반응형