From c9084304aef6edca42dd87f423f245d92709e942 Mon Sep 17 00:00:00 2001 From: Derek Johnston Date: Mon, 29 Feb 2016 15:49:21 -0500 Subject: [PATCH 01/15] Imported heatmap example, source --- examples/heatmap/example.json | 9 + examples/heatmap/index.jade | 1 + examples/heatmap/main.css | 0 examples/heatmap/main.js | 534 ++++++++++++++++++++++++++++++++++ sources.json | 6 +- src/canvas/heatmap.js | 173 +++++++++++ src/core/heatmap.js | 102 +++++++ 7 files changed, 823 insertions(+), 2 deletions(-) create mode 100644 examples/heatmap/example.json create mode 100644 examples/heatmap/index.jade create mode 100644 examples/heatmap/main.css create mode 100644 examples/heatmap/main.js create mode 100644 src/canvas/heatmap.js create mode 100644 src/core/heatmap.js diff --git a/examples/heatmap/example.json b/examples/heatmap/example.json new file mode 100644 index 0000000000..e30d0064ef --- /dev/null +++ b/examples/heatmap/example.json @@ -0,0 +1,9 @@ +{ + "path": "heatmap", + "title": "Heatmap Feature", + "exampleCss": ["main.css"], + "exampleJs": ["main.js"], + "about": { + "text": "This example shows how to add a heatmap to a map." + } +} diff --git a/examples/heatmap/index.jade b/examples/heatmap/index.jade new file mode 100644 index 0000000000..a2432ab791 --- /dev/null +++ b/examples/heatmap/index.jade @@ -0,0 +1 @@ +extends ../common/templates/index.jade diff --git a/examples/heatmap/main.css b/examples/heatmap/main.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/examples/heatmap/main.js b/examples/heatmap/main.js new file mode 100644 index 0000000000..afeda85ac9 --- /dev/null +++ b/examples/heatmap/main.js @@ -0,0 +1,534 @@ +var heatmapDebug = {}; + +// Run after the DOM loads +$(function () { + 'use strict'; + + var map = geo.map({ + node: '#map', + center: { + x: -122.0, + y: 37 + }, + zoom: 4 + }); + + var data = [ + [37.782551, -122.445368], + [37.782745, -122.444586], + [37.782842, -122.443688], + [37.782919, -122.442815], + [37.782992, -122.442112], + [37.783100, -122.441461], + [37.783206, -122.440829], + [37.783273, -122.440324], + [37.783316, -122.440023], + [37.783357, -122.439794], + [37.783371, -122.439687], + [37.783368, -122.439666], + [37.783383, -122.439594], + [37.783508, -122.439525], + [37.783842, -122.439591], + [37.784147, -122.439668], + [37.784206, -122.439686], + [37.784386, -122.439790], + [37.784701, -122.439902], + [37.784965, -122.439938], + [37.785010, -122.439947], + [37.785360, -122.439952], + [37.785715, -122.440030], + [37.786117, -122.440119], + [37.786564, -122.440209], + [37.786905, -122.440270], + [37.786956, -122.440279], + [37.800224, -122.433520], + [37.800155, -122.434101], + [37.800160, -122.434430], + [37.800378, -122.434527], + [37.800738, -122.434598], + [37.800938, -122.434650], + [37.801024, -122.434889], + [37.800955, -122.435392], + [37.800886, -122.435959], + [37.800811, -122.436275], + [37.800788, -122.436299], + [37.800719, -122.436302], + [37.800702, -122.436298], + [37.800661, -122.436273], + [37.800395, -122.436172], + [37.800228, -122.436116], + [37.800169, -122.436130], + [37.800066, -122.436167], + [37.784345, -122.422922], + [37.784389, -122.422926], + [37.784437, -122.422924], + [37.784746, -122.422818], + [37.785436, -122.422959], + [37.786120, -122.423112], + [37.786433, -122.423029], + [37.786631, -122.421213], + [37.786660, -122.421033], + [37.786801, -122.420141], + [37.786823, -122.420034], + [37.786831, -122.419916], + [37.787034, -122.418208], + [37.787056, -122.418034], + [37.787169, -122.417145], + [37.787217, -122.416715], + [37.786144, -122.416403], + [37.785292, -122.416257], + [37.780666, -122.390374], + [37.780501, -122.391281], + [37.780148, -122.392052], + [37.780173, -122.391148], + [37.780693, -122.390592], + [37.781261, -122.391142], + [37.781808, -122.391730], + [37.782340, -122.392341], + [37.782812, -122.393022], + [37.783300, -122.393672], + [37.783809, -122.394275], + [37.784246, -122.394979], + [37.784791, -122.395958], + [37.785675, -122.396746], + [37.786262, -122.395780], + [37.786776, -122.395093], + [37.787282, -122.394426], + [37.787783, -122.393767], + [37.788343, -122.393184], + [37.788895, -122.392506], + [37.789371, -122.391701], + [37.789722, -122.390952], + [37.790315, -122.390305], + [37.790738, -122.389616], + [37.779448, -122.438702], + [37.779023, -122.438585], + [37.778542, -122.438492], + [37.778100, -122.438411], + [37.777986, -122.438376], + [37.777680, -122.438313], + [37.777316, -122.438273], + [37.777135, -122.438254], + [37.776987, -122.438303], + [37.776946, -122.438404], + [37.776944, -122.438467], + [37.776892, -122.438459], + [37.776842, -122.438442], + [37.776822, -122.438391], + [37.776814, -122.438412], + [37.776787, -122.438628], + [37.776729, -122.438650], + [37.776759, -122.438677], + [37.776772, -122.438498], + [37.776787, -122.438389], + [37.776848, -122.438283], + [37.776870, -122.438239], + [37.777015, -122.438198], + [37.777333, -122.438256], + [37.777595, -122.438308], + [37.777797, -122.438344], + [37.778160, -122.438442], + [37.778414, -122.438508], + [37.778445, -122.438516], + [37.778503, -122.438529], + [37.778607, -122.438549], + [37.778670, -122.438644], + [37.778847, -122.438706], + [37.779240, -122.438744], + [37.779738, -122.438822], + [37.780201, -122.438882], + [37.780400, -122.438905], + [37.780501, -122.438921], + [37.780892, -122.438986], + [37.781446, -122.439087], + [37.781985, -122.439199], + [37.782239, -122.439249], + [37.782286, -122.439266], + [37.797847, -122.429388], + [37.797874, -122.429180], + [37.797885, -122.429069], + [37.797887, -122.429050], + [37.797933, -122.428954], + [37.798242, -122.428990], + [37.798617, -122.429075], + [37.798719, -122.429092], + [37.798944, -122.429145], + [37.799320, -122.429251], + [37.799590, -122.429309], + [37.799677, -122.429324], + [37.799966, -122.429360], + [37.800288, -122.429430], + [37.800443, -122.429461], + [37.800465, -122.429474], + [37.800644, -122.429540], + [37.800948, -122.429620], + [37.801242, -122.429685], + [37.801375, -122.429702], + [37.801400, -122.429703], + [37.801453, -122.429707], + [37.801473, -122.429709], + [37.801532, -122.429707], + [37.801852, -122.429729], + [37.802173, -122.429789], + [37.802459, -122.429847], + [37.802554, -122.429825], + [37.802647, -122.429549], + [37.802693, -122.429179], + [37.802729, -122.428751], + [37.766104, -122.409291], + [37.766103, -122.409268], + [37.766138, -122.409229], + [37.766183, -122.409231], + [37.766153, -122.409276], + [37.766005, -122.409365], + [37.765897, -122.409570], + [37.765767, -122.409739], + [37.765693, -122.410389], + [37.765615, -122.411201], + [37.765533, -122.412121], + [37.765467, -122.412939], + [37.765444, -122.414821], + [37.765444, -122.414964], + [37.765318, -122.415424], + [37.763961, -122.415296], + [37.763115, -122.415196], + [37.762967, -122.415183], + [37.762278, -122.415127], + [37.761675, -122.415055], + [37.760932, -122.414988], + [37.759337, -122.414862], + [37.773187, -122.421922], + [37.773043, -122.422118], + [37.773007, -122.422165], + [37.772979, -122.422219], + [37.772865, -122.422394], + [37.772779, -122.422503], + [37.772676, -122.422701], + [37.772606, -122.422806], + [37.772566, -122.422840], + [37.772508, -122.422852], + [37.772387, -122.423011], + [37.772099, -122.423328], + [37.771704, -122.423783], + [37.771481, -122.424081], + [37.771400, -122.424179], + [37.771352, -122.424220], + [37.771248, -122.424327], + [37.770904, -122.424781], + [37.770520, -122.425283], + [37.770337, -122.425553], + [37.770128, -122.425832], + [37.769756, -122.426331], + [37.769300, -122.426902], + [37.769132, -122.427065], + [37.769092, -122.427103], + [37.768979, -122.427172], + [37.768595, -122.427634], + [37.768372, -122.427913], + [37.768337, -122.427961], + [37.768244, -122.428138], + [37.767942, -122.428581], + [37.767482, -122.429094], + [37.767031, -122.429606], + [37.766732, -122.429986], + [37.766680, -122.430058], + [37.766633, -122.430109], + [37.766580, -122.430211], + [37.766367, -122.430594], + [37.765910, -122.431137], + [37.765353, -122.431806], + [37.764962, -122.432298], + [37.764868, -122.432486], + [37.764518, -122.432913], + [37.763435, -122.434173], + [37.762847, -122.434953], + [37.762291, -122.435935], + [37.762224, -122.436074], + [37.761957, -122.436892], + [37.761652, -122.438886], + [37.761284, -122.439955], + [37.761210, -122.440068], + [37.761064, -122.440720], + [37.761040, -122.441411], + [37.761048, -122.442324], + [37.760851, -122.443118], + [37.759977, -122.444591], + [37.759913, -122.444698], + [37.759623, -122.445065], + [37.758902, -122.445158], + [37.758428, -122.444570], + [37.757687, -122.443340], + [37.757583, -122.443240], + [37.757019, -122.442787], + [37.756603, -122.442322], + [37.756380, -122.441602], + [37.755790, -122.441382], + [37.754493, -122.442133], + [37.754361, -122.442206], + [37.753719, -122.442650], + [37.753096, -122.442915], + [37.751617, -122.443211], + [37.751496, -122.443246], + [37.750733, -122.443428], + [37.750126, -122.443536], + [37.750103, -122.443784], + [37.750390, -122.444010], + [37.750448, -122.444013], + [37.750536, -122.444040], + [37.750493, -122.444141], + [37.790859, -122.402808], + [37.790864, -122.402768], + [37.790995, -122.402539], + [37.791148, -122.402172], + [37.791385, -122.401312], + [37.791405, -122.400776], + [37.791288, -122.400528], + [37.791113, -122.400441], + [37.791027, -122.400395], + [37.791094, -122.400311], + [37.791211, -122.400183], + [37.791060, -122.399334], + [37.790538, -122.398718], + [37.790095, -122.398086], + [37.789644, -122.397360], + [37.789254, -122.396844], + [37.788855, -122.396397], + [37.788483, -122.395963], + [37.788015, -122.395365], + [37.787558, -122.394735], + [37.787472, -122.394323], + [37.787630, -122.394025], + [37.787767, -122.393987], + [37.787486, -122.394452], + [37.786977, -122.395043], + [37.786583, -122.395552], + [37.786540, -122.395610], + [37.786516, -122.395659], + [37.786378, -122.395707], + [37.786044, -122.395362], + [37.785598, -122.394715], + [37.785321, -122.394361], + [37.785207, -122.394236], + [37.785751, -122.394062], + [37.785996, -122.393881], + [37.786092, -122.393830], + [37.785998, -122.393899], + [37.785114, -122.394365], + [37.785022, -122.394441], + [37.784823, -122.394635], + [37.784719, -122.394629], + [37.785069, -122.394176], + [37.785500, -122.393650], + [37.785770, -122.393291], + [37.785839, -122.393159], + [37.782651, -122.400628], + [37.782616, -122.400599], + [37.782702, -122.400470], + [37.782915, -122.400192], + [37.783137, -122.399887], + [37.783414, -122.399519], + [37.783629, -122.399237], + [37.783688, -122.399157], + [37.783716, -122.399106], + [37.783798, -122.399072], + [37.783997, -122.399186], + [37.784271, -122.399538], + [37.784577, -122.399948], + [37.784828, -122.400260], + [37.784999, -122.400477], + [37.785113, -122.400651], + [37.785155, -122.400703], + [37.785192, -122.400749], + [37.785278, -122.400839], + [37.785387, -122.400857], + [37.785478, -122.400890], + [37.785526, -122.401022], + [37.785598, -122.401148], + [37.785631, -122.401202], + [37.785660, -122.401267], + [37.803986, -122.426035], + [37.804102, -122.425089], + [37.804211, -122.424156], + [37.803861, -122.423385], + [37.803151, -122.423214], + [37.802439, -122.423077], + [37.801740, -122.422905], + [37.801069, -122.422785], + [37.800345, -122.422649], + [37.799633, -122.422603], + [37.799750, -122.421700], + [37.799885, -122.420854], + [37.799209, -122.420607], + [37.795656, -122.400395], + [37.795203, -122.400304], + [37.778738, -122.415584], + [37.778812, -122.415189], + [37.778824, -122.415092], + [37.778833, -122.414932], + [37.778834, -122.414898], + [37.778740, -122.414757], + [37.778501, -122.414433], + [37.778182, -122.414026], + [37.777851, -122.413623], + [37.777486, -122.413166], + [37.777109, -122.412674], + [37.776743, -122.412186], + [37.776440, -122.411800], + [37.776295, -122.411614], + [37.776158, -122.411440], + [37.775806, -122.410997], + [37.775422, -122.410484], + [37.775126, -122.410087], + [37.775012, -122.409854], + [37.775164, -122.409573], + [37.775498, -122.409180], + [37.775868, -122.408730], + [37.776256, -122.408240], + [37.776519, -122.407928], + [37.776539, -122.407904], + [37.776595, -122.407854], + [37.776853, -122.407547], + [37.777234, -122.407087], + [37.777644, -122.406558], + [37.778066, -122.406017], + [37.778468, -122.405499], + [37.778866, -122.404995], + [37.779295, -122.404455], + [37.779695, -122.403950], + [37.779982, -122.403584], + [37.780295, -122.403223], + [37.780664, -122.402766], + [37.781043, -122.402288], + [37.781399, -122.401823], + [37.781727, -122.401407], + [37.781853, -122.401247], + [37.781894, -122.401195], + [37.782076, -122.400977], + [37.782338, -122.400603], + [37.782666, -122.400133], + [37.783048, -122.399634], + [37.783450, -122.399198], + [37.783791, -122.398998], + [37.784177, -122.398959], + [37.784388, -122.398971], + [37.784404, -122.399128], + [37.784586, -122.399524], + [37.784835, -122.399927], + [37.785116, -122.400307], + [37.785282, -122.400539], + [37.785346, -122.400692], + [37.765769, -122.407201], + [37.765790, -122.407414], + [37.765802, -122.407755], + [37.765791, -122.408219], + [37.765763, -122.408759], + [37.765726, -122.409348], + [37.765716, -122.409882], + [37.765708, -122.410202], + [37.765705, -122.410253], + [37.765707, -122.410369], + [37.765692, -122.410720], + [37.765699, -122.411215], + [37.765687, -122.411789], + [37.765666, -122.412373], + [37.765598, -122.412883], + [37.765543, -122.413039], + [37.765532, -122.413125], + [37.765500, -122.413553], + [37.765448, -122.414053], + [37.765388, -122.414645], + [37.765323, -122.415250], + [37.765303, -122.415847], + [37.765251, -122.416439], + [37.765204, -122.417020], + [37.765172, -122.417556], + [37.765164, -122.418075], + [37.765153, -122.418618], + [37.765136, -122.419112], + [37.765129, -122.419378], + [37.765119, -122.419481], + [37.765100, -122.419852], + [37.765083, -122.420349], + [37.765045, -122.420930], + [37.764992, -122.421481], + [37.764980, -122.421695], + [37.764993, -122.421843], + [37.764986, -122.422255], + [37.764975, -122.422823], + [37.764939, -122.423411], + [37.764902, -122.424014], + [37.764853, -122.424576], + [37.764826, -122.424922], + [37.764796, -122.425375], + [37.764782, -122.425869], + [37.764768, -122.426089], + [37.764766, -122.426117], + [37.764723, -122.426276], + [37.764681, -122.426649], + [37.782012, -122.404200], + [37.781574, -122.404911], + [37.781055, -122.405597], + [37.780479, -122.406341], + [37.779996, -122.406939], + [37.779459, -122.407613], + [37.778953, -122.408228], + [37.778409, -122.408839], + [37.777842, -122.409501], + [37.777334, -122.410181], + [37.776809, -122.410836], + [37.776240, -122.411514], + [37.775725, -122.412145], + [37.775190, -122.412805], + [37.774672, -122.413464], + [37.774084, -122.414186], + [37.773533, -122.413636], + [37.773021, -122.413009], + [37.772501, -122.412371], + [37.771964, -122.411681], + [37.771479, -122.411078], + [37.770992, -122.410477], + [37.770467, -122.409801], + [37.770090, -122.408904], + [37.769657, -122.408103], + [37.769132, -122.407276], + [37.768564, -122.406469], + [37.767980, -122.405745], + [37.767380, -122.405299], + [37.766604, -122.405297], + [37.765838, -122.405200], + [37.765139, -122.405139], + [37.764457, -122.405094], + [37.763716, -122.405142], + [37.762932, -122.405398], + [37.762126, -122.405813], + [37.761344, -122.406215], + [37.760556, -122.406495], + [37.759732, -122.406484], + [37.758910, -122.406228], + [37.758182, -122.405695], + [37.757676, -122.405118], + [37.757039, -122.404346], + [37.756335, -122.403719], + [37.755503, -122.403406], + [37.754665, -122.403242], + [37.753837, -122.403172], + [37.752986, -122.403112], + [37.751266, -122.403355] + ]; + + var layer = map.createLayer('feature', {renderer: 'canvas'}); + var heatmap = layer.createFeature('heatmap') + .position(function (d) { + return { + x: d[1], + y: d[0] + }; + }).data(data); + + map.draw(); + + heatmapDebug.map = map; + heatmapDebug.layer = layer; + heatmapDebug.heatmap = heatmap; + console.log(heatmapDebug); +}); diff --git a/sources.json b/sources.json index fced1bb789..839a79b546 100644 --- a/sources.json +++ b/sources.json @@ -41,7 +41,8 @@ "renderer.js", "osmLayer.js", "domRenderer.js", - "choroplethFeature.js" + "choroplethFeature.js", + "heatmap.js" ] }, "geo.util": { @@ -77,7 +78,8 @@ "init.js", "quadFeature.js", "canvasRenderer.js", - "tileLayer.js" + "tileLayer.js", + "heatmap.js" ] }, "geo.d3": { diff --git a/src/canvas/heatmap.js b/src/canvas/heatmap.js new file mode 100644 index 0000000000..7631a02ece --- /dev/null +++ b/src/canvas/heatmap.js @@ -0,0 +1,173 @@ +////////////////////////////////////////////////////////////////////////////// +/** + * Create a new instance of class heatmap + * + * @class + * @param {Object} arg Options object + * @extends geo.heatmap + * @returns {geo.canvas.heatmap} + */ +////////////////////////////////////////////////////////////////////////////// +geo.canvas.heatmap = function (arg) { + 'use strict'; + + if (!(this instanceof geo.canvas.heatmap)) { + return new geo.canvas.heatmap(arg); + } + geo.heatmap.call(this, arg); + + //////////////////////////////////////////////////////////////////////////// + /** + * @private + */ + //////////////////////////////////////////////////////////////////////////// + var m_this = this, + s_exit = this._exit, + s_init = this._init, + s_update = this._update; + + //////////////////////////////////////////////////////////////////////////// + /** + * Build + * @override + */ + //////////////////////////////////////////////////////////////////////////// + this._build = function () { + s_update.call(m_this); + return m_this; + }; + + //////////////////////////////////////////////////////////////////////////// + /** + * Meta functions for converting from geojs styles to canvas. + * @private + */ + //////////////////////////////////////////////////////////////////////////// + this._convertColor = function (c) { + var rgb; + if (c.hasOwnProperty('r') && + c.hasOwnProperty('g') && + c.hasOwnProperty('b')) { + rgb = d3.rgb(255 * c.r, 255 * c.g, 255 * c.b).toString(); + } + return rgb; + }; + + this._gradient = function () { + var canvas = document.createElement('canvas'), + context = canvas.getContext('2d'), + gradient = context.createLinearGradient(0, 0, 0, 256), + colors = m_this.style('color'); + + canvas.width = 1; + canvas.height = 256; + + for (var stop in colors) { + gradient.addColorStop(stop, m_this._convertColor(colors[stop])); + } + + context.fillStyle = gradient; + context.fillRect(0, 0, 1, 256); + + m_this._grad = context.getImageData(0, 0, 1, 256).data; + + return m_this; + }; + + this._radius = function () { + var circle = m_this._circle = document.createElement('canvas'), + ctx = circle.getContext('2d'), + r = m_this.style('radius'), + blur = m_this.style('blurRadius'); + + var r2 = blur + r; + + circle.width = circle.height = r2 * 2; + ctx.shadowOffsetX = ctx.shadowOffsetY = r2 * 2; + ctx.shadowBlur = blur; + ctx.shadowColor = 'black'; + + ctx.beginPath(); + ctx.arc(-r2, -r2, r, 0, Math.PI * 2, true); + ctx.closePath(); + ctx.fill(); + + return m_this; + }; + + this._colorize = function (pixels, gradient) { + for (var i = 0; i < pixels.length; i+=4) { + var j = pixels[i + 3] * 4; + if (j) { + console.log(pixels[i+3], gradient, gradient[i+3]); + } + if (j) { + pixels[i] = gradient[j]; + pixels[i+1] = gradient[j+1]; + pixels[i+2] = gradient[j+2]; + } + } + }; + + this._renderOnCanvas = function (context2d, map) { + var data = m_this.data() || []; + m_this._radius(); + m_this._gradient(); + var radius = m_this.style('radius'); + data.map(m_this.position()).map(function (p) { + var p = m_this.layer().map().gcsToDisplay(p, null); + context2d.globalAlpha = Math.max(.05) + context2d.drawImage(m_this._circle, p.x - radius, p.y - radius); + }); + + var pixelArray = context2d.getImageData(0, 0, 1000, 1000); + m_this._colorize(pixelArray.data, m_this._grad); + context2d.putImageData(pixelArray, 0, 0) + return m_this; + }; + + //////////////////////////////////////////////////////////////////////////// + /** + * Initialize + * @protected + */ + //////////////////////////////////////////////////////////////////////////// + this._init = function () { + s_init.call(m_this, arg); //doesn't this get called implicitly by geo.heatmap.call TODO ? + return m_this; + }; + + //////////////////////////////////////////////////////////////////////////// + /** + * Update + * @protected + */ + //////////////////////////////////////////////////////////////////////////// + this._update = function () { + s_update.call(m_this); + if (m_this.buildTime().getMTime() <= m_this.dataTime().getMTime() || + m_this.updateTime().getMTime() < m_this.getMTime()) { + m_this._build(); + } + m_this.updateTime().modified(); + return m_this; + }; + + //////////////////////////////////////////////////////////////////////////// + /** + * Destroy + * @protected + */ + //////////////////////////////////////////////////////////////////////////// + this._exit = function () { + s_exit.call(m_this); + }; + + m_this._init(arg); + return this; +}; + +inherit(geo.canvas.heatmap, geo.heatmap); + +// Now register it +geo.registerFeature('canvas', 'heatmap', geo.canvas.heatmap); diff --git a/src/core/heatmap.js b/src/core/heatmap.js new file mode 100644 index 0000000000..b627624edb --- /dev/null +++ b/src/core/heatmap.js @@ -0,0 +1,102 @@ +////////////////////////////////////////////////////////////////////////////// +/** + * Create a new instance of class heatmap + * + * @class + * @extends geo.feature + * @returns {geo.heatmap} + * + */ +////////////////////////////////////////////////////////////////////////////// +geo.heatmap = function (arg) { + 'use strict'; + if (!(this instanceof geo.heatmap)){ + return new geo.heatmap(arg); + } + arg = arg || {}; + geo.feature.call(this, arg); + + //////////////////////////////////////////////////////////////////////////// + /** + * @private + */ + //////////////////////////////////////////////////////////////////////////// + var m_this = this, + m_position, + m_intensity, + s_init = this._init, + s_data = this.data; + + m_position = arg.position || function (d) { return d; }; + m_intensity = arg.intensity || function (d) { return 1; }; + + //////////////////////////////////////////////////////////////////////////// + /** + * Get/Set position accessor + * + * @returns {geo.heatmap} + */ + //////////////////////////////////////////////////////////////////////////// + this.position = function (val) { + if (val === undefined) { + return m_position; + } else { + m_position = val; + m_this.dataTime().modified(); + m_this.modified(); + } + return m_this; + }; + + //////////////////////////////////////////////////////////////////////////// + /** + * Get/Set intensity + * + * @returns {geo.heatmap} + */ + //////////////////////////////////////////////////////////////////////////// + this.intensity = function (val) { + if (val === undefined) { + return m_intensity; + } else { + m_intensity = val; + m_this.dataTime().modified(); + m_this.modified(); + } + return m_this; + }; + + //////////////////////////////////////////////////////////////////////////// + /** + * Initialize + */ + //////////////////////////////////////////////////////////////////////////// + this._init = function (arg) { + s_init.call(m_this, arg); + + var defaultStyle = $.extend( + {}, + { + opacity: 1, + radius: 10, + blurRadius: 10, + blur: 'Gaussian', + color: {.25: {r: 0, g: 0, b: 1}, .5: {r: 0, g: 1, b: 1}, .75: {r: 1, g: 1, b: 0}, 1: {r: 1, g: 0, b: 0}}, + maxIntensity: 1 + }, + arg.style === undefined ? {} : arg.style + ); + + m_this.style(defaultStyle); + + if (m_position) { + m_this.dataTime().modified(); + } + }; + + this._init(arg); + return this; + +}; + +inherit(geo.heatmap, geo.feature) From 8e26e19f62302098f55d0978dfefa0bf40533f40 Mon Sep 17 00:00:00 2001 From: Derek Johnston Date: Mon, 29 Feb 2016 16:01:31 -0500 Subject: [PATCH 02/15] Added attribution --- src/canvas/heatmap.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/canvas/heatmap.js b/src/canvas/heatmap.js index 7631a02ece..6c3b837bb3 100644 --- a/src/canvas/heatmap.js +++ b/src/canvas/heatmap.js @@ -1,6 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// /** * Create a new instance of class heatmap + * The rendering borrows from https://github.com/mourner/simpleheat/blob/gh-pages/simpleheat.js * * @class * @param {Object} arg Options object @@ -97,7 +98,7 @@ geo.canvas.heatmap = function (arg) { this._colorize = function (pixels, gradient) { for (var i = 0; i < pixels.length; i+=4) { - var j = pixels[i + 3] * 4; + var j = pixels[i + 3] * 4; if (j) { console.log(pixels[i+3], gradient, gradient[i+3]); } From f0108cedb2588db01ab32d48df30dcd479f44e64 Mon Sep 17 00:00:00 2001 From: Derek Johnston Date: Mon, 29 Feb 2016 16:46:09 -0500 Subject: [PATCH 03/15] Got coordinate projection working --- examples/heatmap/main.js | 4 ++-- src/canvas/heatmap.js | 7 ++----- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/examples/heatmap/main.js b/examples/heatmap/main.js index afeda85ac9..bc92e4552e 100644 --- a/examples/heatmap/main.js +++ b/examples/heatmap/main.js @@ -10,7 +10,7 @@ $(function () { x: -122.0, y: 37 }, - zoom: 4 + zoom: 10 }); var data = [ @@ -516,6 +516,7 @@ $(function () { [37.751266, -122.403355] ]; + var base = map.createLayer('osm'); var layer = map.createLayer('feature', {renderer: 'canvas'}); var heatmap = layer.createFeature('heatmap') .position(function (d) { @@ -530,5 +531,4 @@ $(function () { heatmapDebug.map = map; heatmapDebug.layer = layer; heatmapDebug.heatmap = heatmap; - console.log(heatmapDebug); }); diff --git a/src/canvas/heatmap.js b/src/canvas/heatmap.js index 6c3b837bb3..f5403b03fd 100644 --- a/src/canvas/heatmap.js +++ b/src/canvas/heatmap.js @@ -99,9 +99,6 @@ geo.canvas.heatmap = function (arg) { this._colorize = function (pixels, gradient) { for (var i = 0; i < pixels.length; i+=4) { var j = pixels[i + 3] * 4; - if (j) { - console.log(pixels[i+3], gradient, gradient[i+3]); - } if (j) { pixels[i] = gradient[j]; pixels[i+1] = gradient[j+1]; @@ -116,9 +113,9 @@ geo.canvas.heatmap = function (arg) { m_this._gradient(); var radius = m_this.style('radius'); data.map(m_this.position()).map(function (p) { - var p = m_this.layer().map().gcsToDisplay(p, null); + var pF = m_this.layer().map().gcsToDisplay(p); context2d.globalAlpha = Math.max(.05) - context2d.drawImage(m_this._circle, p.x - radius, p.y - radius); + context2d.drawImage(m_this._circle, pF.x - radius, pF.y - radius); }); var pixelArray = context2d.getImageData(0, 0, 1000, 1000); From fa2776453ae829c0925005f975f2ce3996032d31 Mon Sep 17 00:00:00 2001 From: Derek Johnston Date: Mon, 29 Feb 2016 16:47:46 -0500 Subject: [PATCH 04/15] Fixed initial zoom in heatmap example --- examples/heatmap/main.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/heatmap/main.js b/examples/heatmap/main.js index bc92e4552e..42ab46286b 100644 --- a/examples/heatmap/main.js +++ b/examples/heatmap/main.js @@ -7,8 +7,8 @@ $(function () { var map = geo.map({ node: '#map', center: { - x: -122.0, - y: 37 + x: -122.445, + y: 37.8 }, zoom: 10 }); From e4750bd58fdbac4891d43680a00b8f28756a5b6b Mon Sep 17 00:00:00 2001 From: Derek Johnston Date: Tue, 1 Mar 2016 10:36:05 -0500 Subject: [PATCH 05/15] Cleaned up canvas heatmap api --- examples/heatmap/main.js | 3 +++ src/canvas/heatmap.js | 58 ++++++++++++++++++++++------------------ src/core/heatmap.js | 23 ++++++++++++++-- 3 files changed, 56 insertions(+), 28 deletions(-) diff --git a/examples/heatmap/main.js b/examples/heatmap/main.js index 42ab46286b..3f44738356 100644 --- a/examples/heatmap/main.js +++ b/examples/heatmap/main.js @@ -519,6 +519,9 @@ $(function () { var base = map.createLayer('osm'); var layer = map.createLayer('feature', {renderer: 'canvas'}); var heatmap = layer.createFeature('heatmap') + .intensity(function (d) { + return .5; + }) .position(function (d) { return { x: d[1], diff --git a/src/canvas/heatmap.js b/src/canvas/heatmap.js index f5403b03fd..9c5af065a6 100644 --- a/src/canvas/heatmap.js +++ b/src/canvas/heatmap.js @@ -55,10 +55,11 @@ geo.canvas.heatmap = function (arg) { }; this._gradient = function () { - var canvas = document.createElement('canvas'), - context = canvas.getContext('2d'), - gradient = context.createLinearGradient(0, 0, 0, 256), - colors = m_this.style('color'); + if (!m_this._grad) { + var canvas = document.createElement('canvas'), + context = canvas.getContext('2d'), + gradient = context.createLinearGradient(0, 0, 0, 256), + colors = m_this.style('color'); canvas.width = 1; canvas.height = 256; @@ -69,36 +70,40 @@ geo.canvas.heatmap = function (arg) { context.fillStyle = gradient; context.fillRect(0, 0, 1, 256); - m_this._grad = context.getImageData(0, 0, 1, 256).data; + } - return m_this; + return m_this; }; this._radius = function () { - var circle = m_this._circle = document.createElement('canvas'), - ctx = circle.getContext('2d'), - r = m_this.style('radius'), - blur = m_this.style('blurRadius'); + if (!m_this._circle) { + var circle = m_this._circle = document.createElement('canvas'), + ctx = circle.getContext('2d'), + r = m_this.style('radius'), + blur = m_this.style('blurRadius'); - var r2 = blur + r; - circle.width = circle.height = r2 * 2; - ctx.shadowOffsetX = ctx.shadowOffsetY = r2 * 2; - ctx.shadowBlur = blur; - ctx.shadowColor = 'black'; + var r2 = blur + r; - ctx.beginPath(); - ctx.arc(-r2, -r2, r, 0, Math.PI * 2, true); - ctx.closePath(); - ctx.fill(); + circle.width = circle.height = r2 * 2; + ctx.shadowOffsetX = ctx.shadowOffsetY = r2 * 2; + ctx.shadowBlur = blur; + ctx.shadowColor = 'black'; + ctx.beginPath(); + ctx.arc(-r2, -r2, r, 0, Math.PI * 2, true); + ctx.closePath(); + ctx.fill(); + m_this._circle = circle; + } return m_this; }; this._colorize = function (pixels, gradient) { for (var i = 0; i < pixels.length; i+=4) { - var j = pixels[i + 3] * 4; + var j = pixels[i + 3] * 4; // get opacity from the temporary canvas image, + // then multiply by 4 to get the color index on linear gradient if (j) { pixels[i] = gradient[j]; pixels[i+1] = gradient[j+1]; @@ -112,13 +117,14 @@ geo.canvas.heatmap = function (arg) { m_this._radius(); m_this._gradient(); var radius = m_this.style('radius'); - data.map(m_this.position()).map(function (p) { - var pF = m_this.layer().map().gcsToDisplay(p); - context2d.globalAlpha = Math.max(.05) - context2d.drawImage(m_this._circle, pF.x - radius, pF.y - radius); + data.forEach(function (d) { + var p = m_this.layer().map().gcsToDisplay(m_this.position()(d)); + var intensity = m_this.intensity()(d) / m_this.maxIntensity(); + context2d.globalAlpha = Math.max(intensity, .05); + context2d.drawImage(m_this._circle, p.x - radius, p.y - radius); }); - - var pixelArray = context2d.getImageData(0, 0, 1000, 1000); + var canvas = m_this.layer().canvas()[0]; + var pixelArray = context2d.getImageData(0, 0, canvas.width, canvas.height); m_this._colorize(pixelArray.data, m_this._grad); context2d.putImageData(pixelArray, 0, 0) return m_this; diff --git a/src/core/heatmap.js b/src/core/heatmap.js index b627624edb..812f034e2a 100644 --- a/src/core/heatmap.js +++ b/src/core/heatmap.js @@ -24,11 +24,31 @@ geo.heatmap = function (arg) { var m_this = this, m_position, m_intensity, + m_maxIntensity, s_init = this._init, s_data = this.data; m_position = arg.position || function (d) { return d; }; m_intensity = arg.intensity || function (d) { return 1; }; + m_maxIntensity = arg.maxIntensity || 1; + + //////////////////////////////////////////////////////////////////////////// + /** + * Get/Set maxIntensity + * + * @returns {geo.heatmap} + */ + //////////////////////////////////////////////////////////////////////////// + this.maxIntensity = function (val) { + if (val === undefined) { + return m_maxIntensity; + } else { + m_maxIntensity = val; + m_this.dataTime().modified(); + m_this.modified(); + } + return m_this; + }; //////////////////////////////////////////////////////////////////////////// /** @@ -81,8 +101,7 @@ geo.heatmap = function (arg) { radius: 10, blurRadius: 10, blur: 'Gaussian', - color: {.25: {r: 0, g: 0, b: 1}, .5: {r: 0, g: 1, b: 1}, .75: {r: 1, g: 1, b: 0}, 1: {r: 1, g: 0, b: 0}}, - maxIntensity: 1 + color: {.25: {r: 0, g: 0, b: 1}, .5: {r: 0, g: 1, b: 1}, .75: {r: 1, g: 1, b: 0}, 1: {r: 1, g: 0, b: 0}} }, arg.style === undefined ? {} : arg.style ); From 16865bc7274228faa42f587c5e32f43cef0918e3 Mon Sep 17 00:00:00 2001 From: Derek Johnston Date: Tue, 1 Mar 2016 11:50:35 -0500 Subject: [PATCH 06/15] Added black market drug activity to example --- examples/heatmap/main.js | 543 ++----------------------------------- examples/heatmap/thumb.jpg | Bin 0 -> 187035 bytes 2 files changed, 27 insertions(+), 516 deletions(-) create mode 100644 examples/heatmap/thumb.jpg diff --git a/examples/heatmap/main.js b/examples/heatmap/main.js index 3f44738356..5a16e27422 100644 --- a/examples/heatmap/main.js +++ b/examples/heatmap/main.js @@ -10,527 +10,38 @@ $(function () { x: -122.445, y: 37.8 }, - zoom: 10 + zoom: 6 }); - var data = [ - [37.782551, -122.445368], - [37.782745, -122.444586], - [37.782842, -122.443688], - [37.782919, -122.442815], - [37.782992, -122.442112], - [37.783100, -122.441461], - [37.783206, -122.440829], - [37.783273, -122.440324], - [37.783316, -122.440023], - [37.783357, -122.439794], - [37.783371, -122.439687], - [37.783368, -122.439666], - [37.783383, -122.439594], - [37.783508, -122.439525], - [37.783842, -122.439591], - [37.784147, -122.439668], - [37.784206, -122.439686], - [37.784386, -122.439790], - [37.784701, -122.439902], - [37.784965, -122.439938], - [37.785010, -122.439947], - [37.785360, -122.439952], - [37.785715, -122.440030], - [37.786117, -122.440119], - [37.786564, -122.440209], - [37.786905, -122.440270], - [37.786956, -122.440279], - [37.800224, -122.433520], - [37.800155, -122.434101], - [37.800160, -122.434430], - [37.800378, -122.434527], - [37.800738, -122.434598], - [37.800938, -122.434650], - [37.801024, -122.434889], - [37.800955, -122.435392], - [37.800886, -122.435959], - [37.800811, -122.436275], - [37.800788, -122.436299], - [37.800719, -122.436302], - [37.800702, -122.436298], - [37.800661, -122.436273], - [37.800395, -122.436172], - [37.800228, -122.436116], - [37.800169, -122.436130], - [37.800066, -122.436167], - [37.784345, -122.422922], - [37.784389, -122.422926], - [37.784437, -122.422924], - [37.784746, -122.422818], - [37.785436, -122.422959], - [37.786120, -122.423112], - [37.786433, -122.423029], - [37.786631, -122.421213], - [37.786660, -122.421033], - [37.786801, -122.420141], - [37.786823, -122.420034], - [37.786831, -122.419916], - [37.787034, -122.418208], - [37.787056, -122.418034], - [37.787169, -122.417145], - [37.787217, -122.416715], - [37.786144, -122.416403], - [37.785292, -122.416257], - [37.780666, -122.390374], - [37.780501, -122.391281], - [37.780148, -122.392052], - [37.780173, -122.391148], - [37.780693, -122.390592], - [37.781261, -122.391142], - [37.781808, -122.391730], - [37.782340, -122.392341], - [37.782812, -122.393022], - [37.783300, -122.393672], - [37.783809, -122.394275], - [37.784246, -122.394979], - [37.784791, -122.395958], - [37.785675, -122.396746], - [37.786262, -122.395780], - [37.786776, -122.395093], - [37.787282, -122.394426], - [37.787783, -122.393767], - [37.788343, -122.393184], - [37.788895, -122.392506], - [37.789371, -122.391701], - [37.789722, -122.390952], - [37.790315, -122.390305], - [37.790738, -122.389616], - [37.779448, -122.438702], - [37.779023, -122.438585], - [37.778542, -122.438492], - [37.778100, -122.438411], - [37.777986, -122.438376], - [37.777680, -122.438313], - [37.777316, -122.438273], - [37.777135, -122.438254], - [37.776987, -122.438303], - [37.776946, -122.438404], - [37.776944, -122.438467], - [37.776892, -122.438459], - [37.776842, -122.438442], - [37.776822, -122.438391], - [37.776814, -122.438412], - [37.776787, -122.438628], - [37.776729, -122.438650], - [37.776759, -122.438677], - [37.776772, -122.438498], - [37.776787, -122.438389], - [37.776848, -122.438283], - [37.776870, -122.438239], - [37.777015, -122.438198], - [37.777333, -122.438256], - [37.777595, -122.438308], - [37.777797, -122.438344], - [37.778160, -122.438442], - [37.778414, -122.438508], - [37.778445, -122.438516], - [37.778503, -122.438529], - [37.778607, -122.438549], - [37.778670, -122.438644], - [37.778847, -122.438706], - [37.779240, -122.438744], - [37.779738, -122.438822], - [37.780201, -122.438882], - [37.780400, -122.438905], - [37.780501, -122.438921], - [37.780892, -122.438986], - [37.781446, -122.439087], - [37.781985, -122.439199], - [37.782239, -122.439249], - [37.782286, -122.439266], - [37.797847, -122.429388], - [37.797874, -122.429180], - [37.797885, -122.429069], - [37.797887, -122.429050], - [37.797933, -122.428954], - [37.798242, -122.428990], - [37.798617, -122.429075], - [37.798719, -122.429092], - [37.798944, -122.429145], - [37.799320, -122.429251], - [37.799590, -122.429309], - [37.799677, -122.429324], - [37.799966, -122.429360], - [37.800288, -122.429430], - [37.800443, -122.429461], - [37.800465, -122.429474], - [37.800644, -122.429540], - [37.800948, -122.429620], - [37.801242, -122.429685], - [37.801375, -122.429702], - [37.801400, -122.429703], - [37.801453, -122.429707], - [37.801473, -122.429709], - [37.801532, -122.429707], - [37.801852, -122.429729], - [37.802173, -122.429789], - [37.802459, -122.429847], - [37.802554, -122.429825], - [37.802647, -122.429549], - [37.802693, -122.429179], - [37.802729, -122.428751], - [37.766104, -122.409291], - [37.766103, -122.409268], - [37.766138, -122.409229], - [37.766183, -122.409231], - [37.766153, -122.409276], - [37.766005, -122.409365], - [37.765897, -122.409570], - [37.765767, -122.409739], - [37.765693, -122.410389], - [37.765615, -122.411201], - [37.765533, -122.412121], - [37.765467, -122.412939], - [37.765444, -122.414821], - [37.765444, -122.414964], - [37.765318, -122.415424], - [37.763961, -122.415296], - [37.763115, -122.415196], - [37.762967, -122.415183], - [37.762278, -122.415127], - [37.761675, -122.415055], - [37.760932, -122.414988], - [37.759337, -122.414862], - [37.773187, -122.421922], - [37.773043, -122.422118], - [37.773007, -122.422165], - [37.772979, -122.422219], - [37.772865, -122.422394], - [37.772779, -122.422503], - [37.772676, -122.422701], - [37.772606, -122.422806], - [37.772566, -122.422840], - [37.772508, -122.422852], - [37.772387, -122.423011], - [37.772099, -122.423328], - [37.771704, -122.423783], - [37.771481, -122.424081], - [37.771400, -122.424179], - [37.771352, -122.424220], - [37.771248, -122.424327], - [37.770904, -122.424781], - [37.770520, -122.425283], - [37.770337, -122.425553], - [37.770128, -122.425832], - [37.769756, -122.426331], - [37.769300, -122.426902], - [37.769132, -122.427065], - [37.769092, -122.427103], - [37.768979, -122.427172], - [37.768595, -122.427634], - [37.768372, -122.427913], - [37.768337, -122.427961], - [37.768244, -122.428138], - [37.767942, -122.428581], - [37.767482, -122.429094], - [37.767031, -122.429606], - [37.766732, -122.429986], - [37.766680, -122.430058], - [37.766633, -122.430109], - [37.766580, -122.430211], - [37.766367, -122.430594], - [37.765910, -122.431137], - [37.765353, -122.431806], - [37.764962, -122.432298], - [37.764868, -122.432486], - [37.764518, -122.432913], - [37.763435, -122.434173], - [37.762847, -122.434953], - [37.762291, -122.435935], - [37.762224, -122.436074], - [37.761957, -122.436892], - [37.761652, -122.438886], - [37.761284, -122.439955], - [37.761210, -122.440068], - [37.761064, -122.440720], - [37.761040, -122.441411], - [37.761048, -122.442324], - [37.760851, -122.443118], - [37.759977, -122.444591], - [37.759913, -122.444698], - [37.759623, -122.445065], - [37.758902, -122.445158], - [37.758428, -122.444570], - [37.757687, -122.443340], - [37.757583, -122.443240], - [37.757019, -122.442787], - [37.756603, -122.442322], - [37.756380, -122.441602], - [37.755790, -122.441382], - [37.754493, -122.442133], - [37.754361, -122.442206], - [37.753719, -122.442650], - [37.753096, -122.442915], - [37.751617, -122.443211], - [37.751496, -122.443246], - [37.750733, -122.443428], - [37.750126, -122.443536], - [37.750103, -122.443784], - [37.750390, -122.444010], - [37.750448, -122.444013], - [37.750536, -122.444040], - [37.750493, -122.444141], - [37.790859, -122.402808], - [37.790864, -122.402768], - [37.790995, -122.402539], - [37.791148, -122.402172], - [37.791385, -122.401312], - [37.791405, -122.400776], - [37.791288, -122.400528], - [37.791113, -122.400441], - [37.791027, -122.400395], - [37.791094, -122.400311], - [37.791211, -122.400183], - [37.791060, -122.399334], - [37.790538, -122.398718], - [37.790095, -122.398086], - [37.789644, -122.397360], - [37.789254, -122.396844], - [37.788855, -122.396397], - [37.788483, -122.395963], - [37.788015, -122.395365], - [37.787558, -122.394735], - [37.787472, -122.394323], - [37.787630, -122.394025], - [37.787767, -122.393987], - [37.787486, -122.394452], - [37.786977, -122.395043], - [37.786583, -122.395552], - [37.786540, -122.395610], - [37.786516, -122.395659], - [37.786378, -122.395707], - [37.786044, -122.395362], - [37.785598, -122.394715], - [37.785321, -122.394361], - [37.785207, -122.394236], - [37.785751, -122.394062], - [37.785996, -122.393881], - [37.786092, -122.393830], - [37.785998, -122.393899], - [37.785114, -122.394365], - [37.785022, -122.394441], - [37.784823, -122.394635], - [37.784719, -122.394629], - [37.785069, -122.394176], - [37.785500, -122.393650], - [37.785770, -122.393291], - [37.785839, -122.393159], - [37.782651, -122.400628], - [37.782616, -122.400599], - [37.782702, -122.400470], - [37.782915, -122.400192], - [37.783137, -122.399887], - [37.783414, -122.399519], - [37.783629, -122.399237], - [37.783688, -122.399157], - [37.783716, -122.399106], - [37.783798, -122.399072], - [37.783997, -122.399186], - [37.784271, -122.399538], - [37.784577, -122.399948], - [37.784828, -122.400260], - [37.784999, -122.400477], - [37.785113, -122.400651], - [37.785155, -122.400703], - [37.785192, -122.400749], - [37.785278, -122.400839], - [37.785387, -122.400857], - [37.785478, -122.400890], - [37.785526, -122.401022], - [37.785598, -122.401148], - [37.785631, -122.401202], - [37.785660, -122.401267], - [37.803986, -122.426035], - [37.804102, -122.425089], - [37.804211, -122.424156], - [37.803861, -122.423385], - [37.803151, -122.423214], - [37.802439, -122.423077], - [37.801740, -122.422905], - [37.801069, -122.422785], - [37.800345, -122.422649], - [37.799633, -122.422603], - [37.799750, -122.421700], - [37.799885, -122.420854], - [37.799209, -122.420607], - [37.795656, -122.400395], - [37.795203, -122.400304], - [37.778738, -122.415584], - [37.778812, -122.415189], - [37.778824, -122.415092], - [37.778833, -122.414932], - [37.778834, -122.414898], - [37.778740, -122.414757], - [37.778501, -122.414433], - [37.778182, -122.414026], - [37.777851, -122.413623], - [37.777486, -122.413166], - [37.777109, -122.412674], - [37.776743, -122.412186], - [37.776440, -122.411800], - [37.776295, -122.411614], - [37.776158, -122.411440], - [37.775806, -122.410997], - [37.775422, -122.410484], - [37.775126, -122.410087], - [37.775012, -122.409854], - [37.775164, -122.409573], - [37.775498, -122.409180], - [37.775868, -122.408730], - [37.776256, -122.408240], - [37.776519, -122.407928], - [37.776539, -122.407904], - [37.776595, -122.407854], - [37.776853, -122.407547], - [37.777234, -122.407087], - [37.777644, -122.406558], - [37.778066, -122.406017], - [37.778468, -122.405499], - [37.778866, -122.404995], - [37.779295, -122.404455], - [37.779695, -122.403950], - [37.779982, -122.403584], - [37.780295, -122.403223], - [37.780664, -122.402766], - [37.781043, -122.402288], - [37.781399, -122.401823], - [37.781727, -122.401407], - [37.781853, -122.401247], - [37.781894, -122.401195], - [37.782076, -122.400977], - [37.782338, -122.400603], - [37.782666, -122.400133], - [37.783048, -122.399634], - [37.783450, -122.399198], - [37.783791, -122.398998], - [37.784177, -122.398959], - [37.784388, -122.398971], - [37.784404, -122.399128], - [37.784586, -122.399524], - [37.784835, -122.399927], - [37.785116, -122.400307], - [37.785282, -122.400539], - [37.785346, -122.400692], - [37.765769, -122.407201], - [37.765790, -122.407414], - [37.765802, -122.407755], - [37.765791, -122.408219], - [37.765763, -122.408759], - [37.765726, -122.409348], - [37.765716, -122.409882], - [37.765708, -122.410202], - [37.765705, -122.410253], - [37.765707, -122.410369], - [37.765692, -122.410720], - [37.765699, -122.411215], - [37.765687, -122.411789], - [37.765666, -122.412373], - [37.765598, -122.412883], - [37.765543, -122.413039], - [37.765532, -122.413125], - [37.765500, -122.413553], - [37.765448, -122.414053], - [37.765388, -122.414645], - [37.765323, -122.415250], - [37.765303, -122.415847], - [37.765251, -122.416439], - [37.765204, -122.417020], - [37.765172, -122.417556], - [37.765164, -122.418075], - [37.765153, -122.418618], - [37.765136, -122.419112], - [37.765129, -122.419378], - [37.765119, -122.419481], - [37.765100, -122.419852], - [37.765083, -122.420349], - [37.765045, -122.420930], - [37.764992, -122.421481], - [37.764980, -122.421695], - [37.764993, -122.421843], - [37.764986, -122.422255], - [37.764975, -122.422823], - [37.764939, -122.423411], - [37.764902, -122.424014], - [37.764853, -122.424576], - [37.764826, -122.424922], - [37.764796, -122.425375], - [37.764782, -122.425869], - [37.764768, -122.426089], - [37.764766, -122.426117], - [37.764723, -122.426276], - [37.764681, -122.426649], - [37.782012, -122.404200], - [37.781574, -122.404911], - [37.781055, -122.405597], - [37.780479, -122.406341], - [37.779996, -122.406939], - [37.779459, -122.407613], - [37.778953, -122.408228], - [37.778409, -122.408839], - [37.777842, -122.409501], - [37.777334, -122.410181], - [37.776809, -122.410836], - [37.776240, -122.411514], - [37.775725, -122.412145], - [37.775190, -122.412805], - [37.774672, -122.413464], - [37.774084, -122.414186], - [37.773533, -122.413636], - [37.773021, -122.413009], - [37.772501, -122.412371], - [37.771964, -122.411681], - [37.771479, -122.411078], - [37.770992, -122.410477], - [37.770467, -122.409801], - [37.770090, -122.408904], - [37.769657, -122.408103], - [37.769132, -122.407276], - [37.768564, -122.406469], - [37.767980, -122.405745], - [37.767380, -122.405299], - [37.766604, -122.405297], - [37.765838, -122.405200], - [37.765139, -122.405139], - [37.764457, -122.405094], - [37.763716, -122.405142], - [37.762932, -122.405398], - [37.762126, -122.405813], - [37.761344, -122.406215], - [37.760556, -122.406495], - [37.759732, -122.406484], - [37.758910, -122.406228], - [37.758182, -122.405695], - [37.757676, -122.405118], - [37.757039, -122.404346], - [37.756335, -122.403719], - [37.755503, -122.403406], - [37.754665, -122.403242], - [37.753837, -122.403172], - [37.752986, -122.403112], - [37.751266, -122.403355] - ]; + $.ajax('https://s3.amazonaws.com/uploads.hipchat.com/446632/3114847/4dZfl0YfZpTfYzq/AdderallCities2015.csv', { + success: function (resp) { + var rows = resp.split(/\r\n|\n|\r/); + rows = rows.map( function (r) { + var fields = r.split(','); + return [fields[12], fields[24], fields[25]].map(parseFloat); + }); + rows.splice(0, 1); - var base = map.createLayer('osm'); - var layer = map.createLayer('feature', {renderer: 'canvas'}); - var heatmap = layer.createFeature('heatmap') - .intensity(function (d) { - return .5; - }) - .position(function (d) { - return { - x: d[1], - y: d[0] - }; - }).data(data); + var layer = map.createLayer('feature', {renderer: 'canvas'}); + var heatmap = layer.createFeature('heatmap') + .intensity(function (d) { + return d[0]; + }) + .position(function (d) { + return { + x: d[2], + y: d[1] + }; + }) + .data(rows) + .style('radius', 5); - map.draw(); + map.draw(); + } + }); + var base = map.createLayer('osm'); + map.draw(); heatmapDebug.map = map; heatmapDebug.layer = layer; heatmapDebug.heatmap = heatmap; diff --git a/examples/heatmap/thumb.jpg b/examples/heatmap/thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..be1d1ed54f79542ed338fb4c9cae2bd27f4af132 GIT binary patch literal 187035 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 joHDY-Mf9FzHd~lLg*zR##1alB|V&P|4 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 Date: Wed, 13 Apr 2016 23:30:08 -0400 Subject: [PATCH 07/15] Fixed documentation --- sources.json | 4 +- src/canvas/{heatmap.js => heatmapFeature.js} | 20 ++++----- src/core/{heatmap.js => heatmapFeature.js} | 45 +++++++++++++++++--- 3 files changed, 50 insertions(+), 19 deletions(-) rename src/canvas/{heatmap.js => heatmapFeature.js} (91%) rename src/core/{heatmap.js => heatmapFeature.js} (61%) diff --git a/sources.json b/sources.json index 839a79b546..1cc5d38eec 100644 --- a/sources.json +++ b/sources.json @@ -42,7 +42,7 @@ "osmLayer.js", "domRenderer.js", "choroplethFeature.js", - "heatmap.js" + "heatmapFeature.js" ] }, "geo.util": { @@ -79,7 +79,7 @@ "quadFeature.js", "canvasRenderer.js", "tileLayer.js", - "heatmap.js" + "heatmapFeature.js" ] }, "geo.d3": { diff --git a/src/canvas/heatmap.js b/src/canvas/heatmapFeature.js similarity index 91% rename from src/canvas/heatmap.js rename to src/canvas/heatmapFeature.js index 9c5af065a6..b33f5ed193 100644 --- a/src/canvas/heatmap.js +++ b/src/canvas/heatmapFeature.js @@ -1,21 +1,21 @@ ////////////////////////////////////////////////////////////////////////////// /** - * Create a new instance of class heatmap + * Create a new instance of class heatmapFeature * The rendering borrows from https://github.com/mourner/simpleheat/blob/gh-pages/simpleheat.js * * @class * @param {Object} arg Options object - * @extends geo.heatmap - * @returns {geo.canvas.heatmap} + * @extends geo.heatmapFeature + * @returns {geo.canvas.heatmapFeature} */ ////////////////////////////////////////////////////////////////////////////// -geo.canvas.heatmap = function (arg) { +geo.canvas.heatmapFeature = function (arg) { 'use strict'; - if (!(this instanceof geo.canvas.heatmap)) { - return new geo.canvas.heatmap(arg); + if (!(this instanceof geo.canvas.heatmapFeature)) { + return new geo.canvas.heatmapFeature(arg); } - geo.heatmap.call(this, arg); + geo.heatmapFeature.call(this, arg); //////////////////////////////////////////////////////////////////////////// /** @@ -137,7 +137,7 @@ geo.canvas.heatmap = function (arg) { */ //////////////////////////////////////////////////////////////////////////// this._init = function () { - s_init.call(m_this, arg); //doesn't this get called implicitly by geo.heatmap.call TODO ? + s_init.call(m_this, arg); //doesn't this get called implicitly by geo.heatmapFeature.call TODO ? return m_this; }; @@ -171,7 +171,7 @@ geo.canvas.heatmap = function (arg) { return this; }; -inherit(geo.canvas.heatmap, geo.heatmap); +inherit(geo.canvas.heatmapFeature, geo.heatmapFeature); // Now register it -geo.registerFeature('canvas', 'heatmap', geo.canvas.heatmap); +geo.registerFeature('canvas', 'heatmap', geo.canvas.heatmapFeature); diff --git a/src/core/heatmap.js b/src/core/heatmapFeature.js similarity index 61% rename from src/core/heatmap.js rename to src/core/heatmapFeature.js index 812f034e2a..e38d588693 100644 --- a/src/core/heatmap.js +++ b/src/core/heatmapFeature.js @@ -1,17 +1,44 @@ ////////////////////////////////////////////////////////////////////////////// /** - * Create a new instance of class heatmap + * Create a new instance of class heatmapFeature * * @class * @extends geo.feature - * @returns {geo.heatmap} + * @returns {geo.heatmapFeature} * */ + +////////////////////////////////////////////////////////////////////////////// +/** + * Create a new instance of class heatmapFeature + * + * @class + * @param {Object} arg Options object + * @extends geo.feature + * @param {Object|string|Function} [color] Color transfer function that. + * will be used to evaluate color of each pixel using normalized intensity +* as the look up value. + * @param {number|Function} [opacity=1] Opacity for each pixel. + * @param {Object|Function} [radius=10] Radius of a point in terms of number +* of pixels. + * @param {Object|Function} [blurRadius=10] Gaussian blur radius. + * @param {Object|Function} [position] Position of the data. Default is + * (data). The position is an Object which specifies the location of the + * data in geo-spatial context. + * @param {boolean} [intensity] Scalar value that of each data point. Scalar + * value will be used to compute the weight for each data point for the final + * computation of its opacity. + * @param {boolean} [maxIntensity=1] Maximum intensity of the data. Maximum + * intensity will be used to normalize all intensities with a dataset. + * @returns {geo.heatmapFetures} + */ +////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////// -geo.heatmap = function (arg) { +geo.heatmapFeature = function (arg) { 'use strict'; - if (!(this instanceof geo.heatmap)){ - return new geo.heatmap(arg); + if (!(this instanceof geo.heatmapFeature)){ + return new geo.heatmapFeature(arg); } arg = arg || {}; geo.feature.call(this, arg); @@ -101,7 +128,11 @@ geo.heatmap = function (arg) { radius: 10, blurRadius: 10, blur: 'Gaussian', - color: {.25: {r: 0, g: 0, b: 1}, .5: {r: 0, g: 1, b: 1}, .75: {r: 1, g: 1, b: 0}, 1: {r: 1, g: 0, b: 0}} + color: {.25: {r: 0, g: 0, b: 1}, + .5: {r: 0, g: 1, b: 1}, + .75: {r: 1, g: 1, b: 0}, + 1: {r: 1, g: 0, b: 0}}, + maxIntensity: 1 }, arg.style === undefined ? {} : arg.style ); @@ -118,4 +149,4 @@ geo.heatmap = function (arg) { }; -inherit(geo.heatmap, geo.feature) +inherit(geo.heatmapFeature, geo.feature) From b57a7032a6ff40a4320ce1a0d83a38c1b869070d Mon Sep 17 00:00:00 2001 From: Aashish Chaudhary Date: Wed, 2 Mar 2016 22:36:03 -0500 Subject: [PATCH 08/15] Apply opacity value to each data point --- examples/heatmap/main.js | 9 +++------ src/canvas/heatmapFeature.js | 2 +- src/core/heatmapFeature.js | 2 +- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/examples/heatmap/main.js b/examples/heatmap/main.js index 5a16e27422..eebdb2b925 100644 --- a/examples/heatmap/main.js +++ b/examples/heatmap/main.js @@ -1,5 +1,3 @@ -var heatmapDebug = {}; - // Run after the DOM loads $(function () { 'use strict'; @@ -34,7 +32,9 @@ $(function () { }; }) .data(rows) - .style('radius', 5); + .style('radius', 5) + .style('blurRadius', 15) + .style('opacity', 0.1); map.draw(); } @@ -42,7 +42,4 @@ $(function () { var base = map.createLayer('osm'); map.draw(); - heatmapDebug.map = map; - heatmapDebug.layer = layer; - heatmapDebug.heatmap = heatmap; }); diff --git a/src/canvas/heatmapFeature.js b/src/canvas/heatmapFeature.js index b33f5ed193..794475eab4 100644 --- a/src/canvas/heatmapFeature.js +++ b/src/canvas/heatmapFeature.js @@ -120,7 +120,7 @@ geo.canvas.heatmapFeature = function (arg) { data.forEach(function (d) { var p = m_this.layer().map().gcsToDisplay(m_this.position()(d)); var intensity = m_this.intensity()(d) / m_this.maxIntensity(); - context2d.globalAlpha = Math.max(intensity, .05); + context2d.globalAlpha = intensity * m_this.style('opacity'); context2d.drawImage(m_this._circle, p.x - radius, p.y - radius); }); var canvas = m_this.layer().canvas()[0]; diff --git a/src/core/heatmapFeature.js b/src/core/heatmapFeature.js index e38d588693..1265c9610f 100644 --- a/src/core/heatmapFeature.js +++ b/src/core/heatmapFeature.js @@ -124,7 +124,7 @@ geo.heatmapFeature = function (arg) { var defaultStyle = $.extend( {}, { - opacity: 1, + opacity: 0.1, radius: 10, blurRadius: 10, blur: 'Gaussian', From 09927291ecdc8c2da099d533aced6ee21b02e1fb Mon Sep 17 00:00:00 2001 From: Aashish Chaudhary Date: Wed, 2 Mar 2016 22:45:25 -0500 Subject: [PATCH 09/15] Fixed various style issues --- examples/heatmap/main.js | 2 +- src/canvas/heatmapFeature.js | 78 +++++++++++++++++++++++++----------- 2 files changed, 55 insertions(+), 25 deletions(-) diff --git a/examples/heatmap/main.js b/examples/heatmap/main.js index eebdb2b925..8a1f962923 100644 --- a/examples/heatmap/main.js +++ b/examples/heatmap/main.js @@ -34,7 +34,7 @@ $(function () { .data(rows) .style('radius', 5) .style('blurRadius', 15) - .style('opacity', 0.1); + .style('opacity', 0.05); map.draw(); } diff --git a/src/canvas/heatmapFeature.js b/src/canvas/heatmapFeature.js index 794475eab4..11ebd7d352 100644 --- a/src/canvas/heatmapFeature.js +++ b/src/canvas/heatmapFeature.js @@ -1,7 +1,8 @@ ////////////////////////////////////////////////////////////////////////////// /** * Create a new instance of class heatmapFeature - * The rendering borrows from https://github.com/mourner/simpleheat/blob/gh-pages/simpleheat.js + * The rendering borrows from + * https://github.com/mourner/simpleheat/blob/gh-pages/simpleheat.js * * @class * @param {Object} arg Options object @@ -54,37 +55,52 @@ geo.canvas.heatmapFeature = function (arg) { return rgb; }; - this._gradient = function () { + //////////////////////////////////////////////////////////////////////////// + /** + * Compute gradient (color lookup table) + * @protected + */ + //////////////////////////////////////////////////////////////////////////// + this._computeGradient = function () { + var canvas, stop, context2d, gradient, colors; + if (!m_this._grad) { - var canvas = document.createElement('canvas'), - context = canvas.getContext('2d'), - gradient = context.createLinearGradient(0, 0, 0, 256), + canvas = document.createElement('canvas'), + context2d = canvas.getContext('2d'), + gradient = context2d.createLinearGradient(0, 0, 0, 256), colors = m_this.style('color'); canvas.width = 1; canvas.height = 256; - for (var stop in colors) { + for (stop in colors) { gradient.addColorStop(stop, m_this._convertColor(colors[stop])); } - context.fillStyle = gradient; - context.fillRect(0, 0, 1, 256); - m_this._grad = context.getImageData(0, 0, 1, 256).data; + context2d.fillStyle = gradient; + context2d.fillRect(0, 0, 1, 256); + m_this._grad = context2d.getImageData(0, 0, 1, 256).data; } return m_this; }; - this._radius = function () { + //////////////////////////////////////////////////////////////////////////// + /** + * Create circle for each data point + * @protected + */ + //////////////////////////////////////////////////////////////////////////// + this._createCircle = function () { + var circle, ctx, r, r2; if (!m_this._circle) { - var circle = m_this._circle = document.createElement('canvas'), + circle = m_this._circle = document.createElement('canvas'), ctx = circle.getContext('2d'), r = m_this.style('radius'), blur = m_this.style('blurRadius'); - var r2 = blur + r; + r2 = blur + r; circle.width = circle.height = r2 * 2; ctx.shadowOffsetX = ctx.shadowOffsetY = r2 * 2; @@ -100,10 +116,17 @@ geo.canvas.heatmapFeature = function (arg) { return m_this; }; + //////////////////////////////////////////////////////////////////////////// + /** + * Compute color for each pixel on the screen + * @protected + */ + //////////////////////////////////////////////////////////////////////////// this._colorize = function (pixels, gradient) { - for (var i = 0; i < pixels.length; i+=4) { - var j = pixels[i + 3] * 4; // get opacity from the temporary canvas image, - // then multiply by 4 to get the color index on linear gradient + var i, j; + for (i = 0; i < pixels.length; i+=4) { + j = pixels[i + 3] * 4; // get opacity from the temporary canvas image, + // then multiply by 4 to get the color index on linear gradient if (j) { pixels[i] = gradient[j]; pixels[i+1] = gradient[j+1]; @@ -112,19 +135,26 @@ geo.canvas.heatmapFeature = function (arg) { } }; + //////////////////////////////////////////////////////////////////////////// + /** + * Render each data point on canvas + * @protected + */ + //////////////////////////////////////////////////////////////////////////// this._renderOnCanvas = function (context2d, map) { - var data = m_this.data() || []; - m_this._radius(); - m_this._gradient(); - var radius = m_this.style('radius'); + var data = m_this.data() || [], + radius = m_this.style('radius'), + pos, intensity, canvas, pixelArray; + m_this._createCircle(); + m_this._computeGradient(); data.forEach(function (d) { - var p = m_this.layer().map().gcsToDisplay(m_this.position()(d)); - var intensity = m_this.intensity()(d) / m_this.maxIntensity(); + pos = m_this.layer().map().gcsToDisplay(m_this.position()(d)); + intensity = m_this.intensity()(d) / m_this.maxIntensity(); context2d.globalAlpha = intensity * m_this.style('opacity'); - context2d.drawImage(m_this._circle, p.x - radius, p.y - radius); + context2d.drawImage(m_this._circle, pos.x - radius, pos.y - radius); }); - var canvas = m_this.layer().canvas()[0]; - var pixelArray = context2d.getImageData(0, 0, canvas.width, canvas.height); + canvas = m_this.layer().canvas()[0]; + pixelArray = context2d.getImageData(0, 0, canvas.width, canvas.height); m_this._colorize(pixelArray.data, m_this._grad); context2d.putImageData(pixelArray, 0, 0) return m_this; From f985aa917d418709f79ec633769bc8762244ad9b Mon Sep 17 00:00:00 2001 From: Aashish Chaudhary Date: Wed, 2 Mar 2016 23:49:06 -0500 Subject: [PATCH 10/15] Fixed some more opacity related logic --- examples/heatmap/main.js | 28 ++++++++++++++-------------- src/canvas/heatmapFeature.js | 16 ++++++++++------ src/core/heatmapFeature.js | 10 +++++----- 3 files changed, 29 insertions(+), 25 deletions(-) diff --git a/examples/heatmap/main.js b/examples/heatmap/main.js index 8a1f962923..273148a28c 100644 --- a/examples/heatmap/main.js +++ b/examples/heatmap/main.js @@ -22,20 +22,20 @@ $(function () { var layer = map.createLayer('feature', {renderer: 'canvas'}); var heatmap = layer.createFeature('heatmap') - .intensity(function (d) { - return d[0]; - }) - .position(function (d) { - return { - x: d[2], - y: d[1] - }; - }) - .data(rows) - .style('radius', 5) - .style('blurRadius', 15) - .style('opacity', 0.05); - + .data(rows) + .intensity(function (d) { + return d[0]; + }) + .position(function (d) { + return { + x: d[2], + y: d[1] + }; + }) + .maxIntensity(20) + .style('radius', 5) + .style('blurRadius', 15) + .style('opacity', 0.5); map.draw(); } }); diff --git a/src/canvas/heatmapFeature.js b/src/canvas/heatmapFeature.js index 11ebd7d352..68a96fa903 100644 --- a/src/canvas/heatmapFeature.js +++ b/src/canvas/heatmapFeature.js @@ -46,13 +46,14 @@ geo.canvas.heatmapFeature = function (arg) { */ //////////////////////////////////////////////////////////////////////////// this._convertColor = function (c) { - var rgb; + var color; if (c.hasOwnProperty('r') && c.hasOwnProperty('g') && - c.hasOwnProperty('b')) { - rgb = d3.rgb(255 * c.r, 255 * c.g, 255 * c.b).toString(); + c.hasOwnProperty('b') && + c.hasOwnProperty('a')) { + color = 'rgba('+255 * c.r+','+255 * c.g+','+255 * c.b+','+255 * c.a+')'; } - return rgb; + return color; }; //////////////////////////////////////////////////////////////////////////// @@ -128,9 +129,10 @@ geo.canvas.heatmapFeature = function (arg) { j = pixels[i + 3] * 4; // get opacity from the temporary canvas image, // then multiply by 4 to get the color index on linear gradient if (j) { - pixels[i] = gradient[j]; + pixels[i] = gradient[j]; pixels[i+1] = gradient[j+1]; pixels[i+2] = gradient[j+2]; + pixels[i+3] = m_this.style('opacity') * gradient[j+3]; } } }; @@ -150,7 +152,9 @@ geo.canvas.heatmapFeature = function (arg) { data.forEach(function (d) { pos = m_this.layer().map().gcsToDisplay(m_this.position()(d)); intensity = m_this.intensity()(d) / m_this.maxIntensity(); - context2d.globalAlpha = intensity * m_this.style('opacity'); + // Small values are not visible because globalAlpha < .01 + // cannot be read from imageData + context2d.globalAlpha = intensity < 0.01 ? 0.01 : intensity; context2d.drawImage(m_this._circle, pos.x - radius, pos.y - radius); }); canvas = m_this.layer().canvas()[0]; diff --git a/src/core/heatmapFeature.js b/src/core/heatmapFeature.js index 1265c9610f..d6784a1b10 100644 --- a/src/core/heatmapFeature.js +++ b/src/core/heatmapFeature.js @@ -128,11 +128,11 @@ geo.heatmapFeature = function (arg) { radius: 10, blurRadius: 10, blur: 'Gaussian', - color: {.25: {r: 0, g: 0, b: 1}, - .5: {r: 0, g: 1, b: 1}, - .75: {r: 1, g: 1, b: 0}, - 1: {r: 1, g: 0, b: 0}}, - maxIntensity: 1 + color: {0: {r: 0, g: 0, b: 0.0, a: 0.0}, + .25: {r: 0, g: 0, b: 1, a: 1.0}, + .5: {r: 0, g: 1, b: 1, a: 1.0}, + .75: {r: 1, g: 1, b: 0, a: 1.0}, + 1: {r: 1, g: 0, b: 0, a: 1.0}} }, arg.style === undefined ? {} : arg.style ); From 3212ba7bc13045857d6b16e2bbc7cdbf39c17b38 Mon Sep 17 00:00:00 2001 From: Aashish Chaudhary Date: Wed, 2 Mar 2016 22:36:03 -0500 Subject: [PATCH 11/15] Set default opacity to 1.0 --- examples/heatmap/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/heatmap/main.js b/examples/heatmap/main.js index 273148a28c..e6b8d11be5 100644 --- a/examples/heatmap/main.js +++ b/examples/heatmap/main.js @@ -35,7 +35,7 @@ $(function () { .maxIntensity(20) .style('radius', 5) .style('blurRadius', 15) - .style('opacity', 0.5); + .style('opacity', 1.0); map.draw(); } }); From 525088d21a318c00e92840c8c312e4a8e03a4ef7 Mon Sep 17 00:00:00 2001 From: Aashish Chaudhary Date: Wed, 2 Mar 2016 16:26:25 -0500 Subject: [PATCH 12/15] Updated to new build and test infrastructure --- src/canvas/heatmapFeature.js | 33 ++++++----- src/canvas/index.js | 1 + src/{core => }/heatmapFeature.js | 52 +++++++++++------- src/index.js | 1 + tests/cases/heatmap.js | 94 ++++++++++++++++++++++++++++++++ 5 files changed, 148 insertions(+), 33 deletions(-) rename src/{core => }/heatmapFeature.js (78%) create mode 100644 tests/cases/heatmap.js diff --git a/src/canvas/heatmapFeature.js b/src/canvas/heatmapFeature.js index 68a96fa903..a9a301a021 100644 --- a/src/canvas/heatmapFeature.js +++ b/src/canvas/heatmapFeature.js @@ -1,3 +1,7 @@ +var inherit = require('../inherit'); +var registerFeature = require('../registry').registerFeature; +var heatmapFeature = require('../heatmapFeature'); + ////////////////////////////////////////////////////////////////////////////// /** * Create a new instance of class heatmapFeature @@ -7,16 +11,16 @@ * @class * @param {Object} arg Options object * @extends geo.heatmapFeature - * @returns {geo.canvas.heatmapFeature} + * @returns {canvas_heatmapFeature} */ ////////////////////////////////////////////////////////////////////////////// -geo.canvas.heatmapFeature = function (arg) { +canvas_heatmapFeature = function (arg) { 'use strict'; - if (!(this instanceof geo.canvas.heatmapFeature)) { - return new geo.canvas.heatmapFeature(arg); + if (!(this instanceof canvas_heatmapFeature)) { + return new canvas_heatmapFeature(arg); } - geo.heatmapFeature.call(this, arg); + heatmapFeature.call(this, arg); //////////////////////////////////////////////////////////////////////////// /** @@ -51,7 +55,7 @@ geo.canvas.heatmapFeature = function (arg) { c.hasOwnProperty('g') && c.hasOwnProperty('b') && c.hasOwnProperty('a')) { - color = 'rgba('+255 * c.r+','+255 * c.g+','+255 * c.b+','+255 * c.a+')'; + color = 'rgba('+255 * c.r+','+255 * c.g+','+255 * c.b+','+ c.a+')'; } return color; }; @@ -96,10 +100,9 @@ geo.canvas.heatmapFeature = function (arg) { var circle, ctx, r, r2; if (!m_this._circle) { circle = m_this._circle = document.createElement('canvas'), - ctx = circle.getContext('2d'), - r = m_this.style('radius'), - blur = m_this.style('blurRadius'); - + ctx = circle.getContext('2d'), + r = m_this.style('radius'), + blur = m_this.style('blurRadius'); r2 = blur + r; @@ -151,7 +154,8 @@ geo.canvas.heatmapFeature = function (arg) { m_this._computeGradient(); data.forEach(function (d) { pos = m_this.layer().map().gcsToDisplay(m_this.position()(d)); - intensity = m_this.intensity()(d) / m_this.maxIntensity(); + intensity = (m_this.intensity()(d) - m_this.minIntensity()) / + (m_this.maxIntensity() - m_this.minIntensity()); // Small values are not visible because globalAlpha < .01 // cannot be read from imageData context2d.globalAlpha = intensity < 0.01 ? 0.01 : intensity; @@ -171,7 +175,7 @@ geo.canvas.heatmapFeature = function (arg) { */ //////////////////////////////////////////////////////////////////////////// this._init = function () { - s_init.call(m_this, arg); //doesn't this get called implicitly by geo.heatmapFeature.call TODO ? + s_init.call(m_this, arg); return m_this; }; @@ -205,7 +209,8 @@ geo.canvas.heatmapFeature = function (arg) { return this; }; -inherit(geo.canvas.heatmapFeature, geo.heatmapFeature); +inherit(canvas_heatmapFeature, heatmapFeature); // Now register it -geo.registerFeature('canvas', 'heatmap', geo.canvas.heatmapFeature); +registerFeature('canvas', 'heatmap', canvas_heatmapFeature); +module.exports = canvas_heatmapFeature; \ No newline at end of file diff --git a/src/canvas/index.js b/src/canvas/index.js index 349a21f152..ad55e55bb2 100644 --- a/src/canvas/index.js +++ b/src/canvas/index.js @@ -4,5 +4,6 @@ module.exports = { canvasRenderer: require('./canvasRenderer'), quadFeature: require('./quadFeature'), + heatmapFeature: require('./heatmapFeature'), tileLayer: require('./tileLayer') }; diff --git a/src/core/heatmapFeature.js b/src/heatmapFeature.js similarity index 78% rename from src/core/heatmapFeature.js rename to src/heatmapFeature.js index d6784a1b10..5934c6f645 100644 --- a/src/core/heatmapFeature.js +++ b/src/heatmapFeature.js @@ -1,12 +1,6 @@ -////////////////////////////////////////////////////////////////////////////// -/** - * Create a new instance of class heatmapFeature - * - * @class - * @extends geo.feature - * @returns {geo.heatmapFeature} - * - */ +var $ = require('jquery'); +var inherit = require('./inherit'); +var feature = require('./feature'); ////////////////////////////////////////////////////////////////////////////// /** @@ -35,13 +29,13 @@ ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// -geo.heatmapFeature = function (arg) { +var heatmapFeature = function (arg) { 'use strict'; - if (!(this instanceof geo.heatmapFeature)){ - return new geo.heatmapFeature(arg); + if (!(this instanceof heatmapFeature)){ + return new heatmapFeature(arg); } arg = arg || {}; - geo.feature.call(this, arg); + feature.call(this, arg); //////////////////////////////////////////////////////////////////////////// /** @@ -52,12 +46,14 @@ geo.heatmapFeature = function (arg) { m_position, m_intensity, m_maxIntensity, + m_minIntensity, s_init = this._init, s_data = this.data; m_position = arg.position || function (d) { return d; }; m_intensity = arg.intensity || function (d) { return 1; }; m_maxIntensity = arg.maxIntensity || 1; + m_minIntensity = arg.minIntensity ? arg.minIntensity : 0; //////////////////////////////////////////////////////////////////////////// /** @@ -77,6 +73,24 @@ geo.heatmapFeature = function (arg) { return m_this; }; + //////////////////////////////////////////////////////////////////////////// + /** + * Get/Set maxIntensity + * + * @returns {geo.heatmap} + */ + //////////////////////////////////////////////////////////////////////////// + this.minIntensity = function (val) { + if (val === undefined) { + return m_minIntensity; + } else { + m_minIntensity = val; + m_this.dataTime().modified(); + m_this.modified(); + } + return m_this; + }; + //////////////////////////////////////////////////////////////////////////// /** * Get/Set position accessor @@ -127,12 +141,11 @@ geo.heatmapFeature = function (arg) { opacity: 0.1, radius: 10, blurRadius: 10, - blur: 'Gaussian', color: {0: {r: 0, g: 0, b: 0.0, a: 0.0}, - .25: {r: 0, g: 0, b: 1, a: 1.0}, - .5: {r: 0, g: 1, b: 1, a: 1.0}, - .75: {r: 1, g: 1, b: 0, a: 1.0}, - 1: {r: 1, g: 0, b: 0, a: 1.0}} + .25: {r: 0, g: 0, b: 1, a: 0.5}, + .5: {r: 0, g: 1, b: 1, a: 0.6}, + .75: {r: 1, g: 1, b: 0, a: 0.7}, + 1: {r: 1, g: 0, b: 0, a: 0.8}} }, arg.style === undefined ? {} : arg.style ); @@ -149,4 +162,5 @@ geo.heatmapFeature = function (arg) { }; -inherit(geo.heatmapFeature, geo.feature) +inherit(heatmapFeature, feature) +module.exports = heatmapFeature; diff --git a/src/index.js b/src/index.js index 2ffb0e1773..9a5e2282a6 100644 --- a/src/index.js +++ b/src/index.js @@ -52,6 +52,7 @@ module.exports = $.extend({ pointFeature: require('./pointFeature'), polygonFeature: require('./polygonFeature'), quadFeature: require('./quadFeature'), + heatmapFeature: require('./heatmapFeature'), renderer: require('./renderer'), sceneObject: require('./sceneObject'), tile: require('./tile'), diff --git a/tests/cases/heatmap.js b/tests/cases/heatmap.js new file mode 100644 index 0000000000..458fd3beaf --- /dev/null +++ b/tests/cases/heatmap.js @@ -0,0 +1,94 @@ +// Test geo.core.osmLayer +var geo = require('../test-utils').geo; +var $ = require('jquery'); + +beforeEach(function () { + $('
').appendTo('body') + .css({width: '500px', height: '400px'}); +}); + +afterEach(function () { + $('#map-canvas-heatmap-feature').remove(); +}); + +describe('canvas heatmap feature', function () { + 'use strict'; + + var mockAnimationFrame = require('../test-utils').mockAnimationFrame; + var stepAnimationFrame = require('../test-utils').stepAnimationFrame; + var unmockAnimationFrame = require('../test-utils').unmockAnimationFrame; + + var map, width = 800, height = 600, layer, feature1, feature2, + testData = "Strength, Lat,Lon\ + 0.6,42.8584,-70.9301\ + 0.233,42.2776,-83.7409\ + 0.2,42.2776,-83.7409,"; + testData = testData.split(/\r\n|\n|\r/); + testData = testData.map( function (r) { + var fields = r.split(','); + return [fields[12], fields[24], fields[25]].map(parseFloat); + }); + testData.splice(0, 1); + + it('Setup map', function () { + map = geo.map({node: '#map-canvas-heatmap-feature', center: [0, 0], zoom: 3}); + layer = map.createLayer('feature', {'renderer': 'canvas'}); + map.resize(0, 0, width, height); + }); + + it('Add features to a layer', function () { + feature1 = layer.createFeature('heatmap') + .data(testData) + .intensity(function (d) { + return d[0]; + }) + .position(function (d) { + return { + x: d[2], + y: d[1] + }; + }) + .style('radius', 5) + .style('blurRadius', 15) + .style('opacity', 1.0); + + mockAnimationFrame(); + map.draw(); + stepAnimationFrame(new Date().getTime()); + expect(layer.children().length).toBe(1) + unmockAnimationFrame(); + }); + + it('Validate selection API option', function () { + expect(feature1.selectionAPI()).toBe(false); + }); + + it('Validate position', function () { + expect(feature1.position()([0.6, 42.8584, -70.9301])) + .toEqual({x:-70.9301, y:42.8584}); + }); + + it('Validate maximum intensity', function () { + expect(feature1.maxIntensity()).toBe(1); + }); + + it('Validate minimum intensity', function () { + expect(feature1.minIntensity()).toBe(0); + }); + + it('Remove a feature from a layer', function () { + layer.deleteFeature(feature1).draw(); + expect(layer.children().length).toBe(0); + }); + + it('Compute gradient', function () { + feature1.style("color", {0: {r: 0, g: 0, b: 0.0, a: 0.0}, + 0.25: {r: 0, g: 0, b: 1, a: 0.5}, + 0.5: {r: 0, g: 1, b: 1, a: 0.6}, + 0.75: {r: 1, g: 1, b: 0, a: 0.7}, + 1: {r: 1, g: 0, b: 0, a: 0.1}}); + feature1._computeGradient(); + expect(layer.node()[0].children[0].getContext('2d'). + getImageData(1, 0, 1, 1).data.length).toBe(4) + }); +}); From 834ea03220ce5b68a5d4713e2f65d0ff81101015 Mon Sep 17 00:00:00 2001 From: Aashish Chaudhary Date: Wed, 13 Apr 2016 13:15:54 -0400 Subject: [PATCH 13/15] Fixed and updated intensity normalization and docs --- examples/heatmap/main.js | 4 +- src/canvas/heatmapFeature.js | 59 ++++++++++-------------- src/heatmapFeature.js | 89 +++++++++++++++++++++++++----------- tests/cases/heatmap.js | 53 ++++++++++----------- 4 files changed, 112 insertions(+), 93 deletions(-) diff --git a/examples/heatmap/main.js b/examples/heatmap/main.js index e6b8d11be5..17b3e04bd8 100644 --- a/examples/heatmap/main.js +++ b/examples/heatmap/main.js @@ -33,8 +33,8 @@ $(function () { }; }) .maxIntensity(20) - .style('radius', 5) - .style('blurRadius', 15) + .style('radius', 15) + .style('blurRadius', 30) .style('opacity', 1.0); map.draw(); } diff --git a/src/canvas/heatmapFeature.js b/src/canvas/heatmapFeature.js index a9a301a021..a887b606ba 100644 --- a/src/canvas/heatmapFeature.js +++ b/src/canvas/heatmapFeature.js @@ -5,7 +5,7 @@ var heatmapFeature = require('../heatmapFeature'); ////////////////////////////////////////////////////////////////////////////// /** * Create a new instance of class heatmapFeature - * The rendering borrows from + * Inspired from * https://github.com/mourner/simpleheat/blob/gh-pages/simpleheat.js * * @class @@ -14,7 +14,7 @@ var heatmapFeature = require('../heatmapFeature'); * @returns {canvas_heatmapFeature} */ ////////////////////////////////////////////////////////////////////////////// -canvas_heatmapFeature = function (arg) { +var canvas_heatmapFeature = function (arg) { 'use strict'; if (!(this instanceof canvas_heatmapFeature)) { @@ -32,17 +32,6 @@ canvas_heatmapFeature = function (arg) { s_init = this._init, s_update = this._update; - //////////////////////////////////////////////////////////////////////////// - /** - * Build - * @override - */ - //////////////////////////////////////////////////////////////////////////// - this._build = function () { - s_update.call(m_this); - return m_this; - }; - //////////////////////////////////////////////////////////////////////////// /** * Meta functions for converting from geojs styles to canvas. @@ -52,10 +41,11 @@ canvas_heatmapFeature = function (arg) { this._convertColor = function (c) { var color; if (c.hasOwnProperty('r') && - c.hasOwnProperty('g') && - c.hasOwnProperty('b') && - c.hasOwnProperty('a')) { - color = 'rgba('+255 * c.r+','+255 * c.g+','+255 * c.b+','+ c.a+')'; + c.hasOwnProperty('g') && + c.hasOwnProperty('b') && + c.hasOwnProperty('a')) { + color = 'rgba(' + 255 * c.r + ',' + 255 * c.g + ',' + + 255 * c.b + ',' + c.a + ')'; } return color; }; @@ -70,10 +60,10 @@ canvas_heatmapFeature = function (arg) { var canvas, stop, context2d, gradient, colors; if (!m_this._grad) { - canvas = document.createElement('canvas'), - context2d = canvas.getContext('2d'), - gradient = context2d.createLinearGradient(0, 0, 0, 256), - colors = m_this.style('color'); + canvas = document.createElement('canvas'); + context2d = canvas.getContext('2d'); + gradient = context2d.createLinearGradient(0, 0, 0, 256); + colors = m_this.style('color'); canvas.width = 1; canvas.height = 256; @@ -97,11 +87,11 @@ canvas_heatmapFeature = function (arg) { */ //////////////////////////////////////////////////////////////////////////// this._createCircle = function () { - var circle, ctx, r, r2; + var circle, ctx, r, r2, blur; if (!m_this._circle) { - circle = m_this._circle = document.createElement('canvas'), - ctx = circle.getContext('2d'), - r = m_this.style('radius'), + circle = m_this._circle = document.createElement('canvas'); + ctx = circle.getContext('2d'); + r = m_this.style('radius'); blur = m_this.style('blurRadius'); r2 = blur + r; @@ -128,14 +118,15 @@ canvas_heatmapFeature = function (arg) { //////////////////////////////////////////////////////////////////////////// this._colorize = function (pixels, gradient) { var i, j; - for (i = 0; i < pixels.length; i+=4) { - j = pixels[i + 3] * 4; // get opacity from the temporary canvas image, - // then multiply by 4 to get the color index on linear gradient + for (i = 0; i < pixels.length; i += 4) { + // Get opacity from the temporary canvas image, + // then multiply by 4 to get the color index on linear gradient + j = pixels[i + 3] * 4; if (j) { - pixels[i] = gradient[j]; - pixels[i+1] = gradient[j+1]; - pixels[i+2] = gradient[j+2]; - pixels[i+3] = m_this.style('opacity') * gradient[j+3]; + pixels[i] = gradient[j]; + pixels[i + 1] = gradient[j + 1]; + pixels[i + 2] = gradient[j + 2]; + pixels[i + 3] = m_this.style('opacity') * gradient[j + 3]; } } }; @@ -164,7 +155,7 @@ canvas_heatmapFeature = function (arg) { canvas = m_this.layer().canvas()[0]; pixelArray = context2d.getImageData(0, 0, canvas.width, canvas.height); m_this._colorize(pixelArray.data, m_this._grad); - context2d.putImageData(pixelArray, 0, 0) + context2d.putImageData(pixelArray, 0, 0); return m_this; }; @@ -213,4 +204,4 @@ inherit(canvas_heatmapFeature, heatmapFeature); // Now register it registerFeature('canvas', 'heatmap', canvas_heatmapFeature); -module.exports = canvas_heatmapFeature; \ No newline at end of file +module.exports = canvas_heatmapFeature; diff --git a/src/heatmapFeature.js b/src/heatmapFeature.js index 5934c6f645..d181d6600a 100644 --- a/src/heatmapFeature.js +++ b/src/heatmapFeature.js @@ -11,19 +11,26 @@ var feature = require('./feature'); * @extends geo.feature * @param {Object|string|Function} [color] Color transfer function that. * will be used to evaluate color of each pixel using normalized intensity -* as the look up value. - * @param {number|Function} [opacity=1] Opacity for each pixel. + * as the look up value. + * @param {number|Function} [opacity=1] Homogeneous opacity for each pixel. * @param {Object|Function} [radius=10] Radius of a point in terms of number -* of pixels. - * @param {Object|Function} [blurRadius=10] Gaussian blur radius. + * of pixels. + * @param {Object|Function} [blurRadius=10] Gaussian blur radius for each + * point in terms of number of pixels. * @param {Object|Function} [position] Position of the data. Default is - * (data). The position is an Object which specifies the location of the + * (data). The position is an Object which specifies the location of the * data in geo-spatial context. - * @param {boolean} [intensity] Scalar value that of each data point. Scalar - * value will be used to compute the weight for each data point for the final - * computation of its opacity. - * @param {boolean} [maxIntensity=1] Maximum intensity of the data. Maximum - * intensity will be used to normalize all intensities with a dataset. + * @param {boolean} [intensity] Scalar value of each data point. Scalar + * value must be a positive real number and will be used to compute + * the weight for each data point. + * @param {boolean} [maxIntensity=null] Maximum intensity of the data. Maximum + * intensity must be a positive real number and will be used to normalize all + * intensities with a dataset. If no value is given, then a it will + * be computed. + * @param {boolean} [minIntensity=null] Minimum intensity of the data. Minimum + * intensity must be a positive real number will be used to normalize all + * intensities with a dataset. If no value is given, then a it will + * be computed. * @returns {geo.heatmapFetures} */ ////////////////////////////////////////////////////////////////////////////// @@ -31,7 +38,7 @@ var feature = require('./feature'); ////////////////////////////////////////////////////////////////////////////// var heatmapFeature = function (arg) { 'use strict'; - if (!(this instanceof heatmapFeature)){ + if (!(this instanceof heatmapFeature)) { return new heatmapFeature(arg); } arg = arg || {}; @@ -47,13 +54,12 @@ var heatmapFeature = function (arg) { m_intensity, m_maxIntensity, m_minIntensity, - s_init = this._init, - s_data = this.data; + s_init = this._init; m_position = arg.position || function (d) { return d; }; m_intensity = arg.intensity || function (d) { return 1; }; - m_maxIntensity = arg.maxIntensity || 1; - m_minIntensity = arg.minIntensity ? arg.minIntensity : 0; + m_maxIntensity = arg.maxIntensity || null; + m_minIntensity = arg.minIntensity ? arg.minIntensity : null; //////////////////////////////////////////////////////////////////////////// /** @@ -137,16 +143,16 @@ var heatmapFeature = function (arg) { var defaultStyle = $.extend( {}, - { - opacity: 0.1, - radius: 10, - blurRadius: 10, - color: {0: {r: 0, g: 0, b: 0.0, a: 0.0}, - .25: {r: 0, g: 0, b: 1, a: 0.5}, - .5: {r: 0, g: 1, b: 1, a: 0.6}, - .75: {r: 1, g: 1, b: 0, a: 0.7}, - 1: {r: 1, g: 0, b: 0, a: 0.8}} - }, + { + opacity: 0.1, + radius: 10, + blurRadius: 10, + color: {0: {r: 0, g: 0, b: 0.0, a: 0.0}, + 0.25: {r: 0, g: 0, b: 1, a: 0.5}, + 0.5: {r: 0, g: 1, b: 1, a: 0.6}, + 0.75: {r: 1, g: 1, b: 0, a: 0.7}, + 1: {r: 1, g: 0, b: 0, a: 0.8}} + }, arg.style === undefined ? {} : arg.style ); @@ -157,10 +163,39 @@ var heatmapFeature = function (arg) { } }; + //////////////////////////////////////////////////////////////////////////// + /** + * Build + * @override + */ + //////////////////////////////////////////////////////////////////////////// + this._build = function () { + var data = m_this.data(), + intensity = null; + + if (!m_maxIntensity || !m_minIntensity) { + data.forEach(function (d) { + intensity = m_this.intensity()(d); + if (!m_maxIntensity && !m_minIntensity) { + m_maxIntensity = m_minIntensity = intensity; + } else { + if (intensity > m_maxIntensity) { + m_maxIntensity = intensity; + } + if (intensity < m_minIntensity) { + m_minIntensity = intensity; + } + } + }); + } + + m_this.buildTime().modified(); + return m_this; + }; + this._init(arg); return this; - }; -inherit(heatmapFeature, feature) +inherit(heatmapFeature, feature); module.exports = heatmapFeature; diff --git a/tests/cases/heatmap.js b/tests/cases/heatmap.js index 458fd3beaf..87cbf99ef1 100644 --- a/tests/cases/heatmap.js +++ b/tests/cases/heatmap.js @@ -18,17 +18,10 @@ describe('canvas heatmap feature', function () { var stepAnimationFrame = require('../test-utils').stepAnimationFrame; var unmockAnimationFrame = require('../test-utils').unmockAnimationFrame; - var map, width = 800, height = 600, layer, feature1, feature2, - testData = "Strength, Lat,Lon\ - 0.6,42.8584,-70.9301\ - 0.233,42.2776,-83.7409\ - 0.2,42.2776,-83.7409,"; - testData = testData.split(/\r\n|\n|\r/); - testData = testData.map( function (r) { - var fields = r.split(','); - return [fields[12], fields[24], fields[25]].map(parseFloat); - }); - testData.splice(0, 1); + var map, width = 800, height = 600, layer, feature1, + testData = [[0.6, 42.8584, -70.9301], + [0.233, 42.2776, -83.7409], + [0.2, 42.2776, -83.7409]]; it('Setup map', function () { map = geo.map({node: '#map-canvas-heatmap-feature', center: [0, 0], zoom: 3}); @@ -38,24 +31,24 @@ describe('canvas heatmap feature', function () { it('Add features to a layer', function () { feature1 = layer.createFeature('heatmap') - .data(testData) - .intensity(function (d) { - return d[0]; - }) - .position(function (d) { - return { - x: d[2], - y: d[1] - }; - }) - .style('radius', 5) - .style('blurRadius', 15) - .style('opacity', 1.0); + .data(testData) + .intensity(function (d) { + return d[0]; + }) + .position(function (d) { + return { + x: d[2], + y: d[1] + }; + }) + .style('radius', 5) + .style('blurRadius', 15) + .style('opacity', 1.0); mockAnimationFrame(); map.draw(); stepAnimationFrame(new Date().getTime()); - expect(layer.children().length).toBe(1) + expect(layer.children().length).toBe(1); unmockAnimationFrame(); }); @@ -69,11 +62,11 @@ describe('canvas heatmap feature', function () { }); it('Validate maximum intensity', function () { - expect(feature1.maxIntensity()).toBe(1); + expect(feature1.maxIntensity()).toBe(0.6); }); it('Validate minimum intensity', function () { - expect(feature1.minIntensity()).toBe(0); + expect(feature1.minIntensity()).toBe(0.2); }); it('Remove a feature from a layer', function () { @@ -82,13 +75,13 @@ describe('canvas heatmap feature', function () { }); it('Compute gradient', function () { - feature1.style("color", {0: {r: 0, g: 0, b: 0.0, a: 0.0}, + feature1.style('color', {0: {r: 0, g: 0, b: 0.0, a: 0.0}, 0.25: {r: 0, g: 0, b: 1, a: 0.5}, 0.5: {r: 0, g: 1, b: 1, a: 0.6}, 0.75: {r: 1, g: 1, b: 0, a: 0.7}, 1: {r: 1, g: 0, b: 0, a: 0.1}}); feature1._computeGradient(); - expect(layer.node()[0].children[0].getContext('2d'). - getImageData(1, 0, 1, 1).data.length).toBe(4) + expect(layer.node()[0].children[0].getContext('2d') + .getImageData(1, 0, 1, 1).data.length).toBe(4); }); }); From 1c93babd24018b0f607dc2f0378df50a153b7083 Mon Sep 17 00:00:00 2001 From: Aashish Chaudhary Date: Thu, 14 Apr 2016 02:08:02 -0400 Subject: [PATCH 14/15] Fixed bad offset for rendered primitives --- examples/heatmap/main.js | 16 ++++++++++------ src/canvas/heatmapFeature.js | 2 +- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/examples/heatmap/main.js b/examples/heatmap/main.js index 17b3e04bd8..8b5cd5945a 100644 --- a/examples/heatmap/main.js +++ b/examples/heatmap/main.js @@ -5,10 +5,10 @@ $(function () { var map = geo.map({ node: '#map', center: { - x: -122.445, - y: 37.8 + x: -98, + y: 39 }, - zoom: 6 + zoom: 3 }); $.ajax('https://s3.amazonaws.com/uploads.hipchat.com/446632/3114847/4dZfl0YfZpTfYzq/AdderallCities2015.csv', { @@ -32,10 +32,14 @@ $(function () { y: d[1] }; }) - .maxIntensity(20) - .style('radius', 15) + .style('radius', 10) .style('blurRadius', 30) - .style('opacity', 1.0); + .style('opacity', 1.0) + .style('color', + {0: {r: 0, g: 0, b: 0, a: 0.0}, + 0.25: {r: 0, g: 1, b: 0, a: 0.5}, + 0.5: {r: 1, g: 1, b: 0, a: 0.8}, + 1: {r: 1, g: 0, b: 0, a: 1.0}}); map.draw(); } }); diff --git a/src/canvas/heatmapFeature.js b/src/canvas/heatmapFeature.js index a887b606ba..c25ccc8181 100644 --- a/src/canvas/heatmapFeature.js +++ b/src/canvas/heatmapFeature.js @@ -139,7 +139,7 @@ var canvas_heatmapFeature = function (arg) { //////////////////////////////////////////////////////////////////////////// this._renderOnCanvas = function (context2d, map) { var data = m_this.data() || [], - radius = m_this.style('radius'), + radius = m_this.style('radius') + m_this.style('blurRadius'), pos, intensity, canvas, pixelArray; m_this._createCircle(); m_this._computeGradient(); From e2496007780a1f7e8aba87331d495f136ef9db96 Mon Sep 17 00:00:00 2001 From: Aashish Chaudhary Date: Fri, 15 Apr 2016 18:17:07 -0400 Subject: [PATCH 15/15] Fixed API documentation --- src/canvas/heatmapFeature.js | 2 +- src/heatmapFeature.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/canvas/heatmapFeature.js b/src/canvas/heatmapFeature.js index c25ccc8181..54fc3476f9 100644 --- a/src/canvas/heatmapFeature.js +++ b/src/canvas/heatmapFeature.js @@ -8,7 +8,7 @@ var heatmapFeature = require('../heatmapFeature'); * Inspired from * https://github.com/mourner/simpleheat/blob/gh-pages/simpleheat.js * - * @class + * @class geo.canvas.heatmapFeature * @param {Object} arg Options object * @extends geo.heatmapFeature * @returns {canvas_heatmapFeature} diff --git a/src/heatmapFeature.js b/src/heatmapFeature.js index d181d6600a..3c1f17e470 100644 --- a/src/heatmapFeature.js +++ b/src/heatmapFeature.js @@ -31,7 +31,7 @@ var feature = require('./feature'); * intensity must be a positive real number will be used to normalize all * intensities with a dataset. If no value is given, then a it will * be computed. - * @returns {geo.heatmapFetures} + * @returns {geo.heatmapFeature} */ //////////////////////////////////////////////////////////////////////////////