Vue中使用Kriging.js做克里金插值图

这个,我完全是照抄大佬的

参考链接:https://blog.csdn.net/weixin_40184249/article/details/90521127

addKriging() {
      let _this = this
      let params = {
        mapCenter: [107.249894, 29.99305],
        krigingModel: 'exponential', //model还可选'gaussian','spherical'
        krigingSigma2: 0,
        krigingAlpha: 226,
        canvasAlpha: 0.75, //canvas图层透明度
        colors: [
          '#00A600',
          '#01A600',
          '#03A700',
          '#04A700',
          '#05A800',
          '#07A800',
          '#08A900',
          '#09A900',
          '#0BAA00',
          '#0CAA00',
          '#0DAB00',
          '#0FAB00',
          '#10AC00',
          '#12AC00',
          '#13AD00',
          '#14AD00',
          '#16AE00',
          '#17AE00',
          '#19AF00',
          '#1AAF00',
          '#1CB000',
          '#1DB000',
          '#1FB100',
          '#20B100',
          '#22B200',
          '#23B200',
          '#25B300',
          '#26B300',
          '#28B400',
          '#29B400',
          '#2BB500',
          '#2CB500',
          '#2EB600',
          '#2FB600',
          '#31B700',
          '#33B700',
          '#34B800',
          '#36B800',
          '#37B900',
          '#39B900',
          '#3BBA00',
          '#3CBA00',
          '#3EBB00',
          '#3FBB00',
          '#41BC00',
          '#43BC00',
          '#44BD00',
          '#46BD00',
          '#48BE00',
          '#49BE00',
          '#4BBF00',
          '#4DBF00',
          '#4FC000',
          '#50C000',
          '#52C100',
          '#54C100',
          '#55C200',
          '#57C200',
          '#59C300',
          '#5BC300',
          '#5DC400',
          '#5EC400',
          '#60C500',
          '#62C500',
          '#64C600',
          '#66C600',
          '#67C700',
          '#69C700',
          '#6BC800',
          '#6DC800',
          '#6FC900',
          '#71C900',
          '#72CA00',
          '#74CA00',
          '#76CB00',
          '#78CB00',
          '#7ACC00',
          '#7CCC00',
          '#7ECD00',
          '#80CD00',
          '#82CE00',
          '#84CE00',
          '#86CF00',
          '#88CF00',
          '#8AD000',
          '#8BD000',
          '#8DD100',
          '#8FD100',
          '#91D200',
          '#93D200',
          '#95D300',
          '#97D300',
          '#9AD400',
          '#9CD400',
          '#9ED500',
          '#A0D500',
          '#A2D600',
          '#A4D600',
          '#A6D700',
          '#A8D700',
          '#AAD800',
          '#ACD800',
          '#AED900',
          '#B0D900',
          '#B2DA00',
          '#B5DA00',
          '#B7DB00',
          '#B9DB00',
          '#BBDC00',
          '#BDDC00',
          '#BFDD00',
          '#C2DD00',
          '#C4DE00',
          '#C6DE00',
          '#C8DF00',
          '#CADF00',
          '#CDE000',
          '#CFE000',
          '#D1E100',
          '#D3E100',
          '#D6E200',
          '#D8E200',
          '#DAE300',
          '#DCE300',
          '#DFE400',
          '#E1E400',
          '#E3E500',
          '#E6E600',
          '#E6E402',
          '#E6E204',
          '#E6E105',
          '#E6DF07',
          '#E6DD09',
          '#E6DC0B',
          '#E6DA0D',
          '#E6D90E',
          '#E6D710',
          '#E6D612',
          '#E7D414',
          '#E7D316',
          '#E7D217',
          '#E7D019',
          '#E7CF1B',
          '#E7CE1D',
          '#E7CD1F',
          '#E7CB21',
          '#E7CA22',
          '#E7C924',
          '#E8C826',
          '#E8C728',
          '#E8C62A',
          '#E8C52B',
          '#E8C42D',
          '#E8C32F',
          '#E8C231',
          '#E8C133',
          '#E8C035',
          '#E8BF36',
          '#E9BE38',
          '#E9BD3A',
          '#E9BC3C',
          '#E9BB3E',
          '#E9BB40',
          '#E9BA42',
          '#E9B943',
          '#E9B945',
          '#E9B847',
          '#E9B749',
          '#EAB74B',
          '#EAB64D',
          '#EAB64F',
          '#EAB550',
          '#EAB552',
          '#EAB454',
          '#EAB456',
          '#EAB358',
          '#EAB35A',
          '#EAB35C',
          '#EBB25D',
          '#EBB25F',
          '#EBB261',
          '#EBB263',
          '#EBB165',
          '#EBB167',
          '#EBB169',
          '#EBB16B',
          '#EBB16C',
          '#EBB16E',
          '#ECB170',
          '#ECB172',
          '#ECB174',
          '#ECB176',
          '#ECB178',
          '#ECB17A',
          '#ECB17C',
          '#ECB17E',
          '#ECB27F',
          '#ECB281',
          '#EDB283',
          '#EDB285',
          '#EDB387',
          '#EDB389',
          '#EDB38B',
          '#EDB48D',
          '#EDB48F',
          '#EDB591',
          '#EDB593',
          '#EDB694',
          '#EEB696',
          '#EEB798',
          '#EEB89A',
          '#EEB89C',
          '#EEB99E',
          '#EEBAA0',
          '#EEBAA2',
          '#EEBBA4',
          '#EEBCA6',
          '#EEBDA8',
          '#EFBEAA',
          '#EFBEAC',
          '#EFBFAD',
          '#EFC0AF',
          '#EFC1B1',
          '#EFC2B3',
          '#EFC3B5',
          '#EFC4B7',
          '#EFC5B9',
          '#EFC7BB',
          '#F0C8BD',
          '#F0C9BF',
          '#F0CAC1',
          '#F0CBC3',
          '#F0CDC5',
          '#F0CEC7',
          '#F0CFC9',
          '#F0D1CB',
          '#F0D2CD',
          '#F0D3CF',
          '#F1D5D1',
          '#F1D6D3',
          '#F1D8D5',
          '#F1D9D7',
          '#F1DBD8',
          '#F1DDDA',
          '#F1DEDC',
          '#F1E0DE',
          '#F1E2E0',
          '#F1E3E2',
          '#F2E5E4',
          '#F2E7E6',
          '#F2E9E8',
          '#F2EBEA',
          '#F2ECEC',
          '#F2EEEE',
          '#F2F0F0',
          '#F2F2F2',
        ],
      }
    // 裁切边界 let coord = [ [ [117.315375, 40.181212], [117.367916, 40.135762], [116.751758, 40.002595], [116.754136, 39.870341], [116.913383, 39.804999], [116.901858, 39.680614], [116.788145, 39.56255], [116.535646, 39.590346], [116.392103, 39.491124], [116.4293, 39.433841], [116.387072, 39.417336], [116.237232, 39.476253], [116.172242, 39.578854], [115.728745, 39.479123], [115.610225, 39.588658], [115.508537, 39.59137], [115.416399, 39.733407], [115.416624, 39.776734], [115.550565, 39.772964], [115.408433, 40.015829], [115.85422, 40.144999], [115.922315, 40.216777], [115.708758, 40.499032], [115.89819, 40.585919], [116.03778, 40.577909], [116.208725, 40.741562], [116.454984, 40.739689], [116.297615, 40.910402], [116.43816, 40.870116], [116.405424, 40.94854], [116.537137, 40.9661], [116.621495, 41.057333], [116.703349, 40.853574], [116.93405, 40.675155], [117.454502, 40.647216], [117.387854, 40.533274], [117.166811, 40.503979], [117.164198, 40.373887], [117.315375, 40.181212], ], ]
    // 数据源 var data = { features: [ { attributes: { FID: 0, id: 1, name: 'Beijing US Embassy', x: 116.468, y: 39.954999999999998, z: 46, xu: 454558.72859999997, yu: 4422898.159, }, geometry: { x: 116.468, y: 39.954999999999998, }, }, { attributes: { FID: 1, id: 2, name: 'Temple of Heaven', x: 116.407, y: 39.886000000000003, z: 36, xu: 449297.45990000002, yu: 4415272.716, }, geometry: { x: 116.407, y: 39.886000000000003, }, }, { attributes: { FID: 2, id: 3, name: 'Haidian Beijing Botanical Garden', x: 116.20699999999999, y: 40.002000000000002, z: 40, xu: 432311.35320000001, yu: 4428280.3169999998, }, geometry: { x: 116.20699999999999, y: 40.002000000000002, }, }, { attributes: { FID: 3, id: 4, name: 'Chaoyang Olympic Sports Center116.397', x: 116.39700000000001, y: 39.981999999999999, z: 43, xu: 448514.42090000003, yu: 4425933.4840000002, }, geometry: { x: 116.39700000000001, y: 39.981999999999999, }, }, { attributes: { FID: 4, id: 5, name: 'Chaoyang Agricultural Exhibition Hall', x: 116.461, y: 39.936999999999998, z: 52, xu: 453948.74660000001, yu: 4420903.926, }, geometry: { x: 116.461, y: 39.936999999999998, }, }, { attributes: { FID: 5, id: 6, name: 'Liangxiang', x: 116.136, y: 39.741999999999997, z: 123, xu: 425971.88909999997, yu: 4399479.2439999999, }, geometry: { x: 116.136, y: 39.741999999999997, }, }, { attributes: { FID: 6, id: 7, name: 'Fengtai Yungang', x: 116.146, y: 39.823999999999998, z: 85, xu: 426915.51539999997, yu: 4408572.0729999999, }, geometry: { x: 116.146, y: 39.823999999999998, }, }, { attributes: { FID: 7, id: 8, name: 'Shunyi New Town', x: 116.655, y: 40.127000000000002, z: 154, xu: 470605.50309999997, yu: 4441910.1670000004, }, geometry: { x: 116.655, y: 40.127000000000002, }, }, { attributes: { FID: 8, id: 12, name: 'Donggaocun Zhen', x: 117.12, y: 40.100000000000001, z: 172, xu: 510228.20750000002, yu: 4438863.2359999996, }, geometry: { x: 117.12, y: 40.100000000000001, }, }, { attributes: { FID: 9, id: 13, name: 'Tongzhou New Town', x: 116.663, y: 39.886000000000003, z: 216, xu: 471185.97159999999, yu: 4415158.7980000004, }, geometry: { x: 116.663, y: 39.886000000000003, }, }, { attributes: { FID: 10, id: 14, name: 'Huangcunzhen', x: 116.404, y: 39.718000000000004, z: 226, xu: 448916.78909999999, yu: 4396628.5209999997, }, geometry: { x: 116.404, y: 39.718000000000004, }, }, { attributes: { FID: 11, id: 15, name: 'BDA', x: 116.506, y: 39.795000000000002, z: 216, xu: 457706.38530000002, yu: 4405121.3250000002, }, geometry: { x: 116.506, y: 39.795000000000002, }, }, { attributes: { FID: 12, id: 16, name: 'Yufazhen', x: 116.3, y: 39.520000000000003, z: 204, xu: 439831.65490000002, yu: 4374718.0180000002, }, geometry: { x: 116.3, y: 39.520000000000003, }, }, { attributes: { FID: 13, id: 17, name: 'Yongledianzhen', x: 116.783, y: 39.712000000000003, z: 198, xu: 481399.35399999999, yu: 4395815.3370000003, }, geometry: { x: 116.783, y: 39.712000000000003, }, }, { attributes: { FID: 14, id: 18, name: 'Xianghe EPA', x: 117.009, y: 39.765999999999998, z: 204, xu: 500770.85320000001, yu: 4401786.0719999997, }, geometry: { x: 117.009, y: 39.765999999999998, }, }, { attributes: { FID: 15, id: 19, name: 'Badaling Northwest', x: 115.988, y: 40.365000000000002, z: 46, xu: 414076.95390000002, yu: 4468761.409, }, geometry: { x: 115.988, y: 40.365000000000002, }, }, { attributes: { FID: 16, id: 20, name: 'East Fourth Ring Road', x: 116.483, y: 39.939, z: 181, xu: 455829.68479999999, yu: 4421114.7860000003, }, geometry: { x: 116.483, y: 39.939, }, }, { attributes: { FID: 17, id: 21, name: 'Yanqing town', x: 115.97199999999999, y: 40.453000000000003, z: 59, xu: 412832.08510000003, yu: 4478545.159, }, geometry: { x: 115.97199999999999, y: 40.453000000000003, }, }, { attributes: { FID: 18, id: 22, name: 'Miyun Reservoir', x: 116.911, y: 40.499000000000002, z: 63, xu: 492458.57429999998, yu: 4483147.5360000003, }, geometry: { x: 116.911, y: 40.499000000000002, }, }, { attributes: { FID: 19, id: 23, name: 'Haidian Wanliu', x: 116.28700000000001, y: 39.987000000000002, z: 180, xu: 439126.71720000001, yu: 4426557.75, }, geometry: { x: 116.28700000000001, y: 39.987000000000002, }, }, { attributes: { FID: 20, id: 24, name: 'Yongdingmen Inner St', x: 116.39400000000001, y: 39.875999999999998, z: 196, xu: 448178.40250000003, yu: 4414170.284, }, geometry: { x: 116.39400000000001, y: 39.875999999999998, }, }, { attributes: { FID: 21, id: 25, name: 'Jianshe Road', x: 117.304, y: 39.719000000000001, z: 55, xu: 526055.42509999999, yu: 4396613.8959999997, }, geometry: { x: 117.304, y: 39.719000000000001, }, }, { attributes: { FID: 22, id: 26, name: 'Ligong, Chengde', x: 117.938, y: 41.011000000000003, z: 70, xu: 578874.61600000004, yu: 4540401.8559999997, }, geometry: { x: 117.938, y: 41.011000000000003, }, }, { attributes: { FID: 23, id: 27, name: 'Fengning County City Hall', x: 116.652, y: 41.215000000000003, z: 59, xu: 470827.95390000002, yu: 4562682.9199999999, }, geometry: { x: 116.652, y: 41.215000000000003, }, }, { attributes: { FID: 24, id: 28, name: 'Xiahuayuan EPA', x: 115.29600000000001, y: 40.508000000000003, z: 61, xu: 355627.29269999999, yu: 4485537.4510000004, }, geometry: { x: 115.29600000000001, y: 40.508000000000003, }, }, { attributes: { FID: 25, id: 29, name: 'Yuxian Secondary School', x: 114.596, y: 39.845999999999997, z: 61, xu: 294324.1188, yu: 4413430.4780000001, }, geometry: { x: 114.596, y: 39.845999999999997, }, }, { attributes: { FID: 26, id: 30, name: 'Zhouzhou Monitoring Stations', x: 116.03400000000001, y: 39.491999999999997, z: 80, xu: 416933.99089999998, yu: 4371822.0190000003, }, geometry: { x: 116.03400000000001, y: 39.491999999999997, }, }, { attributes: { FID: 27, id: 31, name: 'Guan Party School, Langfang', x: 116.30500000000001, y: 39.445, z: 70, xu: 440197.23119999998, yu: 4366391.0480000004, }, geometry: { x: 116.30500000000001, y: 39.445, }, }, { attributes: { FID: 28, id: 32, name: 'Guyuan County welfare', x: 115.681, y: 41.667999999999999, z: 63, xu: 390196.44390000001, yu: 4613756.0429999996, }, geometry: { x: 115.681, y: 41.667999999999999, }, }, ], } let WFSVectorSource = new VectorSource() let WFSVectorLayer = new LayerVec({ source: WFSVectorSource, }) _this.map.addLayer(WFSVectorLayer) for (let i = 0; i
< data.features.length; i++) { let feature = new Feature({ geometry: new Point([data.features[i].attributes.x, data.features[i].attributes.y]), value: data.features[i].attributes.z, }) feature.setStyle( new Style({ image: new Circle({ radius: 6, fill: new Fill({ color: '#00F', }), }), }), ) WFSVectorSource.addFeature(feature) } let clipgeom = new Polygon(coord) //绘制kriging插值图 let drawKriging = function(extent) { let values = [], lngs = [], lats = [] WFSVectorSource.forEachFeature(function(feature) { values.push(feature.getProperties().value) lngs.push(feature.getGeometry().getCoordinates()[0]) lats.push(feature.getGeometry().getCoordinates()[1]) }) if (values.length > 3) { let letiogram = kriging.train( values, lngs, lats, params.krigingModel, params.krigingSigma2, params.krigingAlpha, ) let ex = clipgeom.getExtent() let grid = kriging.grid(coord, letiogram, (ex[2] - ex[0]) / 200) //移除已有图层 if (_this.canvasLayer !== null) { _this.map.removeLayer(_this.canvasLayer) } //创建新图层 _this.canvasLayer = new Image({ source: new 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.plot(canvas, grid, [extent[0], extent[2]], [extent[1], extent[3]], params.colors) return canvas }, projection: 'EPSG:4326', }), }) //向map添加图层 _this.map.addLayer(_this.canvasLayer) _this.onKriging = false _this.$message({ type: 'success', message: '开启热力图成功!', }) } else { alert('样点少,无法插值') } } //首次加载,自动渲染一次差值图 let extent = clipgeom.getExtent() drawKriging(extent) },

这是demo,实际使用过程中,需要在data中定义map,canvasLayer为null,地图为openlayers,需要安装openlayers, npm i ol --save

Kriging.js地址:https://blog-static.cnblogs.com/files/lyt520/kriging.js

原文地址:https://www.cnblogs.com/lyt520/p/14096856.html