mirror of
				https://github.com/jiawanlong/Cesium-Examples.git
				synced 2025-11-04 01:04:17 +00:00 
			
		
		
		
	
		
			
	
	
		
			113 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			113 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								var kopts = {
							 | 
						||
| 
								 | 
							
								  propname: "value", //值字段
							 | 
						||
| 
								 | 
							
								  krigingModel: 'exponential', //model还可选'gaussian','spherical'
							 | 
						||
| 
								 | 
							
								  krigingSigma2: 0,
							 | 
						||
| 
								 | 
							
								  krigingAlpha: 100,
							 | 
						||
| 
								 | 
							
								  alpha: 0.3,
							 | 
						||
| 
								 | 
							
								  // width: 0.0005,
							 | 
						||
| 
								 | 
							
								  colors: ["#006837", "#1a9850", "#66bd63", "#a6d96a", "#d9ef8b", "#ffffbf", "#fee08b",
							 | 
						||
| 
								 | 
							
								    "#fdae61", "#f46d43", "#d73027", "#a50026"
							 | 
						||
| 
								 | 
							
								  ],
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								//绘制kriging插值图
							 | 
						||
| 
								 | 
							
								var drawKriging = function (geo, polygons, options = {}) {
							 | 
						||
| 
								 | 
							
								  kopts = Object.assign(kopts, options);
							 | 
						||
| 
								 | 
							
								  if (kopts.colors && kopts.colorsNum) {
							 | 
						||
| 
								 | 
							
								    kopts.colors = getColor(kopts.colors, kopts.colorsNum);
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    kopts.colors = getColor(["#00A600", "#E6DD09", "#F2F2F2"], 100);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  var values = [],
							 | 
						||
| 
								 | 
							
								    lngs = [],
							 | 
						||
| 
								 | 
							
								    lats = [];
							 | 
						||
| 
								 | 
							
								  geo.features.forEach(feature => {
							 | 
						||
| 
								 | 
							
								    values.push(feature.properties[kopts.propname]);
							 | 
						||
| 
								 | 
							
								    lngs.push(feature.geometry.coordinates[0]);
							 | 
						||
| 
								 | 
							
								    lats.push(feature.geometry.coordinates[1]);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (values.length > 3) {
							 | 
						||
| 
								 | 
							
								    //获取面的矩形
							 | 
						||
| 
								 | 
							
								    var extent = {
							 | 
						||
| 
								 | 
							
								      xMin: 100000000,
							 | 
						||
| 
								 | 
							
								      yMin: 100000000,
							 | 
						||
| 
								 | 
							
								      xMax: -100000000,
							 | 
						||
| 
								 | 
							
								      yMax: -100000000
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    for (var i = 0; i < polygons.length; i++) {
							 | 
						||
| 
								 | 
							
								      for (var j = 0; j < polygons[i].length; j++) {
							 | 
						||
| 
								 | 
							
								        extent.xMin = Math.min(extent.xMin, polygons[i][j][0]);
							 | 
						||
| 
								 | 
							
								        extent.xMax = Math.max(extent.xMax, polygons[i][j][0]);
							 | 
						||
| 
								 | 
							
								        extent.yMin = Math.min(extent.yMin, polygons[i][j][1]);
							 | 
						||
| 
								 | 
							
								        extent.yMax = Math.max(extent.yMax, polygons[i][j][1]);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (!kopts.width) {
							 | 
						||
| 
								 | 
							
								      kopts.width = Math.round(Math.min((extent.xMax - extent.xMin), (extent.yMax - extent.yMin)) *
							 | 
						||
| 
								 | 
							
								        10000) / 10000 / 500;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    var canvas = document.createElement('canvas');
							 | 
						||
| 
								 | 
							
								    document.body.appendChild(canvas);
							 | 
						||
| 
								 | 
							
								    canvas.width = 5000;
							 | 
						||
| 
								 | 
							
								    canvas.height = parseInt(5000 / (extent.xMax - extent.xMin) * (extent.yMax - extent.yMin));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    //对数据集进行训练
							 | 
						||
| 
								 | 
							
								    let variogram = kriging.train(values, lngs, lats, kopts.krigingModel, kopts.krigingSigma2, kopts
							 | 
						||
| 
								 | 
							
								      .krigingAlpha);
							 | 
						||
| 
								 | 
							
								    //使用variogram对象使polygons描述的地理位置内的格网元素具备不一样的预测值,最后一个参数,是插值格点精度大小
							 | 
						||
| 
								 | 
							
								    var grid = kriging.grid(polygons, variogram, kopts.width); //  kriging.grid(polygons, variogram, width);
							 | 
						||
| 
								 | 
							
								    //将得到的格网grid渲染至canvas上
							 | 
						||
| 
								 | 
							
								    kriging.plot(canvas, grid, [extent.xMin, extent.xMax], [extent.yMin, extent.yMax], kopts.colors);
							 | 
						||
| 
								 | 
							
								    // kriging.plot(canvas, grid, xlim, ylim, colors);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var _r = drawHeatmapRect(canvas, extent);
							 | 
						||
| 
								 | 
							
								    return _r;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								//绘制图形到图上 
							 | 
						||
| 
								 | 
							
								function drawHeatmapRect(canvas, extent) {
							 | 
						||
| 
								 | 
							
								  var image = convertCanvasToImage(canvas);
							 | 
						||
| 
								 | 
							
								  var _Rectangle = viewer.scene.primitives.add(new Cesium.GroundPrimitive({
							 | 
						||
| 
								 | 
							
								    geometryInstances: new Cesium.GeometryInstance({
							 | 
						||
| 
								 | 
							
								      geometry: new Cesium.RectangleGeometry({
							 | 
						||
| 
								 | 
							
								        rectangle: Cesium.Rectangle.fromDegrees(extent.xMin, extent.yMin,
							 | 
						||
| 
								 | 
							
								          extent.xMax, extent.yMax),
							 | 
						||
| 
								 | 
							
								        vertexFormat: Cesium.EllipsoidSurfaceAppearance.VERTEX_FORMAT
							 | 
						||
| 
								 | 
							
								      })
							 | 
						||
| 
								 | 
							
								    }),
							 | 
						||
| 
								 | 
							
								    appearance: new Cesium.EllipsoidSurfaceAppearance({
							 | 
						||
| 
								 | 
							
								      aboveGround: false
							 | 
						||
| 
								 | 
							
								    }),
							 | 
						||
| 
								 | 
							
								    show: true
							 | 
						||
| 
								 | 
							
								  }));
							 | 
						||
| 
								 | 
							
								  _Rectangle.appearance.material = new Cesium.Material({
							 | 
						||
| 
								 | 
							
								    fabric: {
							 | 
						||
| 
								 | 
							
								      type: 'Image',
							 | 
						||
| 
								 | 
							
								      uniforms: {
							 | 
						||
| 
								 | 
							
								        color: {
							 | 
						||
| 
								 | 
							
								          alpha: kopts.alpha
							 | 
						||
| 
								 | 
							
								        },
							 | 
						||
| 
								 | 
							
								        image: image.src
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  return _Rectangle;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function convertCanvasToImage(canvas) {
							 | 
						||
| 
								 | 
							
								  var image = new Image();
							 | 
						||
| 
								 | 
							
								  image.src = canvas.toDataURL("image/png");
							 | 
						||
| 
								 | 
							
								  return image;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								//获取颜色
							 | 
						||
| 
								 | 
							
								function getColor(colors, num) {
							 | 
						||
| 
								 | 
							
								  var rainbow = new Rainbow();
							 | 
						||
| 
								 | 
							
								  rainbow.setSpectrum(...colors)
							 | 
						||
| 
								 | 
							
								  rainbow.setNumberRange(0, num)
							 | 
						||
| 
								 | 
							
								  var colorarr = [];
							 | 
						||
| 
								 | 
							
								  for (var i = 0; i < num; i++) {
							 | 
						||
| 
								 | 
							
								    colorarr.push("#" + rainbow.colourAt(i))
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return colorarr;
							 | 
						||
| 
								 | 
							
								}
							 |