shuishen
2023-05-06 8c4f30306fb7be6627226cb04d66fb326731374b
热力图添加
4 files modified
2 files added
995 ■■■■■ changed files
public/depend/heatmap.min.js 9 ●●●●● patch | view | raw | blame | history
public/index.html 4 ●●● patch | view | raw | blame | history
src/components/map/index.vue 58 ●●●● patch | view | raw | blame | history
src/utils/CesiumHeatmap.js 854 ●●●●● patch | view | raw | blame | history
src/utils/turfPolygon.js 8 ●●●● patch | view | raw | blame | history
src/views/policeInfor/index.vue 62 ●●●●● patch | view | raw | blame | history
public/depend/heatmap.min.js
New file
@@ -0,0 +1,9 @@
/*
 * heatmap.js v2.0.0 | JavaScript Heatmap Library
 *
 * Copyright 2008-2014 Patrick Wied <heatmapjs@patrick-wied.at> - All rights reserved.
 * Dual licensed under MIT and Beerware license
 *
 * :: 2015-07-19 15:42
 */
(function (a, b, c) { if (typeof module !== "undefined" && module.exports) { module.exports = c() } else if (typeof define === "function" && define.amd) { define(c) } else { b[a] = c() } })("h337", this, function () { var a = { defaultRadius: 40, defaultRenderer: "canvas2d", defaultGradient: { .25: "rgb(0,0,255)", .55: "rgb(0,255,0)", .85: "yellow", 1: "rgb(255,0,0)" }, defaultMaxOpacity: 1, defaultMinOpacity: 0, defaultBlur: .85, defaultXField: "x", defaultYField: "y", defaultValueField: "value", plugins: {} }; var b = function h () { var b = function d (a) { this._coordinator = {}; this._data = []; this._radi = []; this._min = 0; this._max = 1; this._xField = a["xField"] || a.defaultXField; this._yField = a["yField"] || a.defaultYField; this._valueField = a["valueField"] || a.defaultValueField; if (a["radius"]) { this._cfgRadius = a["radius"] } }; var c = a.defaultRadius; b.prototype = { _organiseData: function (a, b) { var d = a[this._xField]; var e = a[this._yField]; var f = this._radi; var g = this._data; var h = this._max; var i = this._min; var j = a[this._valueField] || 1; var k = a.radius || this._cfgRadius || c; if (!g[d]) { g[d] = []; f[d] = [] } if (!g[d][e]) { g[d][e] = j; f[d][e] = k } else { g[d][e] += j } if (g[d][e] > h) { if (!b) { this._max = g[d][e] } else { this.setDataMax(g[d][e]) } return false } else { return { x: d, y: e, value: j, radius: k, min: i, max: h } } }, _unOrganizeData: function () { var a = []; var b = this._data; var c = this._radi; for (var d in b) { for (var e in b[d]) { a.push({ x: d, y: e, radius: c[d][e], value: b[d][e] }) } } return { min: this._min, max: this._max, data: a } }, _onExtremaChange: function () { this._coordinator.emit("extremachange", { min: this._min, max: this._max }) }, addData: function () { if (arguments[0].length > 0) { var a = arguments[0]; var b = a.length; while (b--) { this.addData.call(this, a[b]) } } else { var c = this._organiseData(arguments[0], true); if (c) { this._coordinator.emit("renderpartial", { min: this._min, max: this._max, data: [c] }) } } return this }, setData: function (a) { var b = a.data; var c = b.length; this._data = []; this._radi = []; for (var d = 0; d < c; d++) { this._organiseData(b[d], false) } this._max = a.max; this._min = a.min || 0; this._onExtremaChange(); this._coordinator.emit("renderall", this._getInternalData()); return this }, removeData: function () { }, setDataMax: function (a) { this._max = a; this._onExtremaChange(); this._coordinator.emit("renderall", this._getInternalData()); return this }, setDataMin: function (a) { this._min = a; this._onExtremaChange(); this._coordinator.emit("renderall", this._getInternalData()); return this }, setCoordinator: function (a) { this._coordinator = a }, _getInternalData: function () { return { max: this._max, min: this._min, data: this._data, radi: this._radi } }, getData: function () { return this._unOrganizeData() } }; return b }(); var c = function i () { var a = function (a) { var b = a.gradient || a.defaultGradient; var c = document.createElement("canvas"); var d = c.getContext("2d"); c.width = 256; c.height = 1; var e = d.createLinearGradient(0, 0, 256, 1); for (var f in b) { e.addColorStop(f, b[f]) } d.fillStyle = e; d.fillRect(0, 0, 256, 1); return d.getImageData(0, 0, 256, 1).data }; var b = function (a, b) { var c = document.createElement("canvas"); var d = c.getContext("2d"); var e = a; var f = a; c.width = c.height = a * 2; if (b == 1) { d.beginPath(); d.arc(e, f, a, 0, 2 * Math.PI, false); d.fillStyle = "rgba(0,0,0,1)"; d.fill() } else { var g = d.createRadialGradient(e, f, a * b, e, f, a); g.addColorStop(0, "rgba(0,0,0,1)"); g.addColorStop(1, "rgba(0,0,0,0)"); d.fillStyle = g; d.fillRect(0, 0, 2 * a, 2 * a) } return c }; var c = function (a) { var b = []; var c = a.min; var d = a.max; var e = a.radi; var a = a.data; var f = Object.keys(a); var g = f.length; while (g--) { var h = f[g]; var i = Object.keys(a[h]); var j = i.length; while (j--) { var k = i[j]; var l = a[h][k]; var m = e[h][k]; b.push({ x: h, y: k, value: l, radius: m }) } } return { min: c, max: d, data: b } }; function d (b) { var c = b.container; var d = this.shadowCanvas = document.createElement("canvas"); var e = this.canvas = b.canvas || document.createElement("canvas"); var f = this._renderBoundaries = [1e4, 1e4, 0, 0]; var g = getComputedStyle(b.container) || {}; e.className = "heatmap-canvas"; this._width = e.width = d.width = +g.width.replace(/px/, ""); this._height = e.height = d.height = +g.height.replace(/px/, ""); this.shadowCtx = d.getContext("2d"); this.ctx = e.getContext("2d"); e.style.cssText = d.style.cssText = "position:absolute;left:0;top:0;"; c.style.position = "relative"; c.appendChild(e); this._palette = a(b); this._templates = {}; this._setStyles(b) } d.prototype = { renderPartial: function (a) { this._drawAlpha(a); this._colorize() }, renderAll: function (a) { this._clear(); this._drawAlpha(c(a)); this._colorize() }, _updateGradient: function (b) { this._palette = a(b) }, updateConfig: function (a) { if (a["gradient"]) { this._updateGradient(a) } this._setStyles(a) }, setDimensions: function (a, b) { this._width = a; this._height = b; this.canvas.width = this.shadowCanvas.width = a; this.canvas.height = this.shadowCanvas.height = b }, _clear: function () { this.shadowCtx.clearRect(0, 0, this._width, this._height); this.ctx.clearRect(0, 0, this._width, this._height) }, _setStyles: function (a) { this._blur = a.blur == 0 ? 0 : a.blur || a.defaultBlur; if (a.backgroundColor) { this.canvas.style.backgroundColor = a.backgroundColor } this._opacity = (a.opacity || 0) * 255; this._maxOpacity = (a.maxOpacity || a.defaultMaxOpacity) * 255; this._minOpacity = (a.minOpacity || a.defaultMinOpacity) * 255; this._useGradientOpacity = !!a.useGradientOpacity }, _drawAlpha: function (a) { var c = this._min = a.min; var d = this._max = a.max; var a = a.data || []; var e = a.length; var f = 1 - this._blur; while (e--) { var g = a[e]; var h = g.x; var i = g.y; var j = g.radius; var k = Math.min(g.value, d); var l = h - j; var m = i - j; var n = this.shadowCtx; var o; if (!this._templates[j]) { this._templates[j] = o = b(j, f) } else { o = this._templates[j] } n.globalAlpha = (k - c) / (d - c); n.drawImage(o, l, m); if (l < this._renderBoundaries[0]) { this._renderBoundaries[0] = l } if (m < this._renderBoundaries[1]) { this._renderBoundaries[1] = m } if (l + 2 * j > this._renderBoundaries[2]) { this._renderBoundaries[2] = l + 2 * j } if (m + 2 * j > this._renderBoundaries[3]) { this._renderBoundaries[3] = m + 2 * j } } }, _colorize: function () { var a = this._renderBoundaries[0]; var b = this._renderBoundaries[1]; var c = this._renderBoundaries[2] - a; var d = this._renderBoundaries[3] - b; var e = this._width; var f = this._height; var g = this._opacity; var h = this._maxOpacity; var i = this._minOpacity; var j = this._useGradientOpacity; if (a < 0) { a = 0 } if (b < 0) { b = 0 } if (a + c > e) { c = e - a } if (b + d > f) { d = f - b } var k = this.shadowCtx.getImageData(a, b, c, d); var l = k.data; var m = l.length; var n = this._palette; for (var o = 3; o < m; o += 4) { var p = l[o]; var q = p * 4; if (!q) { continue } var r; if (g > 0) { r = g } else { if (p < h) { if (p < i) { r = i } else { r = p } } else { r = h } } l[o - 3] = n[q]; l[o - 2] = n[q + 1]; l[o - 1] = n[q + 2]; l[o] = j ? n[q + 3] : r } k.data = l; this.ctx.putImageData(k, a, b); this._renderBoundaries = [1e3, 1e3, 0, 0] }, getValueAt: function (a) { var b; var c = this.shadowCtx; var d = c.getImageData(a.x, a.y, 1, 1); var e = d.data[3]; var f = this._max; var g = this._min; b = Math.abs(f - g) * (e / 255) >> 0; return b }, getDataURL: function () { return this.canvas.toDataURL() } }; return d }(); var d = function j () { var b = false; if (a["defaultRenderer"] === "canvas2d") { b = c } return b }(); var e = { merge: function () { var a = {}; var b = arguments.length; for (var c = 0; c < b; c++) { var d = arguments[c]; for (var e in d) { a[e] = d[e] } } return a } }; var f = function k () { var c = function h () { function a () { this.cStore = {} } a.prototype = { on: function (a, b, c) { var d = this.cStore; if (!d[a]) { d[a] = [] } d[a].push(function (a) { return b.call(c, a) }) }, emit: function (a, b) { var c = this.cStore; if (c[a]) { var d = c[a].length; for (var e = 0; e < d; e++) { var f = c[a][e]; f(b) } } } }; return a }(); var f = function (a) { var b = a._renderer; var c = a._coordinator; var d = a._store; c.on("renderpartial", b.renderPartial, b); c.on("renderall", b.renderAll, b); c.on("extremachange", function (b) { a._config.onExtremaChange && a._config.onExtremaChange({ min: b.min, max: b.max, gradient: a._config["gradient"] || a._config["defaultGradient"] }) }); d.setCoordinator(c) }; function g () { var g = this._config = e.merge(a, arguments[0] || {}); this._coordinator = new c; if (g["plugin"]) { var h = g["plugin"]; if (!a.plugins[h]) { throw new Error("Plugin '" + h + "' not found. Maybe it was not registered.") } else { var i = a.plugins[h]; this._renderer = new i.renderer(g); this._store = new i.store(g) } } else { this._renderer = new d(g); this._store = new b(g) } f(this) } g.prototype = { addData: function () { this._store.addData.apply(this._store, arguments); return this }, removeData: function () { this._store.removeData && this._store.removeData.apply(this._store, arguments); return this }, setData: function () { this._store.setData.apply(this._store, arguments); return this }, setDataMax: function () { this._store.setDataMax.apply(this._store, arguments); return this }, setDataMin: function () { this._store.setDataMin.apply(this._store, arguments); return this }, configure: function (a) { this._config = e.merge(this._config, a); this._renderer.updateConfig(this._config); this._coordinator.emit("renderall", this._store._getInternalData()); return this }, repaint: function () { this._coordinator.emit("renderall", this._store._getInternalData()); return this }, getData: function () { return this._store.getData() }, getDataURL: function () { return this._renderer.getDataURL() }, getValueAt: function (a) { if (this._store.getValueAt) { return this._store.getValueAt(a) } else if (this._renderer.getValueAt) { return this._renderer.getValueAt(a) } else { return null } } }; return g }(); var g = { create: function (a) { return new f(a) }, register: function (b, c) { a.plugins[b] = c } }; return g })
public/index.html
@@ -2,7 +2,7 @@
 * @Author: shuishen 1109946754@qq.com
 * @Date: 2022-09-07 09:34:58
 * @LastEditors: shuishen 1109946754@qq.com
 * @LastEditTime: 2023-03-24 17:06:34
 * @LastEditTime: 2023-05-06 20:29:19
 * @FilePath: \srs-police-affairs\public\index.html
 * @Description: 
 * 
@@ -35,6 +35,8 @@
    <script src="./depend/echarts.min.js"></script>
    <script src="./depend/heatmap.min.js"></script>
    <script>
        window._axiosPromiseArr = []
    </script>
src/components/map/index.vue
@@ -2,7 +2,7 @@
 * @Author: shuishen 1109946754@qq.com
 * @Date: 2022-08-18 17:00:30
 * @LastEditors: shuishen 1109946754@qq.com
 * @LastEditTime: 2023-05-03 22:39:23
 * @LastEditTime: 2023-05-06 20:17:16
 * @FilePath: \srs-police-affairs\src\components\map\index.vue
 * @Description: 公用地图组件
 * 
@@ -320,21 +320,21 @@
            // global.viewer.addTerrain(terrain)
            // 内网
            that.switchImg()
            // that.switchImg()
            // 地形数据添加
            that.addTerrain()
            // that.addTerrain()
            // 外网 
            // global.viewer.imageryLayers.addImageryProvider(
            //     new global.DC.Namespace.Cesium.UrlTemplateImageryProvider({
            //         url: 'http://t{s}.tianditu.gov.cn/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=d083e4cf30bfc438ef93436c10c2c20a',
            //         subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
            //         format: 'image/jpeg',
            //         show: true,
            //         maximumLevel: 18
            //     })
            // )
            global.viewer.imageryLayers.addImageryProvider(
                new global.DC.Namespace.Cesium.UrlTemplateImageryProvider({
                    url: 'http://t{s}.tianditu.gov.cn/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=d083e4cf30bfc438ef93436c10c2c20a',
                    subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
                    format: 'image/jpeg',
                    show: true,
                    maximumLevel: 18
                })
            )
            // 设置地图初始位置,角度等
            global.viewer.camera.setView({
@@ -892,30 +892,32 @@
         * @param {*} type 图层类型
         */
        mapAddLayer (layerName, type, ClusterLayerType) {
            if (!layersObjcect[layerName]) {
                this.mapRemoveLayer(layerName, type)
                layersObjcect[layerName] = null
            }
            if (type == 'VectorLayer') {
                if (!layersObjcect[layerName]) layersObjcect[layerName] = null
                layersObjcect[layerName] = new global.DC.VectorLayer(layerName)
                layersObjcect[layerName].addTo(global.viewer)
            } else if (type == 'ClusterLayer') {
                if (!layersObjcect[layerName]) {
                    this.mapRemoveLayer(layerName, type)
                    layersObjcect[layerName] = null
                }
                layersObjcect[layerName] = new global.DC.ClusterLayer(layerName, {
                    pixelRange: 40, style: ClusterLayerType
                })
                layersObjcect[layerName].addTo(global.viewer)
            } else if (type == 'HeatLayer') {
                if (!layersObjcect[layerName]) layersObjcect[layerName] = null
                layersObjcect[layerName] = new global.DC.HeatLayer(layerName)
                layersObjcect[layerName].addTo(global.viewer)
                layersObjcect[layerName] = new global.DC.HeatLayer(layerName, {
                    gradient: {
                        "0.5": "green",
                        "0.6": "orange",
                        "0.95": "red"
                    }, //颜色设置
                    height: 0, // 高度
                    radius: 100, // 半径
                    useGround: false, //是否使用贴地模式
                    classificationType: 2 //分类 是否影响地形,3D切片或同时影响这两者。0:地形、1:3D切片、2:两者。贴地模式下生效
                })
            }
            global.viewer.addLayer(layersObjcect[layerName])
        },
        /**
src/utils/CesiumHeatmap.js
New file
@@ -0,0 +1,854 @@
/*
 * @Author: shuishen 1109946754@qq.com
 * @Date: 2023-05-06 20:24:41
 * @LastEditors: shuishen 1109946754@qq.com
 * @LastEditTime: 2023-05-06 21:15:24
 * @FilePath: \srs-police-affairs\src\utils\CesiumHeatmap.js
 * @Description:
 *
 * Copyright (c) 2023 by ${git_name_email}, All Rights Reserved.
 */
/* eslint-disable no-undef */
/*
 *  CesiumHeatmap.js v0.1 | global.DC.Namespace.Cesium Heatmap Library
 *
 *  Works with heatmap.js v2.0.0: http://www.patrick-wied.at/static/heatmapjs/
 */
(function (window) {
    'use strict'
    function define_CesiumHeatmap () {
        var CesiumHeatmap = {
            defaults: {
                useEntitiesIfAvailable: true, //whether to use entities if a Viewer is supplied or always use an ImageryProvider
                minCanvasSize: 700,           // minimum size (in pixels) for the heatmap canvas
                maxCanvasSize: 2000,          // maximum size (in pixels) for the heatmap canvas
                radiusFactor: 60,             // data point size factor used if no radius is given (the greater of height and width divided by this number yields the used radius)
                spacingFactor: 1.5,           // extra space around the borders (point radius multiplied by this number yields the spacing)
                maxOpacity: 0.8,              // the maximum opacity used if not given in the heatmap options object
                minOpacity: 0.1,              // the minimum opacity used if not given in the heatmap options object
                blur: 0.85,                   // the blur used if not given in the heatmap options object
                gradient: {                   // the gradient used if not given in the heatmap options object
                    '0.9': 'red',
                    '0.8': 'orange',
                    '0.7': 'yellow',
                    '0.5': 'blue',
                    '0.3': 'green',
                },
            }
        }
        /*  Create a CesiumHeatmap instance
         *
         *  cesium:  the CesiumWidget or Viewer instance
         *  bb:      the WGS84 bounding box like {north, east, south, west}
         *  options: a heatmap.js options object (see http://www.patrick-wied.at/static/heatmapjs/docs.html#h337-create)
         */
        CesiumHeatmap.create = function (cesium, bb, options) {
            var instance = new CHInstance(cesium, bb, options)
            return instance
        }
        CesiumHeatmap._getContainer = function (width, height, id) {
            var c = document.createElement("div")
            if (id) {
                c.setAttribute("id", id)
            }
            c.setAttribute("style", "width: " + width + "px; height: " + height + "px; margin: 0px; display: none;")
            document.body.appendChild(c)
            return c
        }
        CesiumHeatmap._getImageryProvider = function (instance) {
            //var n = (new Date()).getTime();
            var d = instance._heatmap.getDataURL()
            //console.log("Create data URL: " + ((new Date()).getTime() - n));
            //var n = (new Date()).getTime();
            var imgprov = new global.DC.Namespace.Cesium.SingleTileImageryProvider({
                url: d,
                rectangle: instance._rectangle
            })
            //console.log("Create imageryprovider: " + ((new Date()).getTime() - n));
            imgprov._tilingScheme = new global.DC.Namespace.Cesium.WebMercatorTilingScheme({
                rectangleSouthwestInMeters: new global.DC.Namespace.Cesium.Cartesian2(instance._mbounds.west, instance._mbounds.south),
                rectangleNortheastInMeters: new global.DC.Namespace.Cesium.Cartesian2(instance._mbounds.east, instance._mbounds.north)
            })
            return imgprov
        }
        CesiumHeatmap._getID = function (len) {
            var text = ""
            var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
            for (var i = 0; i < ((len) ? len : 8); i++)
                text += possible.charAt(Math.floor(Math.random() * possible.length))
            return text
        }
        var WMP = new global.DC.Namespace.Cesium.WebMercatorProjection()
        var Cesium = global.DC.Namespace.Cesium
        /*  Convert a WGS84 location into a mercator location
         *
         *  p: the WGS84 location like {x: lon, y: lat}
         */
        CesiumHeatmap.wgs84ToMercator = function (p) {
            var mp = WMP.project(Cesium.Cartographic.fromDegrees(p.x, p.y))
            return {
                x: mp.x,
                y: mp.y
            }
        }
        /*  Convert a WGS84 bounding box into a mercator bounding box
         *
         *  bb: the WGS84 bounding box like {north, east, south, west}
         */
        CesiumHeatmap.wgs84ToMercatorBB = function (bb) {
            var sw = WMP.project(Cesium.Cartographic.fromDegrees(bb.west, bb.south))
            var ne = WMP.project(Cesium.Cartographic.fromDegrees(bb.east, bb.north))
            return {
                north: ne.y,
                east: ne.x,
                south: sw.y,
                west: sw.x
            }
        }
        /*  Convert a mercator location into a WGS84 location
         *
         *  p: the mercator lcation like {x, y}
         */
        CesiumHeatmap.mercatorToWgs84 = function (p) {
            var wp = WMP.unproject(new Cesium.Cartesian3(p.x, p.y))
            return {
                x: wp.longitude,
                y: wp.latitude
            }
        }
        /*  Convert a mercator bounding box into a WGS84 bounding box
         *
         *  bb: the mercator bounding box like {north, east, south, west}
         */
        CesiumHeatmap.mercatorToWgs84BB = function (bb) {
            var sw = WMP.unproject(new Cesium.Cartesian3(bb.west, bb.south))
            var ne = WMP.unproject(new Cesium.Cartesian3(bb.east, bb.north))
            return {
                north: this.rad2deg(ne.latitude),
                east: this.rad2deg(ne.longitude),
                south: this.rad2deg(sw.latitude),
                west: this.rad2deg(sw.longitude)
            }
        }
        /*  Convert degrees into radians
         *
         *  d: the degrees to be converted to radians
         */
        CesiumHeatmap.deg2rad = function (d) {
            var r = d * (Math.PI / 180.0)
            return r
        }
        /*  Convert radians into degrees
         *
         *  r: the radians to be converted to degrees
         */
        CesiumHeatmap.rad2deg = function (r) {
            var d = r / (Math.PI / 180.0)
            return d
        }
        return CesiumHeatmap
    }
    if (typeof (CesiumHeatmap) === 'undefined') {
        window.CesiumHeatmap = define_CesiumHeatmap(global.DC.Namespace.Cesium)
    } else {
        console.log("CesiumHeatmap already defined.")
    }
})(window)
/*  Initiate a CesiumHeatmap instance
 *
 *  c:  CesiumWidget instance
 *  bb: a WGS84 bounding box like {north, east, south, west}
 *  o:  a heatmap.js options object (see http://www.patrick-wied.at/static/heatmapjs/docs.html#h337-create)
 */
function CHInstance (c, bb, o) {
    if (!bb) {
        return null
    }
    if (!o) {
        o = {}
    }
    this._cesium = c
    this._options = o
    this._id = CesiumHeatmap._getID()
    this._options.gradient = ((this._options.gradient) ? this._options.gradient : CesiumHeatmap.defaults.gradient)
    this._options.maxOpacity = ((this._options.maxOpacity) ? this._options.maxOpacity : CesiumHeatmap.defaults.maxOpacity)
    this._options.minOpacity = ((this._options.minOpacity) ? this._options.minOpacity : CesiumHeatmap.defaults.minOpacity)
    this._options.blur = ((this._options.blur) ? this._options.blur : CesiumHeatmap.defaults.blur)
    this._mbounds = CesiumHeatmap.wgs84ToMercatorBB(bb)
    this._setWidthAndHeight(this._mbounds)
    this._options.radius = Math.round((this._options.radius) ? this._options.radius : ((this.width > this.height) ? this.width / CesiumHeatmap.defaults.radiusFactor : this.height / CesiumHeatmap.defaults.radiusFactor))
    this._spacing = this._options.radius * CesiumHeatmap.defaults.spacingFactor
    this._xoffset = this._mbounds.west
    this._yoffset = this._mbounds.south
    this.width = Math.round(this.width + this._spacing * 2)
    this.height = Math.round(this.height + this._spacing * 2)
    this._mbounds.west -= this._spacing * this._factor
    this._mbounds.east += this._spacing * this._factor
    this._mbounds.south -= this._spacing * this._factor
    this._mbounds.north += this._spacing * this._factor
    this.bounds = CesiumHeatmap.mercatorToWgs84BB(this._mbounds)
    this._rectangle = global.DC.Namespace.Cesium.Rectangle.fromDegrees(this.bounds.west, this.bounds.south, this.bounds.east, this.bounds.north)
    this._container = CesiumHeatmap._getContainer(this.width, this.height, this._id)
    this._options.container = this._container
    this._heatmap = window.h337.create(this._options)
    this._container.children[0].setAttribute("id", this._id + "-hm")
}
/*  Convert a WGS84 location to the corresponding heatmap location
 *
 *  p: a WGS84 location like {x:lon, y:lat}
 */
CHInstance.prototype.wgs84PointToHeatmapPoint = function (p) {
    return this.mercatorPointToHeatmapPoint(CesiumHeatmap.wgs84ToMercator(p))
}
/*  Convert a mercator location to the corresponding heatmap location
 *
 *  p: a WGS84 location like {x: lon, y:lat}
 */
CHInstance.prototype.mercatorPointToHeatmapPoint = function (p) {
    var pn = {}
    pn.x = Math.round((p.x - this._xoffset) / this._factor + this._spacing)
    pn.y = Math.round((p.y - this._yoffset) / this._factor + this._spacing)
    pn.y = this.height - pn.y
    return pn
}
CHInstance.prototype._setWidthAndHeight = function (mbb) {
    this.width = ((mbb.east > 0 && mbb.west < 0) ? mbb.east + Math.abs(mbb.west) : Math.abs(mbb.east - mbb.west))
    this.height = ((mbb.north > 0 && mbb.south < 0) ? mbb.north + Math.abs(mbb.south) : Math.abs(mbb.north - mbb.south))
    this._factor = 1
    if (this.width > this.height && this.width > CesiumHeatmap.defaults.maxCanvasSize) {
        this._factor = this.width / CesiumHeatmap.defaults.maxCanvasSize
        if (this.height / this._factor < CesiumHeatmap.defaults.minCanvasSize) {
            this._factor = this.height / CesiumHeatmap.defaults.minCanvasSize
        }
    } else if (this.height > this.width && this.height > CesiumHeatmap.defaults.maxCanvasSize) {
        this._factor = this.height / CesiumHeatmap.defaults.maxCanvasSize
        if (this.width / this._factor < CesiumHeatmap.defaults.minCanvasSize) {
            this._factor = this.width / CesiumHeatmap.defaults.minCanvasSize
        }
    } else if (this.width < this.height && this.width < CesiumHeatmap.defaults.minCanvasSize) {
        this._factor = this.width / CesiumHeatmap.defaults.minCanvasSize
        if (this.height / this._factor > CesiumHeatmap.defaults.maxCanvasSize) {
            this._factor = this.height / CesiumHeatmap.defaults.maxCanvasSize
        }
    } else if (this.height < this.width && this.height < CesiumHeatmap.defaults.minCanvasSize) {
        this._factor = this.height / CesiumHeatmap.defaults.minCanvasSize
        if (this.width / this._factor > CesiumHeatmap.defaults.maxCanvasSize) {
            this._factor = this.width / CesiumHeatmap.defaults.maxCanvasSize
        }
    }
    this.width = this.width / this._factor
    this.height = this.height / this._factor
}
/*  Set an array of heatmap locations
 *
 *  min:  the minimum allowed value for the data values
 *  max:  the maximum allowed value for the data values
 *  data: an array of data points in heatmap coordinates and values like {x, y, value}
 */
CHInstance.prototype.setData = function (min, max, data) {
    if (data && data.length > 0 && min !== null && min !== false && max !== null && max !== false) {
        this._heatmap.setData({
            min: min,
            max: max,
            data: data
        })
        this.updateLayer()
        return true
    }
    return false
}
/*  Set an array of WGS84 locations
 *
 *  min:  the minimum allowed value for the data values
 *  max:  the maximum allowed value for the data values
 *  data: an array of data points in WGS84 coordinates and values like { x:lon, y:lat, value }
 */
CHInstance.prototype.setWGS84Data = function (min, max, data) {
    if (data && data.length > 0 && min !== null && min !== false && max !== null && max !== false) {
        var convdata = []
        for (var i = 0; i < data.length; i++) {
            var gp = data[i]
            var hp = this.wgs84PointToHeatmapPoint(gp)
            if (gp.value || gp.value === 0) {
                hp.value = gp.value
            }
            convdata.push(hp)
        }
        return this.setData(min, max, convdata)
    }
    return false
}
/*  Set whether or not the heatmap is shown on the map
 *
 *  s: true means the heatmap is shown, false means the heatmap is hidden
 */
CHInstance.prototype.show = function (s) {
    if (this._layer) {
        this._layer.show = s
    }
}
/*  Update/(re)draw the heatmap
 */
CHInstance.prototype.updateLayer = function () {
    // only works with a Viewer instance since the cesiumWidget
    // instance doesn't contain an entities property
    if (CesiumHeatmap.defaults.useEntitiesIfAvailable && this._cesium.entities) {
        if (this._layer) {
            this._cesium.entities.remove(this._layer)
        }
        // Work around issue with material rendering in global.DC.Namespace.Cesium
        // provided by https://github.com/criis
        material = new global.DC.Namespace.Cesium.ImageMaterialProperty({
            image: this._heatmap._renderer.canvas,
        })
        if (global.DC.Namespace.Cesium.VERSION >= "1.21") {
            material.transparent = true
        } else if (global.DC.Namespace.Cesium.VERSION >= "1.16") {
            material.alpha = 0.99
        }
        this._layer = this._cesium.entities.add({
            show: true,
            rectangle: {
                coordinates: this._rectangle,
                material: material
            }
        })
    } else {
        if (this._layer) {
            this._cesium.scene.imageryLayers.remove(this._layer)
        }
        this._layer = this._cesium.scene.imageryLayers.addImageryProvider(CesiumHeatmap._getImageryProvider(this))
    }
};
/*  DON'T TOUCH:
 *
 *  heatmap.js v2.0.0 | JavaScript Heatmap Library: http://www.patrick-wied.at/static/heatmapjs/
 *
 *  Copyright 2008-2014 Patrick Wied <heatmapjs@patrick-wied.at> - All rights reserved.
 *  Dual licensed under MIT and Beerware license
 *
 *  :: 2014-10-31 21:16
 */
(function (a, b, c) {
    b[a] = c()//稍微改了下
})("h337", this, function () {
    var a = {
        defaultRadius: 40,
        defaultRenderer: "canvas2d",
        defaultGradient: { .25: "rgb(0,0,255)", .55: "rgb(0,255,0)", .85: "yellow", 1: "rgb(255,0,0)" },
        defaultMaxOpacity: 1,
        defaultMinOpacity: 0,
        defaultBlur: .85,
        defaultXField: "x",
        defaultYField: "y",
        defaultValueField: "value",
        plugins: {}
    }
    var b = function h () {
        var b = function d (a) {
            this._coordinator = {}
            this._data = []
            this._radi = []
            this._min = 0
            this._max = 1
            this._xField = a["xField"] || a.defaultXField
            this._yField = a["yField"] || a.defaultYField
            this._valueField = a["valueField"] || a.defaultValueField
            if (a["radius"]) {
                this._cfgRadius = a["radius"]
            }
        }
        var c = a.defaultRadius
        b.prototype = {
            _organiseData: function (a, b) {
                var d = a[this._xField]
                var e = a[this._yField]
                var f = this._radi
                var g = this._data
                var h = this._max
                var i = this._min
                var j = a[this._valueField] || 1
                var k = a.radius || this._cfgRadius || c
                if (!g[d]) {
                    g[d] = []
                    f[d] = []
                }
                if (!g[d][e]) {
                    g[d][e] = j
                    f[d][e] = k
                } else {
                    g[d][e] += j
                }
                if (g[d][e] > h) {
                    if (!b) {
                        this._max = g[d][e]
                    } else {
                        this.setDataMax(g[d][e])
                    }
                    return false
                } else {
                    return { x: d, y: e, value: j, radius: k, min: i, max: h }
                }
            }, _unOrganizeData: function () {
                var a = []
                var b = this._data
                var c = this._radi
                for (var d in b) {
                    for (var e in b[d]) {
                        a.push({ x: d, y: e, radius: c[d][e], value: b[d][e] })
                    }
                }
                return { min: this._min, max: this._max, data: a }
            }, _onExtremaChange: function () {
                this._coordinator.emit("extremachange", { min: this._min, max: this._max })
            }, addData: function () {
                if (arguments[0].length > 0) {
                    var a = arguments[0]
                    var b = a.length
                    while (b--) {
                        this.addData.call(this, a[b])
                    }
                } else {
                    var c = this._organiseData(arguments[0], true)
                    if (c) {
                        this._coordinator.emit("renderpartial", { min: this._min, max: this._max, data: [c] })
                    }
                }
                return this
            }, setData: function (a) {
                var b = a.data
                var c = b.length
                this._data = []
                this._radi = []
                for (var d = 0; d < c; d++) {
                    this._organiseData(b[d], false)
                }
                this._max = a.max
                this._min = a.min || 0
                this._onExtremaChange()
                this._coordinator.emit("renderall", this._getInternalData())
                return this
            }, removeData: function () {
            }, setDataMax: function (a) {
                this._max = a
                this._onExtremaChange()
                this._coordinator.emit("renderall", this._getInternalData())
                return this
            }, setDataMin: function (a) {
                this._min = a
                this._onExtremaChange()
                this._coordinator.emit("renderall", this._getInternalData())
                return this
            }, setCoordinator: function (a) {
                this._coordinator = a
            }, _getInternalData: function () {
                return { max: this._max, min: this._min, data: this._data, radi: this._radi }
            }, getData: function () {
                return this._unOrganizeData()
            }
        }
        return b
    }()
    var c = function i () {
        var a = function (a) {
            var b = a.gradient || a.defaultGradient
            var c = document.createElement("canvas")
            var d = c.getContext("2d")
            c.width = 256
            c.height = 1
            var e = d.createLinearGradient(0, 0, 256, 1)
            for (var f in b) {
                e.addColorStop(f, b[f])
            }
            d.fillStyle = e
            d.fillRect(0, 0, 256, 1)
            return d.getImageData(0, 0, 256, 1).data
        }
        var b = function (a, b) {
            var c = document.createElement("canvas")
            var d = c.getContext("2d")
            var e = a
            var f = a
            c.width = c.height = a * 2
            if (b == 1) {
                d.beginPath()
                d.arc(e, f, a, 0, 2 * Math.PI, false)
                d.fillStyle = "rgba(0,0,0,1)"
                d.fill()
            } else {
                var g = d.createRadialGradient(e, f, a * b, e, f, a)
                g.addColorStop(0, "rgba(0,0,0,1)")
                g.addColorStop(1, "rgba(0,0,0,0)")
                d.fillStyle = g
                d.fillRect(0, 0, 2 * a, 2 * a)
            }
            return c
        }
        var c = function (a) {
            var b = []
            var c = a.min
            var d = a.max
            var e = a.radi
            // eslint-disable-next-line no-redeclare
            var a = a.data
            var f = Object.keys(a)
            var g = f.length
            while (g--) {
                var h = f[g]
                var i = Object.keys(a[h])
                var j = i.length
                while (j--) {
                    var k = i[j]
                    var l = a[h][k]
                    var m = e[h][k]
                    b.push({ x: h, y: k, value: l, radius: m })
                }
            }
            return { min: c, max: d, data: b }
        }
        function d (b) {
            var c = b.container
            var d = this.shadowCanvas = document.createElement("canvas")
            var e = this.canvas = b.canvas || document.createElement("canvas")
            var f = this._renderBoundaries = [1e4, 1e4, 0, 0]
            var g = getComputedStyle(b.container) || {}
            e.className = "heatmap-canvas"
            this._width = e.width = d.width = +g.width.replace(/px/, "")
            this._height = e.height = d.height = +g.height.replace(/px/, "")
            this.shadowCtx = d.getContext("2d")
            this.ctx = e.getContext("2d")
            e.style.cssText = d.style.cssText = "position:absolute;left:0;top:0;"
            c.style.position = "relative"
            c.appendChild(e)
            this._palette = a(b)
            this._templates = {}
            this._setStyles(b)
        }
        d.prototype = {
            renderPartial: function (a) {
                this._drawAlpha(a)
                this._colorize()
            }, renderAll: function (a) {
                this._clear()
                this._drawAlpha(c(a))
                this._colorize()
            }, _updateGradient: function (b) {
                this._palette = a(b)
            }, updateConfig: function (a) {
                if (a["gradient"]) {
                    this._updateGradient(a)
                }
                this._setStyles(a)
            }, setDimensions: function (a, b) {
                this._width = a
                this._height = b
                this.canvas.width = this.shadowCanvas.width = a
                this.canvas.height = this.shadowCanvas.height = b
            }, _clear: function () {
                this.shadowCtx.clearRect(0, 0, this._width, this._height)
                this.ctx.clearRect(0, 0, this._width, this._height)
            }, _setStyles: function (a) {
                this._blur = a.blur == 0 ? 0 : a.blur || a.defaultBlur
                if (a.backgroundColor) {
                    this.canvas.style.backgroundColor = a.backgroundColor
                }
                this._opacity = (a.opacity || 0) * 255
                this._maxOpacity = (a.maxOpacity || a.defaultMaxOpacity) * 255
                this._minOpacity = (a.minOpacity || a.defaultMinOpacity) * 255
                this._useGradientOpacity = !!a.useGradientOpacity
            }, _drawAlpha: function (a) {
                var c = this._min = a.min
                var d = this._max = a.max
                // eslint-disable-next-line no-redeclare
                var a = a.data || []
                var e = a.length
                var f = 1 - this._blur
                while (e--) {
                    var g = a[e]
                    var h = g.x
                    var i = g.y
                    var j = g.radius
                    var k = Math.min(g.value, d)
                    var l = h - j
                    var m = i - j
                    var n = this.shadowCtx
                    var o
                    if (!this._templates[j]) {
                        this._templates[j] = o = b(j, f)
                    } else {
                        o = this._templates[j]
                    }
                    n.globalAlpha = (k - c) / (d - c)
                    n.drawImage(o, l, m)
                    if (l < this._renderBoundaries[0]) {
                        this._renderBoundaries[0] = l
                    }
                    if (m < this._renderBoundaries[1]) {
                        this._renderBoundaries[1] = m
                    }
                    if (l + 2 * j > this._renderBoundaries[2]) {
                        this._renderBoundaries[2] = l + 2 * j
                    }
                    if (m + 2 * j > this._renderBoundaries[3]) {
                        this._renderBoundaries[3] = m + 2 * j
                    }
                }
            }, _colorize: function () {
                var a = this._renderBoundaries[0]
                var b = this._renderBoundaries[1]
                var c = this._renderBoundaries[2] - a
                var d = this._renderBoundaries[3] - b
                var e = this._width
                var f = this._height
                var g = this._opacity
                var h = this._maxOpacity
                var i = this._minOpacity
                var j = this._useGradientOpacity
                if (a < 0) {
                    a = 0
                }
                if (b < 0) {
                    b = 0
                }
                if (a + c > e) {
                    c = e - a
                }
                if (b + d > f) {
                    d = f - b
                }
                var k = this.shadowCtx.getImageData(a, b, c, d)
                var l = k.data
                var m = l.length
                var n = this._palette
                for (var o = 3; o < m; o += 4) {
                    var p = l[o]
                    var q = p * 4
                    if (!q) {
                        continue
                    }
                    var r
                    if (g > 0) {
                        r = g
                    } else {
                        if (p < h) {
                            if (p < i) {
                                r = i
                            } else {
                                r = p
                            }
                        } else {
                            r = h
                        }
                    }
                    l[o - 3] = n[q]
                    l[o - 2] = n[q + 1]
                    l[o - 1] = n[q + 2]
                    l[o] = j ? n[q + 3] : r
                }
                k.data = l
                this.ctx.putImageData(k, a, b)
                this._renderBoundaries = [1e3, 1e3, 0, 0]
            }, getValueAt: function (a) {
                var b
                var c = this.shadowCtx
                var d = c.getImageData(a.x, a.y, 1, 1)
                var e = d.data[3]
                var f = this._max
                var g = this._min
                b = Math.abs(f - g) * (e / 255) >> 0
                return b
            }, getDataURL: function () {
                return this.canvas.toDataURL()
            }
        }
        return d
    }()
    var d = function j () {
        var b = false
        if (a["defaultRenderer"] === "canvas2d") {
            b = c
        }
        return b
    }()
    var e = {
        merge: function () {
            var a = {}
            var b = arguments.length
            for (var c = 0; c < b; c++) {
                var d = arguments[c]
                for (var e in d) {
                    a[e] = d[e]
                }
            }
            return a
        }
    }
    var f = function k () {
        var c = function h () {
            function a () {
                this.cStore = {}
            }
            a.prototype = {
                on: function (a, b, c) {
                    var d = this.cStore
                    if (!d[a]) {
                        d[a] = []
                    }
                    d[a].push(function (a) {
                        return b.call(c, a)
                    })
                }, emit: function (a, b) {
                    var c = this.cStore
                    if (c[a]) {
                        var d = c[a].length
                        for (var e = 0; e < d; e++) {
                            var f = c[a][e]
                            f(b)
                        }
                    }
                }
            }
            return a
        }()
        var f = function (a) {
            var b = a._renderer
            var c = a._coordinator
            var d = a._store
            c.on("renderpartial", b.renderPartial, b)
            c.on("renderall", b.renderAll, b)
            c.on("extremachange", function (b) {
                a._config.onExtremaChange && a._config.onExtremaChange({
                    min: b.min,
                    max: b.max,
                    gradient: a._config["gradient"] || a._config["defaultGradient"]
                })
            })
            d.setCoordinator(c)
        }
        function g () {
            var g = this._config = e.merge(a, arguments[0] || {})
            this._coordinator = new c
            if (g["plugin"]) {
                var h = g["plugin"]
                if (!a.plugins[h]) {
                    throw new Error("Plugin '" + h + "' not found. Maybe it was not registered.")
                } else {
                    var i = a.plugins[h]
                    this._renderer = new i.renderer(g)
                    this._store = new i.store(g)
                }
            } else {
                this._renderer = new d(g)
                this._store = new b(g)
            }
            f(this)
        }
        g.prototype = {
            addData: function () {
                this._store.addData.apply(this._store, arguments)
                return this
            }, removeData: function () {
                this._store.removeData && this._store.removeData.apply(this._store, arguments)
                return this
            }, setData: function () {
                this._store.setData.apply(this._store, arguments)
                return this
            }, setDataMax: function () {
                this._store.setDataMax.apply(this._store, arguments)
                return this
            }, setDataMin: function () {
                this._store.setDataMin.apply(this._store, arguments)
                return this
            }, configure: function (a) {
                this._config = e.merge(this._config, a)
                this._renderer.updateConfig(this._config)
                this._coordinator.emit("renderall", this._store._getInternalData())
                return this
            }, repaint: function () {
                this._coordinator.emit("renderall", this._store._getInternalData())
                return this
            }, getData: function () {
                return this._store.getData()
            }, getDataURL: function () {
                return this._renderer.getDataURL()
            }, getValueAt: function (a) {
                if (this._store.getValueAt) {
                    return this._store.getValueAt(a)
                } else if (this._renderer.getValueAt) {
                    return this._renderer.getValueAt(a)
                } else {
                    return null
                }
            }
        }
        return g
    }()
    var g = {
        create: function (a) {
            return new f(a)
        }, register: function (b, c) {
            a.plugins[b] = c
        }
    }
    return g
})
src/utils/turfPolygon.js
@@ -123,15 +123,11 @@
    let pointArr = []
    data.forEach(item => {
        if (item.lng && item.lat) {
            pointArr.push(turf.point([item.lng, item.lat]))
            return
        }
        pointArr.push(turf.point([item.x, item.y]))
        return
    })
    const features = turf.featureCollection(pointArr)
    console.log(turf.envelope(features))
    const scope = turf.envelope(features).bbox
src/views/policeInfor/index.vue
@@ -2,7 +2,7 @@
 * @Author: shuishen 1109946754@qq.com
 * @Date: 2022-08-18 16:18:17
 * @LastEditors: shuishen 1109946754@qq.com
 * @LastEditTime: 2023-05-06 19:20:32
 * @LastEditTime: 2023-05-06 21:16:32
 * @FilePath: \srs-police-affairs\src\views\policeInfor\index.vue
 * @Description: 辖区管理
 * 
@@ -263,6 +263,9 @@
import { getActAsPoliceList, getAnswerPolices, getAlarmList } from "@/api/home/index.js"
import { initMapPosition } from '@/utils/mapPositionInit'
import { BjlxData } from "@/assets/police"
import '@/utils/CesiumHeatmap.js'
import { getMapBounds } from '@/utils/turfPolygon.js'
let loading = null
@@ -379,7 +382,9 @@
                    value: '其他',
                    label: '其他'
                }
            ]
            ],
            heatMap: null
        }
    },
@@ -634,13 +639,48 @@
            // }, 500)
        },
        addHeatmap (data) {
            let box = getMapBounds(data)
            let bounds = {
                west: Number(box[0]),
                south: Number(box[1]),
                east: Number(box[2]),
                north: Number(box[3])
            }
            //初始化cesiumheatmap对象,传入相应的参数
            // eslint-disable-next-line no-undef
            let heatMap = CesiumHeatmap.create(
                global.viewer, // 视图层
                bounds, // 矩形坐标
                {
                    radius: 80,
                    maxOpacity: .5,
                    minOpacity: 0,
                    blur: .75
                }
            )
            let valueMin = 0
            let valueMax = 100
            // add data to heatmap
            //获取动态数据
            heatMap.setWGS84Data(valueMin, valueMax, data)
            this.heatMap = heatMap
        },
        // 获取历史接警记录(不分页)
        getAlarmList (params) {
            this.loading()
            this.historyPoliceInforData = []
            this.historyEmptyText = ""
            if (this.heatMap != null) {
                this.heatMap.show(false)
            }
            getAlarmList({ ...params, size: this.pages.size, jjdwbh: this.userInfo.dept_id, type: 3, bjlx: this.policeInforValue }).then(res => {
                if (res.data.data.length > 0) {
                    let positions = []
                    // this.pages.total = res.data.data.pages
                    this.historyPoliceInforData = res.data.data.map((item, index) => {
                        const bjlxText = BjlxData.filter(i => item.BJLX == i.BJLX)[0] ? BjlxData.filter(i => item.BJLX == i.BJLX)[0].VALUE : ''
@@ -649,15 +689,22 @@
                        if (item.JJDWMC.indexOf('信州区分局') != -1) item.JJDWMC = item.JJDWMC.replace(/信州区分局/, '')
                        if (item.JJDWMC.indexOf('信州') != -1) item.JJDWMC = item.JJDWMC.replace(/信州/, '')
                        if (item.ZDDWXZB && item.ZDDWXZB != '' && item.ZDDWXZB > 0) {
                            positions.push({ x: Number(item.ZDDWXZB), y: Number(item.ZDDWYZB), value: 23 })
                        }
                        return { ...item, index: index + 1, lng: item.ZDDWXZB, lat: item.ZDDWYZB, BJLX: bjlxText }
                    })
                    this.addHeatmap(positions)
                } else {
                    // this.pages.total = 0
                    this.historyPoliceInforData = []
                    this.realEmptyText = "暂无历史警情信息"
                }
                this.addPoliceInforSiteLayer(this.historyPoliceInforData)
                // this.addPoliceInforSiteLayer(this.historyPoliceInforData)
                setTimeout(() => {
                    loading && loading.close()
                }, 500)
@@ -760,9 +807,7 @@
            data.forEach((item, index) => {
                if (item.lng && item.lng != undefined && item.lng != '') {
                    let center = new global.DC.Position(Number(item.lng), Number(item.lat))
                    // let point = new global.DC.PointPrimitive(center)
                    policeInfoPositionList.push(center)
                    policeInfoPositionList.push(new global.DC.Position(item.lng, item.lat))
                    // let num = 0
                    // timer[index] = setInterval(() => {
@@ -783,6 +828,7 @@
                    // policeInforSiteLayer.addOverlay(point)
                }
            })
            this.$EventBus.$emit('layerPointAdd', {
                layerName: 'policeInfoHeatLayer',
                type: "HeatPoint",
@@ -910,6 +956,10 @@
    destroyed () {
        loading && loading.close()
        if (this.heatMap != null) {
            this.heatMap.removeLayer()
        }
        window.removeEventListener('resize', this.setTableHeight)
        policeInforSiteLayer != null && policeInforSiteLayer.remove()