|
[OpenLayers] 보간방법(Comparing interpolation methods) 적용
지난글에서 여러분석기법을 구현해보았습니다.
이번에는 여러 보간방법중 크게 2가지로 구현을 해보았습니다.
QGIS에서 보간 Plug에서 "역거리 가중보간(IDW)"와 "삼각형분할보간(TIN)"으로 구분하여 사용합니다.
통상 밀도 분석을 사용하여 프로젝트에 맞게 개발하였는데, 이번 프로젝트에서 다양한 분석기법 모듈을 적용해달라는 요청으로 크리깅도 구현하게 되어 검색을 통해 찾아 구현해보았습니다. (https://github.com/oeo4b/kriging.js)
보간은 제한된 수의 샘플 데이터 포인트에서 래스터의 셀 값을 예측합니다. 고도, 강우, 화학 물질 농도, 소음 수준 등과 같은 지리적 위치 데이터에 대해 알려지지 않은 값을 예측하는 데 사용할 수 있습니다.
1.밀도(Heatmap)분석 : IDW(Inverse Distance Weighted) 보간기법
IDW (역 거리 가중) 도구 보간 방법을 사용하는 각각의 처리 셀의 주변의 샘플 데이터 포인트의 값을 평균하여 추정 셀 값. 포인트가 계산되는 셀의 중심에 가까울수록 평균화 프로세스에 더 많은 영향을 미치거나 가중됩니다.
2.TIN분석 : 크리깅(Kriging) 보간기법
Kriging 은 z- 값을 갖는 흩어진 점 세트에서 추정 표면을 생성하는 고급 지질 통계 절차입니다. 다른 보간법보다 출력 표면 생성을위한 최상의 추정 방법을 선택하기 전에 z- 값으로 표현되는 현상의 공간 거동에 대한 철저한 조사를 수행해야합니다.
그외
Natural neighbour
Natural Neighbor interpolation은 쿼리 지점에서 입력 샘플의 가장 가까운 부분 집합을 찾아 비례 영역을 기준으로 가중치를 적용하여 값을 보간합니다 (Sibson, 1981). Sibson 또는 "area-stealing"보간이라고도합니다.
Spline
스플라인 도구 추정 값은 수학 함수를 사용하는 것이 보간 방법을 사용하는 최소화 전체 표면 곡률 정확히 입력 포인트를 통과하는 매끄러운 표면 결과.
Spline with Barriers
방벽 스플라인 도구에 사용되는 기술과 유사한 방법을 사용하여 스플라인 주요 차이점이 도구 명예 불연속 입력 장벽 입력 점 데이터를 모두 부호화하는 것이 되 가진 도구.
Topo to Raster
래스터 토포 및 파일에 의해 래스터 토포 툴은 특히 더 가깝게 자연 배수 표면과 잘 보존 입력 윤곽 데이터로부터 둘 능선 스트림 네트워크를 나타내는 표면을 생성하기위한 보간 방법을 사용한다.
사용 된 알고리즘은 호주 국립 대학교 의 허친슨 (Hutchinson) 등이 개발 한 ANUDEM의 알고리즘을 기반으로합니다 .
Trend
트렌드 는 수학적 함수 (다항식)에 의해 정의 된 매끄러운 표면을 입력 샘플 포인트에 맞추는 전역 다항식 보간입니다. 추세 표면은 점차 변화하고 데이터의 대략적인 패턴을 캡처합니다.
주요소스
1.밀도(Heatmap)분석 : IDW(Inverse Distance Weighted) 보간기법
두가지로 가중치필드 적용과 미적용으로 사용합니다.
var HeatmapAnalysis = new function() { //메인맵, 생성할헤이어명, 서버URL, 서버레이어명, 반경범위(픽셀), 흐려지는범위(픽셀), 가중치필드명(null일경우 개수), //가중치범위 최대/최소값, 투명도 this.CreateHeatmaplayer = function (_MainMap, _LayerName, _geoserverURL, _geoserverLayer, _radius, _blur, _weightField, _weightMax, _weightMin, _opacity){ //동일명의 레이어 제거 var Layer = _MainMap.getLayers().getArray().filter(function(item){ return item.values_.layerName === _LayerName; }); if(Layer && (Layer.length > 0)) _MainMap.removeLayer(Layer[0]); //레이어생성 var _workspacename = _geoserverLayer.substring(0, _geoserverLayer.indexOf(":")) var Search_URL = _geoserverURL + "/" + _workspacename + "/ows?service=WFS&version=1.0.0&request=GetFeature&typeName="+ _geoserverLayer +"&outputFormat=application/json"; var heatmap = new ol.layer.Heatmap({ id: _LayerName, name: _LayerName, layerName: _LayerName, renderMode: 'image', source: new ol.source.Vector({ projection : 'EPSG:5179', url: Search_URL, format: new ol.format.GeoJSON(), crossOrigin: 'anonymous', }), weight: weight_function, gradient: gradientColor, opacity: 0.8, radius: _radius, blur: _blur, shadow: 250, dissipating: true, maxIntensity: 10, crossOrigin: 'anonymous', opacity: _opacity }); ////////////////// function weight_function(feature){ var weightProperty = 1; if(_weightField){ weightProperty = feature.get(_weightField); weightProperty = ((weightProperty - _weightMin)) / (_weightMax - _weightMin); } return weightProperty; } ////////////////// return heatmap; } ///////////////////////////////////////////////////////////////////////////////// //색상표만들기 var ColorMapEntry = [ {rating:1, color:"#0571b0", color2:"#3f007d"}, {rating:2, color:"#4396c5", color2:"#481185"}, {rating:3, color:"#82bcd9", color2:"#52238d"}, {rating:4, color:"#b4d6e7", color2:"#593194"}, {rating:5, color:"#ffff00", color2:"#603e9a"}, {rating:6, color:"#FFC90E", color2:"#674aa0"}, {rating:7, color:"#f5c1a9", color2:"#6f5ba8"}, {rating:8, color:"#f09377", color2:"#796fb3"}, {rating:9, color:"#dd494b", color2:"#8380bc"}, {rating:10, color:"#ca0020", color2:"#8e8ac1"} ]; var gradientColor = new Array(); for(var j=0; j<10; j++) { gradientColor[j] = "#F"+(j+5).toString(16)+"0000"; } for(var i=0; i< ColorMapEntry.length; i++) { gradientColor[10+ColorMapEntry.length-i-1] = ColorMapEntry[i].color; } } |
2.TIN분석 : 크리깅(Kriging) 보간기법
var KrigingAnalysis = new function() { //메인맵, 생성할헤이어명, 서버URL, 서버레이어명, 가중치필드명, 보간방법, 투명도 this.CreateKriginglayer = function (_MainMap, _LayerName, _geoserverURL, _geoserverLayer, _weightField, _krigingModel, _opacity){ //동일명의 레이어 제거 var Layer = _MainMap.getLayers().getArray().filter(function(item){ return item.values_.layerName === _LayerName; }); if(Layer && (Layer.length > 0)) _MainMap.removeLayer(Layer[0]); ///////////////////////////////////////////////////////////////////// //옵션:색상표만들기 var params = { maxValue: 100, krigingModel: _krigingModel, //보간방법 : exponential(지수), gaussian(가우스), spherical(구형) krigingSigma2: 0, krigingAlpha: 100, canvasAlpha: 1,//_opacity, colors: ["#006837", "#1a9850", "#66bd63", "#a6d96a", "#d9ef8b", "#ffffbf", "#fee08b", "#fdae61", "#f46d43", "#d73027", "#a50026"] }; var selectedFeatures = []; var grid = null; //레이어생성 var Kriginglayer = new ol.layer.Image({ id: _LayerName, name: _LayerName, layerName: _LayerName, source: new ol.source.ImageCanvas({ canvasFunction: function canvasFunction(extent, resolution, pixelRatio, size, projection) { if(!grid){ //지도 이동시 느려서 한번만 실행하게함 selectedFeatures = []; var _url = _geoserverURL + '/wfs?service=WFS&version=1.1.0&request=GetFeature' + '&typename=' + _geoserverLayer + '&' + 'outputFormat=application/json&srsname=EPSG:5179&' + 'bbox=' + extent.join(',') + ',EPSG:5179'; CALL_XMLHTTP(_url, Call_back); } if(grid){ var canvas = document.createElement('canvas'); canvas.width = size[0]; canvas.height = size[1]; canvas.style.display = 'block'; canvas.getContext('2d').globalAlpha = params.canvasAlpha; kriging.plot(canvas, grid, [extent[0], extent[2]], [extent[1], extent[3]], params.colors); return canvas; } }, projection: 'EPSG:5179', }), opacity: _opacity }); function Call_back(item_data){ var _features = (new ol.format.GeoJSON()).readFeatures(item_data); if(_features && _features.length > 0){ var extent = _MainMap.getView().calculateExtent(_MainMap.getSize()); _features.forEach(function(feature){ if(ol.extent.extend(extent,feature.getGeometry().getExtent()))selectedFeatures.push(feature); }); if(selectedFeatures.length > 0){ var extent = selectedFeatures[0].getGeometry().getExtent().slice(0); selectedFeatures.forEach(function(feature){ ol.extent.extend(extent,feature.getGeometry().getExtent())} ); if(selectedFeatures.length > 1000) selectedFeatures.length = 1000; //갯수제한 drawKriging(extent) } } } /////////////////////////////////////////////////////////////////////////////////////// function drawKriging(extent) { var values = [], lngs = [], lats = []; selectedFeatures.forEach(function (feature) { values.push(feature.get(_weightField)); lngs.push(feature.values_.geometry.flatCoordinates[0]); lats.push(feature.values_.geometry.flatCoordinates[1]); }); if (values.length > 3) { var variogram = kriging.train(values, lngs, lats, params.krigingModel, params.krigingSigma2, params.krigingAlpha); var polygons = []; polygons.push([[extent[0], extent[1]], [extent[0], extent[3]], [extent[2], extent[3]], [extent[2], extent[1]]]); grid = kriging.grid(polygons, variogram, (extent[2] - extent[0]) / 200); } Kriginglayer.getSource().dispatchEvent('change'); }; return Kriginglayer; } /////////////////////////////////////////////////////////////////// function CALL_XMLHTTP(reqUrl, Call_back, Call_fail) { try{ $.ajax({ url: reqUrl, type: 'GET', //contentType: 'application/xml', cache: false, success:function(data) { Call_back(JSON.stringify(data)); }, error : function(error) { if(Call_fail)Call_fail(error); } }); }catch (e){ } } } |
자주사용하는 분석기능으로 정리해봅니다
1) 밀도(Heatmap)분석 : IDW(Inverse Distance Weighted) 보간기법, 가중치필드명이 null일경우 개수로 분석
2) TIN 보간 분석 : 크리깅(Kriging) 보간기법
3) 그리드분석(육각셀): 가중치필드명이 null일경우 개수로 분석, 스타일(gradient/color/point)
4) range rendering(주제도): 가중치필드명이 null일경우 단색으로 가시화, 점/선/면 레이어 가능
5) 밀집분석(clusterinter): 클러스터 거리(픽셀)
6) Buffering분석: 버퍼링거리(미터), 점/선/면 레이어 가능
자주사용하는 공간연산기능으로 정리해봅니다
1.Buffering(버퍼링)
2.intersection(교집합)
3.Symmetrical Difference (대칭차이)
4.Union(Merge)(합집합)
5.Dissolve(Merge)(합집합)
|