123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- class SkySceneryHeatmap {
- /*
- params = {
- ele:document.querySelector('.div-heatmap'),
- data:[
- {
- x:116, // 经度
- y:39, // 纬度
- value:4 // 强度值
- }
- ]
- }
- */
- constructor(viewer, params, yinqing) {
- this.viewer = viewer
- this.data = params.data;
- this.heatStyle = params.heatStyle;
- this.height = params.height;
- this.flyTo = params.flyTo;
- this.CesiumObject = yinqing
- this._init();
- }
- _init() {
- var eleObj = this._createEle();
- let heatmapParam = {
- blur: 0.85,
- gradient: { 0.4: 'blue', 0.6: 'green', 0.8: 'yellow', 0.9: 'red' },
- maxOpacity: 0.8,
- minOpacity: 0.1,
- radius: 20,
- }
- heatmapParam = Object.assign(heatmapParam, this.heatStyle);
- heatmapParam.container = eleObj.container;
- // 创建热力图
- var heatmapInstance = h337.create(heatmapParam);
- var obj = this._screenAArrange(this.data, eleObj.width, eleObj.height)
- var data = {
- max: obj.max,
- min: obj.min,
- data: obj.data
- };
- heatmapInstance.setData(data);
- var image = heatmapInstance._renderer.canvas.toDataURL("image/png")
- // let t = { "maxOpacity": 0.8, "minOpacity": 0.1, "blur": 0.85, "radius": 25, "gradient": { "0.4": "blue", "0.6": "green", "0.8": "yellow", "0.9": "red" } }
- // 将热力图添加到球体上(生成的热力图canvas元素类名为heatmap-canvas)
- // var canvas = document.getElementsByClassName('heatmap-canvas');
- let rectangleParam = {
- coordinates: this.CesiumObject.Rectangle.fromDegrees(
- obj.lonMin,
- obj.latMin,
- obj.lonMax,
- obj.latMax,
- ),
- heightReference: this.CesiumObject.HeightReference.NONE,
- material: new this.CesiumObject.ImageMaterialProperty({
- image: image,
- transparent: true
- })
- }
- if (!isNaN(this.height)) {
- rectangleParam.height = this.height
- }
- this.heatmapEntity = this.viewer.entities.add({
- name: 'heatmap',
- rectangle: rectangleParam
- });
- if (this.flyTo) {
- this.viewer.camera.setView({
- destination: this.CesiumObject.Rectangle.fromDegrees(
- obj.lonMin,
- obj.latMin,
- obj.lonMax,
- obj.latMax
- )
- });
- }
- }
- _createEle() {
- if (document.querySelector(".div-heatmap") != null) {
- document.querySelector(".div-heatmap").remove();
- }
- let div = document.createElement("div");
- //为div创建属性class = "test"
- var divattr = document.createAttribute("class");
- divattr.value = "div-heatmap";
- //把属性class = "test"添加到div
- div.setAttributeNode(divattr);
- var style = document.createAttribute("style");
- div.setAttributeNode(style);
- div.style.width = "800px";
- div.style.height = "800px";
- this.viewer.container.appendChild(div)
- return {
- container: div,
- width: 800,
- height: 800,
- };
- }
- _screenAArrange(data, width, height) {
- var lonMin = data.sort(function (a, b) {
- return a.x - b.x // 从小到大
- })[0].x - 0.5
- var lonMax = data.sort(function (a, b) {
- return b.x - a.x // 从大到小
- })[0].x + 0.5
- var latMin = data.sort(function (a, b) {
- return a.y - b.y // 从小到大
- })[0].y - 0.5
- var latMax = data.sort(function (a, b) {
- return b.y - a.y // 从大到小
- })[0].y + 0.5
- var max = data.sort(function (a, b) {
- return b.value - a.value // 从大到小
- })[0].value
- var min = data.sort(function (a, b) {
- return a.value - b.value // 从大到小
- })[0].value
- var points = [];
- // 根据热力图图片范围,生成随机热力点和强度值
- for (var i = 0; i < data.length; i++) {
- var point = {
- // x: Math.floor((data[i].y - latMin) / (latMax - latMin) * width),
- // y: Math.floor((data[i].x - lonMin) / (lonMax - lonMin) * height),
- x: Math.floor((data[i].x - lonMin) / (lonMax - lonMin) * width),
- y: Math.floor((latMax - data[i].y) / (latMax - latMin) * height),
- value: data[i].value
- };
- // viewer.entities.add({ // 点
- // position: this.CesiumObject.Cartesian3.fromDegrees(data[i].x, data[i].y, 0),
- // name: "point",
- // point: {
- // color: this.CesiumObject.Color.RED,
- // pixelSize: 2
- // }
- // });
- points.push(point);
- }
- return {
- lonMin: lonMin,
- lonMax: lonMax,
- latMin: latMin,
- latMax: latMax,
- max: max,
- min: min,
- data: points
- }
- }
- remove() {
- if (this.heatmapEntity)
- this.viewer.entities.remove(this.heatmapEntity)
- }
- destroy() {
- this.remove();
- delete this.viewer
- delete this.data
- delete this.heatStyle
- delete this.height
- delete this.heatmapEntity
- delete this.flyTo
- // delete this.__proto__._init
- // delete this.__proto__._createEle
- // delete this.__proto__._screenAArrange
- // delete this.__proto__.remove
- // delete this.__proto__.destroy
- }
- resetData(data) {
- var eleObj = this._createEle();
- let heatmapParam = {
- blur: 0.85,
- gradient: { 0.4: 'blue', 0.6: 'green', 0.8: 'yellow', 0.9: 'red' },
- maxOpacity: 0.8,
- minOpacity: 0.1,
- radius: 20,
- }
- heatmapParam = Object.assign(heatmapParam, this.heatStyle);
- heatmapParam.container = eleObj.container;
- // 创建热力图
- var heatmapInstance = h337.create(heatmapParam);
- var obj = this._screenAArrange(data, eleObj.width, eleObj.height)
- var hdata = {
- max: obj.max,
- data: obj.data
- };
- heatmapInstance.setData(hdata);
- var image = heatmapInstance._renderer.canvas.toDataURL("image/png")
- if (!this.heatmapEntity) return;
- let rectangleParam = {
- coordinates: this.CesiumObject.Rectangle.fromDegrees(
- obj.lonMin,
- obj.latMin,
- obj.lonMax,
- obj.latMax,
- ),
- heightReference: this.CesiumObject.HeightReference.NONE,
- material: new this.CesiumObject.ImageMaterialProperty({
- image: image,
- transparent: true
- })
- }
- if (!isNaN(this.height)) {
- rectangleParam.height = this.height
- }
- this.heatmapEntity.rectangle = rectangleParam
- }
- }
|