UNPKG

kriging-contour

Version:

基于克里金插值算法,根据离散点位置及其权重,生成等值面矢量数据(GeoJSON格式)和栅格数据(Canvas绘制图片),这些数据在任何WebGIS客户端上都可通用展示。

157 lines (138 loc) 4.36 kB
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>克里金等值面展示示例</title> <link rel="stylesheet" href="https://openlayers.org/en/v4.6.5/css/ol.css" type="text/css"> <script src="https://openlayers.org/en/v4.6.5/build/ol.js"></script> <script src="../dist/kriging-contour.js"></script> <style> #map{ height:100%; width:100%; } </style> </head> <body> <button onclick="showKrigingVector()">克里金矢量(Vector)</button> <button onclick="showKrigingImage()">克里金图像(Image)</button> <div id="map" class="map"></div> <script> let params={ mapCenter:[118, 32], maxValue:100, krigingModel:'exponential',//'exponential','gaussian','spherical' krigingSigma2:0, krigingAlpha:100, canvasAlpha:0.9, colors:["#006837", "#1a9850", "#66bd63", "#a6d96a", "#d9ef8b", "#ffffbf","#fee08b", "#fdae61", "#f46d43", "#d73027", "#a50026"] }; //osm底图 let baseLayer = new ol.layer.Tile({ source: new ol.source.OSM() }); //测试点图层 var ptlayer=new ol.layer.Vector({ source: new ol.source.Vector(), zIndex:4 }); //生成测试数据 let dataset = { "type" : "FeatureCollection", "features" : [] }; for (let i = 0; i < 100; i++) { let feature={ "type" : "Feature", "properties" : { "level" : Math.random()*100 }, "geometry" : { "type" : "Point", "coordinates" : [params.mapCenter[0]+Math.random()*0.1-.05,params.mapCenter[1]+Math.random()*0.1-.05] } }; dataset.features.push(feature); } var format=new ol.format.GeoJSON(); ptlayer.getSource().addFeatures(format.readFeatures(dataset)); let map = new ol.Map({ target: 'map', layers: [baseLayer,ptlayer], view: new ol.View({ center: params.mapCenter, projection: 'EPSG:4326', zoom: 16 }) }); //克里金矢量等值面 let krigingVectorSource=new ol.source.Vector(); let krigingVectorLayer=new ol.layer.Vector({ source:krigingVectorSource, zIndex:3, style:function(feature,res){ //获取等值面分级的权重值 let _value=feature.get('contour_value'); //根据权重值,计算所在颜色渲染的区间 let level=parseInt(_value)/10; let color=params.colors[level]; let style=new ol.style.Style({ fill: new ol.style.Fill({ color: color }), stroke:new ol.style.Stroke({ color: color, width:3 }) }) return [style]; } }); map.addLayer(krigingVectorLayer); //克里金栅格等值面 let krigingCanvasLayer=new ol.layer.Image({ zIndex:2 }); //向map添加图层 map.addLayer(krigingCanvasLayer); //生成矢量等值面并渲染 function showKrigingVector(){ krigingCanvasLayer.setVisible(false); krigingVectorSource.clear(); krigingVectorLayer.setVisible(true); //生成克里金矢量等值面 let kriging_contours=kriging.getVectorContour(dataset,'level',{ model:'exponential', sigma2:0, alpha:100 },[0,10,20,30,40,50,60,70,80,90,100]); let features=format.readFeatures(kriging_contours); krigingVectorSource.addFeatures(features); } function showKrigingImage(){ krigingVectorLayer.setVisible(false); let imageSource=new ol.source.ImageCanvas({ canvasFunction:(extent, resolution, pixelRatio, size, projection) =>{ let canvas = document.createElement('canvas'); canvas.width = size[0]; canvas.height = size[1]; canvas.style.display='block'; //设置canvas透明度 canvas.getContext('2d').globalAlpha=params.canvasAlpha; //使用分层设色渲染 kriging.drawCanvasContour(dataset,'level',{ model:'exponential', sigma2:0, alpha:100 },canvas,[extent[0],extent[2]],[extent[1],extent[3]],params.colors); return canvas; }, projection: 'EPSG:4326' }); krigingCanvasLayer.setSource(imageSource); krigingCanvasLayer.setVisible(true); } </script> </body> </html>