[OpenLayers] GeoServer에서의 대용량 GeoTIFF를 WMS과 WMTS 서비스 발행
[OpenLayers] "FirstGIS/Professional Education Version 1.0"
OpenLayers5.3(OL5.3)/html/css/JavaScript로 처음 코딩하여 공유중인 GIS프로그램입니다.
먼저 결과물 프로그램 링크입니다.
>서비스바로가기
(위 링크를 PC용[IE에서는 흑백모드버튼 제거됨]이고, 모바일에서 실행하셔야 모바일용 UI모드로 실행합니다.
단, 모바일 기종에 따라 WebGL 사용한 함수지원여부로 브이월드3D가 구동 안될수도있습니다)
-이전글중에 "[OpenLayers] 표고/경사/향/음영 데이터 시각화"을 만들어보았습니다.
-그리고, 입지(인허가)분석을 위한 [전국 표고/경사/향/음영]을 만들었습니다.
![](https://t1.daumcdn.net/cfile/cafe/996A94355D555B9403)
![](https://t1.daumcdn.net/cfile/cafe/991A78355D555B9606)
*****************************************************************************************************
>이러한 대용량 Geo tif 데이터를 웹이나 GeoServer에서 서비스할 경우를 3가지로 해보았습니다.
1) QGIS를 사용해서 Tile로 레벨별 미리 만들어서 TMS레이어로 서비스하기
- 위성/항공사진을 전국 통으로 받았거나, 우리가람(하천안내지도) 처럼 특정 업무용 지도, 또는 도로/건물 등
벡터 수치지도로 별도의 스타일로 구성하여 백그라운드로 서비스할때 마노이 사용합니다.
- 타일맵을 만드는 툴은 많으나 편리상 QGIS의 QTiles(QGIS Python Plugins)을 사용하여 보았습니다.
- 3가지중에 제일 파르나, 미리만들어야하니(밤낮으로 돌려야하니) 시간과 용량이 많이 들어갑니다.
- 그리고 설치도 시간이 어마어마하게 들구요, 제일중요한건 갱신하는 유지보수비를 엄청 들어간다는겁니다.
2) GeoServer에서의 WMS서비스하기
- GeoServer에서 GeoTIFF 저장소를 만들어 등록합니다.
- 서버의 부하가 별로 없다면 원하는 지도영역을 한장의 이미지로 등록되는 방식이지만, 벡터지도의 WMS보다는
느린거 같습니다. 물론 레이어 생성창에서 "타일 캐시 설정"을 활성화하고, 타일 캐시/타일 레이어에서
GeoWebCache로 생성하면 WMTS에도 사용되지만 GeoServer에서는 통합적인 서비스로 속도 개선이 됩니다.
- 여러 축척에서 그때 그때마다 최상의 해상도를 서비스하고 설치 및 갱신시 유지보수가 편하지만, 서버 부하에
따라 서비스 속도를 장담하기 어렵다는 흠이 있습니다.
3) GeoServer에서의 WMTS서비스하기
- GeoServer 타일 캐시/타일 레이어에서 GeoWebCache로 서비스
- 물론, 미리 만들어 놓는것도 좋으나, 클라이언트들이 호출시 계속 캐시로 누적되는 방식이라 위 2가지의 장단점을
다 가지고 있습니다.
- 미리만든다면 위1번처럼 레벨별 타일로 만드는 시간도 많이 걸리고, 서버가 그동안 느려집니다.
그리고 갱신시에도 이런 작업을 계속 해야하는 유지보수 문제도 걸립니다. 변동이 심한 벡터데이터는 금물.
또한, QGIS 등 데스크탑 프로그램으로 만드는것보다 불안정하겠지요
- 미리 안만들면, 처음 서비스 개시일엔 느립니다.
그리고 큰문제로 WMS는 비동기식으로 서버가 결과를 제때 못주더라도 클라이언트는 잘 돌아갑니다.
그러나 WMTS는 서버가 실시간 타일을 만들고 보내주랴 부하가 걸려 타 서비스에도 영향을 주고,
클라이언트는 각각의 타일이니 몇개의 타임스케줄에 걸려 상당히 버벅거립니다.
- 이러한 단점으로 서버에서는 17레벨 이상을 만드는걸 권장하지 않구요(GeoServer에서는 20레벨이상이라지만,
전국 지도를 해보니 16정도가 좋습니다)
그리고, 클라이언트에서도 16레벨이상의 resolutions을 사용하지 않는게 좋습니다.
***************************************************************************************************
>그리고 OpenLayers에서 레이어 생성소스를 첨부하였습니다.
1) TMS레이어로 등록하기 new ol.layer.Tile({ visible: false, source: new ol.source.XYZ({ crossOrigin: 'anonymous', url: vworldHybridURL, }) }); |
2) WMS레이어로 등록하기 var korea_DEM = new ol.layer.Image({ id: "korea_DEM", name: "korea_DEM", layerName: "korea_DEM", source: new ol.source.ImageWMS({ ratio: 1, url: FGIS_WMSURL, params: { 'FORMAT': 'image/png', 'VERSION': '1.1.1', 'TRANSPARENT': 'TRUE', 'STYLES': '', 'TILED': 'TRUE', LAYERS: 'korea_dem', } }), opacity: 0.7, visible: false }); map.getLayers().insertAt(5, korea_DEM); |
3) WMTS레이어로 등록하기 var FGIS_WMTSURL = geoserverURL + 'gwc/service/wmts'; var gridsetName = 'EPSG:900913'; var gridNames = [ 'EPSG:900913:0', 'EPSG:900913:1', 'EPSG:900913:2', 'EPSG:900913:3', 'EPSG:900913:4' , 'EPSG:900913:5', 'EPSG:900913:6', 'EPSG:900913:7', 'EPSG:900913:8', 'EPSG:900913:9' , 'EPSG:900913:10', 'EPSG:900913:11', 'EPSG:900913:12', 'EPSG:900913:13', 'EPSG:900913:14' , 'EPSG:900913:15', 'EPSG:900913:16']; var resolutions = [ 156543.03390625, 78271.516953125, 39135.7584765625, 19567.87923828125, 9783.939619140625 , 4891.9698095703125, 2445.9849047851562, 1222.9924523925781, 611.4962261962891, 305.74811309814453 , 152.87405654907226, 76.43702827453613, 38.218514137268066, 19.109257068634033, 9.554628534317017 , 4.777314267158508, 2.388657133579254]; //, 1.194328566789627, 0.5971642833948135, 0.29858214169740677, 0.14929107084870338 var projection = new ol.proj.Projection({ code: 'EPSG:900913', units: 'm', axisOrientation: 'neu' }); params = { 'VERSION': '1.0.0', 'STYLE': "", 'TILEMATRIX': gridNames, 'TILEMATRIXSET': gridsetName, 'SERVICE': 'WMTS', 'FORMAT': 'image/png' }; var korea_DEM = new ol.layer.Tile({ id: "korea_DEM", name: "korea_DEM", layerName: "korea_DEM", opacity: 0.7, visible: false, source: new ol.source.WMTS({ url: FGIS_WMTSURL, layer: 'FGIS:korea_dem', matrixSet: params['TILEMATRIXSET'], format: params['FORMAT'], projection: projection, tileGrid: new ol.tilegrid.WMTS({ tileSize: [256,256], extent: [-2.003750834E7,-2.003750834E7,2.003750834E7,2.003750834E7], origin: [-2.003750834E7, 2.003750834E7], resolutions: resolutions, matrixIds: params['TILEMATRIX'] }), style: params['STYLE'], wrapX: true, VERSION: params['VERSION'] }) }); map.getLayers().insertAt(5, korea_DEM); |
1) QGIS를 사용해서 Tile로 레벨별 미리 만들어서 TMS레이어로 서비스하기
사용법은 인터넷에서 찾아보시면 됩니다. 실행도 간단합니다. 단, 서비스할 좌표계를 미리 설정(변경)하시고는게 좋습니다. 아니면 예전 브이월드/구글 좌표계에 네이버나/다음지도 중첩시키듯 좌표계에 따라 openlayers에 수많은 코딩을하시게 됩니다.
![](https://t1.daumcdn.net/cfile/cafe/995F32395D555C8035)
2) GeoServer에서의 WMS서비스하기
![](https://t1.daumcdn.net/cfile/cafe/9963DC355D555CFE2A)
![](https://t1.daumcdn.net/cfile/cafe/99FC11355D555CFF39)
3) GeoServer에서의 WMTS서비스하기
GeoServer 타일 캐시/타일 레이어에서 GeoWebCache로 서비스 발행.
![](https://t1.daumcdn.net/cfile/cafe/9940A3355D555CFF06)
GeoServer에서는 레이어등록시 타일캐시 활성화를 하면, WMS로 서비스중에도 아래와 같이 gwc폴더에 타일맵을 레벨별로 만들어 케시로 사용하고 속도를 내려고 서버가 노력하고 있습니다.
물론 WMTS서비스를 위해 적어도 15나 16레벨 단위는 미리 만들어 주는것도 좋습니다.(전국단위일때)
![](https://t1.daumcdn.net/cfile/cafe/9916B9355D555D0031)