kronick / HexgridHeatmap

A hexgrid-based heatmap for Mapbox GL JS
30 stars 10 forks source link

Heatmap based on values instead density #1

Open ktugan opened 7 years ago

ktugan commented 7 years ago

I love the library and would like to make a feature request to build a heatmap from values. Here a superior argument from somebody else (from https://github.com/mapbox/mapbox-gl-js/issues/4756):

by default, heatmaps render according to point density (so two points in the same spot are twice as intense as one). But there are cases where we want a different behavior — imagine an air pollution map that shows measurements from spots around the country. Multiple measure points clustered close together shouldn't cause the area to appear many times more polluted compared to an area with the same pollution but only one measure spot.[...]

I can imagine it would work like this:

    var heatmap = new HexgridHeatmap(map, "hexgrid-heatmap", "waterway-label");
    heatmap.setType('value'); // or 'density' which is default
    heatmap.setWeightProperty('airPollutionLevel'); // a property in each Feature of the FeatureCollection
    heatmap.setReduceFunction('mean'); // 'median' or even a function which accepts values

    //normal init from before
    heatmap.setIntensity(6);
    heatmap.setSpread(0.15); //
    heatmap.setCellDensity(0.5); // small value == bigger hexagons
    heatmap.setData(berlinData);
    heatmap.update();

I assume clustering logic would need little or no changing, but instead of counting all objects are iterated through, the value from the property extracted and the reduce function called.

ktugan commented 7 years ago

I implemented my own version of a value based heatmap in a fork without any regards for best practices (since I am not familiar with the javascript ecosystem).

here the diff: https://github.com/ktugan/HexgridHeatmap/commit/7cfa0ec222f72c4abe30c3c74223bbcb0079c615

kronick commented 7 years ago

@ktugan Thanks for taking a crack at adding in this functionality. Your code style is good, but you get rid of the gaussian kernel calculation that makes this work as a heatmap: https://github.com/ktugan/HexgridHeatmap/commit/7cfa0ec222f72c4abe30c3c74223bbcb0079c615#diff-feb43b13521636d30c38958cccf95c91L166

This creates artifacts like those seen here: image

If you add in this kernel with your property value code, make a PR to this repo and I will work it in.