直角坐标系下利用geo地理坐标系组件构建的热力图

下面图1为echarts官网上的一个实例,简单的利用点坐标进行热力图渲染,略显粗糙,不是很符合项目要求,图2为在echarts gallery上找到的一个热力图实例。

图1

图2
下面为图2的配置项:

var axisdata = [];
for (var i = -5; i < 5; i++) {
    axisdata.push(i)
}

function makeHeatData() {
    let maxDegree = 360
    let points = []
    let radius = 5
    let buildPoints = function(radius) {
        let degree = maxDegree / (radius * 8)
        for (let i = 1; i < maxDegree; i += degree) {
            points.push(
                [
                    Math.sin(i) * radius,
                    Math.cos(i) * radius,
                    i
                ]
            )
        }
    }
    for (let i = 1; i <= 5; i++) {
        buildPoints(i)
    }
    return points;
}
var data = makeHeatData();
option = {
    tooltip: {
        show: true
    },
    geo: [{
        map: 'world',
        zoom: 0,
        roam: true,
        show: false,
        id: 'geo1',
        itemStyle: {
            areaColor: 'rgb(0,0,0,0)'
        },
        height: '100%'
    }],
    grid: {
        show: true,
        height: '62%',
        width: '50%',
        top: '20%',
        left: 'center',
        borderColor: 'rgb(0,0,0,0)'
    },
    animation: false,
    xAxis: {
        type: 'value',
        data: axisdata
    },
    yAxis: {
        type: 'value',
        data: axisdata
    },
    series: [{
        id: 'test',
        name: "fs",
        type: 'heatmap',
        coordinateSystem: 'cartesian2d',
        data: data,
        gridIndex: 0,
        itemStyle: {
            show: true,
            color: 'rgb(0,0,0,0)'//不显示
        }
    }, ]

};

myChart.setOption(option);

function convertToPx(dataitem) {
    var newxy = myChart.convertToPixel({
        seriesId: 'test'
    }, dataitem);
    return newxy
}

function convertToGeo(dataitem) {
    var pointobj = myChart.convertFromPixel({
        geoId: 'geo1'
    }, convertToPx(dataitem));
    var point = [pointobj[0], pointobj[1]];
    return point;
}

function convertData(data, x, y) {
    var convertedData = [];
    x = Math.ceil(x);
    y = Math.ceil(y);
    for (var i = 0; i < data.length; i++) {
        if (data[i][0] >= x && data[i][1] >= y) {
            var geoCoord = convertToGeo([data[i][0], data[i][1]]);
            geoCoord.push(data[i][2]); //
            convertedData.push(geoCoord);
        }
    }
    return convertedData;
}
var cusdata = convertData(data, -6, -6);
setTimeout(function() {
    myChart.setOption({
        series: [{
            name: 'testheatmap',
            type: 'heatmap',
            id: 'testheatmap',
            coordinateSystem: 'geo',
            seriesIndex: 1,
            geoIndex: 0,
            data: cusdata,
            blurSize: 20,
            pointSize: 20
        }, ],
        visualMap: {
            show: true,
            top: 'bottom',
            seriesIndex: 1,
            calculable: true,
            min: 0,
            max: 250,
            inRange: {
                color: ['blue', 'green', 'yellow', 'red']
            }
        }
    });
}, 500);

主要是利用pointSizeblurSize来调整热力图每个点的大小和每个点模糊的大小,但是由于这两个属性只在地理坐标系(coordinateSystem: ‘geo’)上有效,所以需要将坐标转化到地理坐标系。

主要思路(个人理解):先将直角坐标系上的点坐标转化为像素坐标值,再将该像素坐标值转化为地理坐标系的点坐标值,然后通过geoCoord.push(data[i][2]);将该坐标点的热力值赋值给地理坐标点,以此来确保坐标点的热力值不变。最后通过blurSize和pointSize来调整点模糊的大小和点的大小,通过visualMap来调整视觉映射的颜色等等。

几个主要方法:
1.myChart.convertToPixel() --> 转换坐标系上的点到像素坐标值

myChart.convertToPixel({
        seriesId: 'test'
    }, dataitem);

参数1:用于指示『使用哪个坐标系进行转换』。 通常地,可以使用 index 或者 id 或者 name 来定位。
参数2:要被转换的值
return: 转换的结果为像素坐标值

2.myChart.convertFromPixel() --> 转换像素坐标值到逻辑坐标系上的点,是convertToPixel的逆运算。

myChart.convertFromPixel({
        geoId: 'geo1'
    }, convertToPx(dataitem));

参数1:用于指示『使用哪个坐标系进行转换』
参数2:要被转换的值,为像素坐标值
return: 转换的结果,为逻辑坐标值

Echarts常用API参考链接:Echarts常用API(echarts和echartsInstance)

Logo

前往低代码交流专区

更多推荐