heatmap for arcgisjsapi

在arcgis for js api 环境下使用heatmap插件。

 

由于最新的heatmap没有提供 for arcgisjsapi  插件,懒得研究新版本代码,所以这里用的还是老版本的heatmap。

 

但是老的版本插件有个问题,就是在点聚合计算的时候是按照原坐标点分组的,这就造成当坐标值的精度很高时,所有的点都会单独作为一组,无论两个点相距多近。最终的结果就是地图上的每一个点都会是最高值,地图看起来是这样的。

 

 

解决方法就是 在 parseHeatmapData 方法中做干预,让其按照屏幕坐标分组而不是更为精确的经纬度(如果希望容差更大,还可以对屏幕坐标做四舍五入,容差增大十倍)。

修改后的parseHeatmapData  方法

复制代码
parseHeatmapData: function (dataPoints) {
            // variables
            var i, parsedData, dataPoint;
            // if data points exist
            if (dataPoints) {
                // create parsed data object
                parsedData = {
                    max: 0,
                    data: []
                };
                if (!this.config.useLocalMaximum) {
                    parsedData.max = this.globalMax;
                }
                 
                // for each data point
                for (i = 0; i < dataPoints.length; i++) {
                    // create geometry point
                    vdataPoint = esri.geometry.Point(dataPoints[i].geometry);
                    dataPoint = esri.geometry.toScreenGeometry(this._map.extent, this._map.width, this._map.height, vdataPoint);
                    //dataPoint
                    // if array value is undefined
                    if (!parsedData.data[dataPoint.x]) {
                        // create empty array value
                        parsedData.data[dataPoint.x] = [];
                    }
                    // array value array is undefined
                    if (!parsedData.data[dataPoint.x][dataPoint.y]) {
                        // create object in array
                        parsedData.data[dataPoint.x][dataPoint.y] = {};
                        // if count is defined in datapoint
                        if (dataPoint.hasOwnProperty('count')) {
                            // create array value with count of count set in datapoint
                            parsedData.data[dataPoint.x][dataPoint.y].count = dataPoint.count;
                        } else {
                            // create array value with count of 0
                            parsedData.data[dataPoint.x][dataPoint.y].count = 0;
                        }
                    }
                    // add 1 to the count
                    parsedData.data[dataPoint.x][dataPoint.y].count += 1;
                    // store dataPoint var
                    parsedData.data[dataPoint.x][dataPoint.y].dataPoint = vdataPoint;
                    // if count is greater than current max
                    if (parsedData.max < parsedData.data[dataPoint.x][dataPoint.y].count) {
                        // set max to this count
                        parsedData.max = parsedData.data[dataPoint.x][dataPoint.y].count;
                        if (!this.config.useLocalMaximum) {
                            this.globalMax = parsedData.data[dataPoint.x][dataPoint.y].count;
                        }
                    }
                }
                // convert parsed data into heatmap plugin formatted data
                this.convertHeatmapData(parsedData);
            }
        },
复制代码

 

修改后的效果:

 

posted @   leechg  阅读(1702)  评论(4编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示