Heatmap.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. class SkySceneryHeatmap {
  2. /*
  3. params = {
  4. ele:document.querySelector('.div-heatmap'),
  5. data:[
  6. {
  7. x:116, // 经度
  8. y:39, // 纬度
  9. value:4 // 强度值
  10. }
  11. ]
  12. }
  13. */
  14. constructor(viewer, params, yinqing) {
  15. this.viewer = viewer
  16. this.data = params.data;
  17. this.heatStyle = params.heatStyle;
  18. this.height = params.height;
  19. this.flyTo = params.flyTo;
  20. this.CesiumObject = yinqing
  21. this._init();
  22. }
  23. _init() {
  24. var eleObj = this._createEle();
  25. let heatmapParam = {
  26. blur: 0.85,
  27. gradient: { 0.4: 'blue', 0.6: 'green', 0.8: 'yellow', 0.9: 'red' },
  28. maxOpacity: 0.8,
  29. minOpacity: 0.1,
  30. radius: 20,
  31. }
  32. heatmapParam = Object.assign(heatmapParam, this.heatStyle);
  33. heatmapParam.container = eleObj.container;
  34. // 创建热力图
  35. var heatmapInstance = h337.create(heatmapParam);
  36. var obj = this._screenAArrange(this.data, eleObj.width, eleObj.height)
  37. var data = {
  38. max: obj.max,
  39. min: obj.min,
  40. data: obj.data
  41. };
  42. heatmapInstance.setData(data);
  43. var image = heatmapInstance._renderer.canvas.toDataURL("image/png")
  44. // 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" } }
  45. // 将热力图添加到球体上(生成的热力图canvas元素类名为heatmap-canvas)
  46. // var canvas = document.getElementsByClassName('heatmap-canvas');
  47. let rectangleParam = {
  48. coordinates: this.CesiumObject.Rectangle.fromDegrees(
  49. obj.lonMin,
  50. obj.latMin,
  51. obj.lonMax,
  52. obj.latMax,
  53. ),
  54. heightReference: this.CesiumObject.HeightReference.NONE,
  55. material: new this.CesiumObject.ImageMaterialProperty({
  56. image: image,
  57. transparent: true
  58. })
  59. }
  60. if (!isNaN(this.height)) {
  61. rectangleParam.height = this.height
  62. }
  63. this.heatmapEntity = this.viewer.entities.add({
  64. name: 'heatmap',
  65. rectangle: rectangleParam
  66. });
  67. if (this.flyTo) {
  68. this.viewer.camera.setView({
  69. destination: this.CesiumObject.Rectangle.fromDegrees(
  70. obj.lonMin,
  71. obj.latMin,
  72. obj.lonMax,
  73. obj.latMax
  74. )
  75. });
  76. }
  77. }
  78. _createEle() {
  79. if (document.querySelector(".div-heatmap") != null) {
  80. document.querySelector(".div-heatmap").remove();
  81. }
  82. let div = document.createElement("div");
  83. //为div创建属性class = "test"
  84. var divattr = document.createAttribute("class");
  85. divattr.value = "div-heatmap";
  86. //把属性class = "test"添加到div
  87. div.setAttributeNode(divattr);
  88. var style = document.createAttribute("style");
  89. div.setAttributeNode(style);
  90. div.style.width = "800px";
  91. div.style.height = "800px";
  92. this.viewer.container.appendChild(div)
  93. return {
  94. container: div,
  95. width: 800,
  96. height: 800,
  97. };
  98. }
  99. _screenAArrange(data, width, height) {
  100. var lonMin = data.sort(function (a, b) {
  101. return a.x - b.x // 从小到大
  102. })[0].x - 0.5
  103. var lonMax = data.sort(function (a, b) {
  104. return b.x - a.x // 从大到小
  105. })[0].x + 0.5
  106. var latMin = data.sort(function (a, b) {
  107. return a.y - b.y // 从小到大
  108. })[0].y - 0.5
  109. var latMax = data.sort(function (a, b) {
  110. return b.y - a.y // 从大到小
  111. })[0].y + 0.5
  112. var max = data.sort(function (a, b) {
  113. return b.value - a.value // 从大到小
  114. })[0].value
  115. var min = data.sort(function (a, b) {
  116. return a.value - b.value // 从大到小
  117. })[0].value
  118. var points = [];
  119. // 根据热力图图片范围,生成随机热力点和强度值
  120. for (var i = 0; i < data.length; i++) {
  121. var point = {
  122. // x: Math.floor((data[i].y - latMin) / (latMax - latMin) * width),
  123. // y: Math.floor((data[i].x - lonMin) / (lonMax - lonMin) * height),
  124. x: Math.floor((data[i].x - lonMin) / (lonMax - lonMin) * width),
  125. y: Math.floor((latMax - data[i].y) / (latMax - latMin) * height),
  126. value: data[i].value
  127. };
  128. // viewer.entities.add({ // 点
  129. // position: this.CesiumObject.Cartesian3.fromDegrees(data[i].x, data[i].y, 0),
  130. // name: "point",
  131. // point: {
  132. // color: this.CesiumObject.Color.RED,
  133. // pixelSize: 2
  134. // }
  135. // });
  136. points.push(point);
  137. }
  138. return {
  139. lonMin: lonMin,
  140. lonMax: lonMax,
  141. latMin: latMin,
  142. latMax: latMax,
  143. max: max,
  144. min: min,
  145. data: points
  146. }
  147. }
  148. remove() {
  149. if (this.heatmapEntity)
  150. this.viewer.entities.remove(this.heatmapEntity)
  151. }
  152. destroy() {
  153. this.remove();
  154. delete this.viewer
  155. delete this.data
  156. delete this.heatStyle
  157. delete this.height
  158. delete this.heatmapEntity
  159. delete this.flyTo
  160. // delete this.__proto__._init
  161. // delete this.__proto__._createEle
  162. // delete this.__proto__._screenAArrange
  163. // delete this.__proto__.remove
  164. // delete this.__proto__.destroy
  165. }
  166. resetData(data) {
  167. var eleObj = this._createEle();
  168. let heatmapParam = {
  169. blur: 0.85,
  170. gradient: { 0.4: 'blue', 0.6: 'green', 0.8: 'yellow', 0.9: 'red' },
  171. maxOpacity: 0.8,
  172. minOpacity: 0.1,
  173. radius: 20,
  174. }
  175. heatmapParam = Object.assign(heatmapParam, this.heatStyle);
  176. heatmapParam.container = eleObj.container;
  177. // 创建热力图
  178. var heatmapInstance = h337.create(heatmapParam);
  179. var obj = this._screenAArrange(data, eleObj.width, eleObj.height)
  180. var hdata = {
  181. max: obj.max,
  182. data: obj.data
  183. };
  184. heatmapInstance.setData(hdata);
  185. var image = heatmapInstance._renderer.canvas.toDataURL("image/png")
  186. if (!this.heatmapEntity) return;
  187. let rectangleParam = {
  188. coordinates: this.CesiumObject.Rectangle.fromDegrees(
  189. obj.lonMin,
  190. obj.latMin,
  191. obj.lonMax,
  192. obj.latMax,
  193. ),
  194. heightReference: this.CesiumObject.HeightReference.NONE,
  195. material: new this.CesiumObject.ImageMaterialProperty({
  196. image: image,
  197. transparent: true
  198. })
  199. }
  200. if (!isNaN(this.height)) {
  201. rectangleParam.height = this.height
  202. }
  203. this.heatmapEntity.rectangle = rectangleParam
  204. }
  205. }