textarcgisforjs4.x集成热力图(代码片段)

author author     2022-12-03     206

关键词:

## arcgis for js 4.x集成热力图

####  主要步骤
1. [引入热力图插件 heatmap.js](#wendang)
2. [引入arcgis for js热力图集成工具](#tools)
3. [创建热力图图层](#create)
4. [获取数据,生成热力图](#getData)
5. [API](#API)


---

##### <span id="wendang">一、引入热力图插件 heatmap.js</span>
相关文档地址  
[github-heatmap](https://github.com/pa7/heatmap.js)   
[官方网站](https://www.patrick-wied.at/static/heatmapjs/)  
[CSDN相关资料](http://blog.csdn.net/rongchaoliu/article/details/47830799)

---
##### <span id="tools">二、引入arcgis for js热力图集成工具</span>


~~~JavaScript

var HeartMapLayer;
function initHeartMapLayer(createHeatMapLayer) 
    require([
        "esri/layers/BaseDynamicLayer",
        "esri/request"
    ], function (
        BaseDynamicLayer, esriRequest
    ) 
        HeartMapLayer = BaseDynamicLayer.createSubclass(
            properties: ,
            heatMap: null,
            // 构造方法
            constructor: function (properties) 
                dojo.safeMixin(this.properties, properties);

                //设置图层的ID
                id : properties.id || null,
                // 热力图创建所在的view
                this._view = this.properties.view;
                // 最终数据存储
                this.lastData = [];
                // 热力图所在dom
                this.domNode = document.getElementById(this.properties.domNodeId);
                // 初始化参数
                this.config = 
                    container : this.domNode,
                    width: this._view.width,
                    height: this._view.height,
                    radius: 40,
                    debug: false,
                    visible: true,
                    useLocalMaximum: false,
                    gradient: 
                        0.45: "rgb(000,000,255)",
                        0.55: "rgb(000,255,255)",
                        0.65: "rgb(000,255,000)",
                        0.95: "rgb(255,255,000)",
                        1.00: "rgb(255,000,000)"
                    
                ;
                // 创建热力图
                this.heatMap = h337.create(this.config);
                // loaded
                this.loaded = true;
                // this.onLoad(this);
                // global maximum value
                this.globalMax = 0;

                //添加视图resize事件,调整heatmap尺寸
                // view.on("resize", function (event) 
                //     this.resizeHeatmap(event);
                // );
                dojo.connect(this._view, "onresize", this, this.resizeHeatmap);

                // heatlayer div styling
                this.domNode.style.position = 'relative';
                this.domNode.style.display = 'none';

                //TODO 绑定图层移除事件,待完善(延迟执行不确定性太多,但是未找到方法)
                this.on("layerview-destroy", function (event) 
                    setTimeout(function (layer) 
                        layer.view.map.add(layer);
                    , 500, this);
                );
            ,
            resizeHeatmap: function (event) 
                var width = event.width;
                var height = event.height;
                //设置画布宽高
                this.heatMap._renderer.setDimensions(width, height);
                // 设置热力图容器的宽高
                dojo.style(this.domNode, 
                    "width": width + 'px',
                    "height": height + 'px'
                );
                // set width and height of canvas element inside of container
                var child = dojo.query(':first-child', this.domNode);
                if (child) 
                    child.attr('width', width);
                    child.attr('height', height);
                
            ,
            //将转换后的数据设置到热力图
            storeHeatmapData: function (heatPluginData) 
                // 设置热力图的数据
                this.heatMap.setData(heatPluginData);
            ,
            // 按照热力图插件的数据格式转换数据
            convertHeatmapData: function (parsedData) 
                var xParsed, yParsed, heatPluginData, dataPoint, screenGeometry;
                // 设置热力图插件的数据对象
                heatPluginData = 
                    max: parsedData.max,
                    data: []
                ;
                if (parsedData.data) 
                    for (xParsed in parsedData.data) 
                        if (parsedData.data.hasOwnProperty(xParsed)) 
                            // for all y values and count
                            for (yParsed in parsedData.data[xParsed]) 
                                if (parsedData.data[xParsed].hasOwnProperty(yParsed)) 
                                    // 将经纬度作为转为屏幕XY坐标
                                    screenGeometry = view.toScreen(parsedData.data[xParsed][yParsed].dataPoint);
                                    // 将格式化后的数据放入数据集中
                                    heatPluginData.data.push(
                                        x: screenGeometry.x,
                                        y: screenGeometry.y,
                                        value: parsedData.data[xParsed][yParsed].heatValue // count value of x,y
                                    );
                                
                            
                        
                    
                
                //将格式化后的数据设置到热力图并渲染
                this.storeHeatmapData(heatPluginData);
            ,
            // 格式化数据,并获取最大值
            parseHeatmapData: function (features) 
                // variables
                var i, parsedData, dataPoint, attributes;
                // if data points exist
                if (features) 
                    // create parsed data object
                    parsedData = 
                        max: 0,
                        data: []
                    ;
                    if (!this.config.useLocalMaximum) 
                        parsedData.max = this.globalMax;
                    
                    // 遍历每一个坐标点
                    for (i = 0; i < features.length; i++) 
                        // 获取电信系
                        dataPoint = features[i].geometry;
                        // dataPoint = esri.geometry.Point(features[i].geometry);
                        // 检查点是否有效
                        var validPoint = false;
                        // 如果不使用设置的最大值, 点是有效的
                        if (!this.config.useLocalMaximum) 
                            validPoint = true;
                        
                        // 如果使用设置的最大值,要确保点在当前视图内
                        else if(this._view.extent.contains(dataPoint))
                            validPoint = true;
                        
                        if (validPoint) 
                            attributes = features[i].attributes;
                            if (!parsedData.data[dataPoint.x]) 
                                parsedData.data[dataPoint.x] = [];
                            
                            // 如果X,Y数据未创建,则创建
                            if (!parsedData.data[dataPoint.x][dataPoint.y]) 
                                // 创建一个数据对象
                                parsedData.data[dataPoint.x][dataPoint.y] = ;
                                // 如果热力图渲染属性在地图数据中存在,则使用地图数据
                                if (attributes && attributes.hasOwnProperty('heatValue')) 
                                    parsedData.data[dataPoint.x][dataPoint.y].heatValue = attributes.heatValue;
                                 else 
                                    parsedData.data[dataPoint.x][dataPoint.y].heatValue = 0;
                                
                            
                            // 渲染属性数据+1
                            parsedData.data[dataPoint.x][dataPoint.y].heatValue += 1;
                            // 添加经纬度点数据,用于下一步计算屏幕坐标
                            parsedData.data[dataPoint.x][dataPoint.y].dataPoint = dataPoint;
                            // 获取最大值
                            if (parsedData.max < parsedData.data[dataPoint.x][dataPoint.y].heatValue) 
                                parsedData.max = parsedData.data[dataPoint.x][dataPoint.y].heatValue;
                                if (!this.config.useLocalMaximum) 
                                    this.globalMax = parsedData.data[dataPoint.x][dataPoint.y].heatValue;
                                
                            

                        
                    
                    //按照热力图插件所需的数据格式进一步转换数据
                    this.convertHeatmapData(parsedData);
                
            ,
            // 设置数据
            setData: function (features) 
                // 设置地图的宽高
                var event = width : this._view.width, height : this._view.height
                this.resizeHeatmap(event);
                // 设置数据
                this.lastData = features;
                // this.parseHeatmapData(features);
                //重新描画图层,refresh方法在3D地图下无效,解决方案采用添加移除图层来解决
                var viewType = this.view.type;
                if (viewType == "3d") 
                    //TODO 移除图层,待完善(图层如果不在map中,如何处理?)
                    //该方法存在回调,移除后执行添加图层操作
                    this.view.map.remove(this);
                 else 
                    // 重新描画图层(此方法在3D地图下无效)
                    this.refresh();
                
            ,
            // 添加一个元素到热力图,并重新描画热力图
            addDataPoint: function (feature) 
                if (feature) 
                    // 将数据添加到最终数据
                    this.lastData.push(feature);
                    // 设置数据
                    setData(this.lastData);
                
            ,
            // 返回生成热力图的数据集合
            exportDataSet: function () 
                return this.lastData;
            ,
            // TODO 清除数据
            clearData: function () 
                //清除热力图的数据
                this.heatMap.removeData();
                // this.heatMap.clear();
                var empty = [];
                //设置热力图数据未[],并重新描画
                this.setData(empty);
            ,
            // 获取图片二进制数据
            getImageUrl: function (extent, width, height) 
                // 始终最终数据创建热力图
                this.parseHeatmapData(this.lastData);
                // 获取生成的热力图图片信息
                var imageUrl = this.heatMap.getDataURL();
                return imageUrl;
            ,
            //图片预处理,将二进制数据转为图片
            fetchImage : function (extent, width, height) 
                var url = this.getImageUrl(extent, width, height);
                return esriRequest(url, 
                    responseType: "image",
                    allowImageDataAccess: true
                )
                    .then(function(response) 
                        var image = response.data;

                        var canvas = document.createElement("canvas");
                        var context = canvas.getContext("2d");
                        canvas.width = width;
                        canvas.height = height;

                        //TODO 存在问题:width、height值为2048(原因不明),而热力图画板宽高为视图view宽高,直接放到视图则热力图会放大,计算宽高的差值,将热力图便宜解决上述问题
                        //计算X Y
                        var x = (width - this._view.width) / 2;
                        var y = (height - this._view.height) / 2;
                        context.drawImage(image, x, y, this._view.width, this._view.height);
                        return canvas;
                    .bind(this));
            
        );
        createHeatMapLayer();
    );

~~~


---
##### <span id="create">三、创建热力图图层</span>
1、视图创建完成之后执行,热力图初始化,并传入图层创建函数作为回调函数,热力图初始化完毕后创建热力图图层
~~~JavaScript
//初始化热力图,视图创建完毕后执行
initHeartMapLayer(createHeatMapLayer);

/**
 * 创建热力图
 */
function createHeatMapLayer() 
    heatLayer = new HeartMapLayer(
        config: 
            "useLocalMaximum": true,
            "radius": 40,
            "gradient": 
                0.45: "rgb(000,000,255)",
                0.55: "rgb(000,255,255)",
                0.65: "rgb(000,255,000)",
                0.95: "rgb(255,255,000)",
                1.00: "rgb(255,000,000)"
            
        ,
        id : "heatLayer",
        "view": view,
        "domNodeId": "heatLayer",
        "opacity": 0.85
    );
    map.add(heatLayer);

~~~


---
##### <span id="getData">四、获取数据,生成热力图</span>
获取数据生成热力图,数据未arcgis点元素集合,调用setData函数设置数据,生成热力图

##### <span id="API">五、API</span>

Name | Parameter | Return Type | Summary
---|--- | ---|---
setData | [arcgis for js point元素集合](https://developers.arcgis.com/javascript/latest/api-reference/esri-geometry-Point.html) | 无 | 设置热力图数据,并刷新热力图图层
addDataPoint | [arcgis for js point元素](https://developers.arcgis.com/javascript/latest/api-reference/esri-geometry-Point.html) | 无 | 添加一个元素到热力图,并重新描画热力图
exportDataSet | 无 | [arcgis for js point元素集合](https://developers.arcgis.com/javascript/latest/api-reference/esri-geometry-Point.html) | 返回生成热力图的数据
clearData | 无 | 无 | 清除热力图数据,并清除热力图

如何制作炫酷的热力图

如何制作炫酷的热力图来自:http://mp.weixin.qq.com/s/s85vBmTv1GdzozQMWjY6xA2017-11-07 ArcGIS带你飞  飞言飞语 Attention “热力图”是描述趋势变化强力武器,可以将报告内容瞬间提升一个档次,不过,制作“热力... 查看详情

tableau图表大全11之热力图

文章目录热力图样式构建热力图GIF演示热力图样式热图是一种使用颜色显示数据的地图。可以在Tableau中创建它具有一个或多个维度和至少一个度量值。热图用于根据颜色比较数据。例如,销售额下降将为红色,而增长为... 查看详情

#openlayer热力图显示(代码片段)

openlayer热力图显示相关库类importmomentfrom\'moment\'importProjectionfrom\'ol/proj/Projection\'importStaticfrom\'ol/source/ImageStatic\'importMapfrom\'ol/Map\'importImageLayerfrom\'ol/layer/Image\'importViewfr 查看详情

python怎样采集微信热力图

...,进入钱包后点击【城市服务】。2)接着点击【城市热力图】,接着点击上方【搜索栏】。3)搜索找到你要去的【地方】,就可以查看到该地区的【热力图和提示 参考技术B可以私聊我~ 查看详情

openlayers6热力图(附源码下载)(代码片段)

前言之前写过一篇openlayers4版本的地图热力图文章,但是由于是封装一层js代码写的,很多初学者看起来比较有点吃力,所以本篇文章重新写一篇地图热力图文章,直接基于最新版本openlayers6写的,纯粹html+js+css形式,没有任何封... 查看详情

r语言ggplot2可视化热力图(heatmap)自定义配置图例标签为百分比进行热力图颜色渐变显示(legendtodisplaypercentagesign)

R语言ggplot2可视化热力图(heatmap)、自定义配置图例标签为百分比进行热力图颜色渐变显示(legendtodisplaypercentagesign)目录 查看详情

空间数据可视化:3.空间热力图

1.powermap 对于热力图它跟空间柱状图是差不多的,也是空间位置+value值;如果只有空间位置,可能求的是密度图,就是我们之前用python中的seaborn做的两个维度的密度图,其实就是热力图的意思;两个维度的密度图就是热力图&... 查看详情

pythonpyecharts地理坐标热力图geo

参考技术A@[toc] 查看详情

r语言绘图:在地图上绘制热力图

使用ggplot2在地图上绘制热力图######*****绘制热力图代码*****#######interval<-seq(0,150000,25000)[-2]#设置价格区间newpri<-cut(data1$price,interval,labels=F)#设置价格为因子类型newpri<-factor(newpri,levels=1:5,labels=c("250 查看详情

利用python创作热力图

1.引言热力图,是一种通过对色块着色来显示数据的统计图表。绘图时,需指定颜色映射的规则。例如,较大的值由较深的颜色表示,较小的值由较浅的颜色表示;较大的值由偏暖的颜色表示,较小的值由较冷的颜色表示,等等... 查看详情

python热力图绘制方法—新手教程

参考技术A#Python热力图绘制方法热力图的使用场景有 1.描述数据在空间的密集程度,常见有城市热力图,区域热力图2.描述多个变量之间相关性高低程度#step1准备数据集,读取excel列表内容,usecols=index,这里是表里的第一列不... 查看详情

地理县级热力图

】地理县级热力图【英文标题】:Geographicalcountylevelheatmap【发布时间】:2017-09-2509:58:14【问题描述】:我经常需要在R中创建地理热图。目前,我一直在我的办公室计算机中使用许可版本的Tableau来执行此操作,它做得非常好。但... 查看详情

r使用热力图(heatmap)可视化数据集(代码片段)

R使用热力图(heatmap)可视化数据集R使用热力图(heatmap)可视化数据集#安装、加载包install.packages(\'RNHANES\')library(RNHANES)library(tidyverse)******************************************************************************Warningmes 查看详情

热力图,数据库和数据仓库

热力图数据表里多个特征两两的相似度输入数据参数:矩阵,array,dataFrame(df)df.index,df.column=heatmap.column,heatmap.rowsvmax,vmin对应颜色取值的范围热力图矩阵块注释参数annot数据库传统的关系型数据库的主要应用,主要是... 查看详情

腾讯地图热力图使用

采用腾讯地图的热力组件库,引入腾讯地图就不多赘述了,本篇主要讲如何使用重点:热力高低只能通过相邻比较近的热力点的多少来控制,所以要想实现热力较高的区域,可以通过增加周围热力点的数量来实现<divid="topMe... 查看详情

python绘制热力图(代码片段)

最近在建模时有绘制相关系数矩阵热力图的需要,在此记录一下热力图的基本使用这里使用seaborn库中的的heatmap完成热力图的绘制,我们可以根据图中不同方块颜色来判断变量之间相关系数的大小,接下来介绍heatmap的... 查看详情

r可视化使用ggplot2创建样本数据热力图(heatmap)

R可视化使用ggplot2创建样本数据热力图(heatmap)目录R可视化使用ggplot2创建样本数据热力图(heatmap)数据加载及变形 查看详情

百度地图热力图

 <scripttype="text/javascript"src="//api.map.baidu.com/api?ak=LGiD08FQSqYhur2nOx6oK0gUod2K1TNA&v=2.0"></script><scripttype="text/javascript"src="http://api.map.baidu.com/librar 查看详情