├── .gitignore
├── LICENSE
├── README.md
├── app.js
├── index.html
├── package-lock.json
├── package.json
└── public
└── style.css
/.gitignore:
--------------------------------------------------------------------------------
1 | /node_modules
2 | /public/location.json
3 | secret.md
4 | .DS_Store
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017 Brandon Morelli
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # JavaScript-HeatMap-Creator
2 | Create HeatMaps with JavaScript and Your Google Location History
3 |
4 | ### Tutorial on how to use this project available on [Codeburst.io](https://codeburst.io/how-i-created-a-heatmap-of-my-location-history-with-javascript-google-maps-972a2d1be240)
5 |
6 | 
7 | 
8 |
--------------------------------------------------------------------------------
/app.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const path = require("path");
3 | const app = express()
4 |
5 | app.use('/static', express.static(__dirname + '/public'));
6 |
7 | app.get('/', function(req, res) {
8 | res.sendFile(path.join(__dirname + '/index.html'));
9 | });
10 |
11 | app.listen(3000, () => console.log('Listening on port 3000!'))
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Heatmaps
6 |
7 |
8 |
9 |
10 |
11 |
Radius 21
12 |
Up
13 |
Down
14 |
15 |
16 |
Intensity 200
17 |
Up
18 |
Down
19 |
20 |
21 |
Opacity .6
22 |
Up
23 |
Down
24 |
25 |
26 |
27 |
28 |
103 |
105 |
106 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "requires": true,
3 | "lockfileVersion": 1,
4 | "dependencies": {
5 | "accepts": {
6 | "version": "1.3.4",
7 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz",
8 | "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=",
9 | "requires": {
10 | "mime-types": "2.1.17",
11 | "negotiator": "0.6.1"
12 | }
13 | },
14 | "array-flatten": {
15 | "version": "1.1.1",
16 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
17 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
18 | },
19 | "body-parser": {
20 | "version": "1.18.2",
21 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz",
22 | "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
23 | "requires": {
24 | "bytes": "3.0.0",
25 | "content-type": "1.0.4",
26 | "debug": "2.6.9",
27 | "depd": "1.1.1",
28 | "http-errors": "1.6.2",
29 | "iconv-lite": "0.4.19",
30 | "on-finished": "2.3.0",
31 | "qs": "6.5.1",
32 | "raw-body": "2.3.2",
33 | "type-is": "1.6.15"
34 | }
35 | },
36 | "bytes": {
37 | "version": "3.0.0",
38 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
39 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
40 | },
41 | "content-disposition": {
42 | "version": "0.5.2",
43 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
44 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ="
45 | },
46 | "content-type": {
47 | "version": "1.0.4",
48 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
49 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
50 | },
51 | "cookie": {
52 | "version": "0.3.1",
53 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
54 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
55 | },
56 | "cookie-signature": {
57 | "version": "1.0.6",
58 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
59 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
60 | },
61 | "debug": {
62 | "version": "2.6.9",
63 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
64 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
65 | "requires": {
66 | "ms": "2.0.0"
67 | }
68 | },
69 | "depd": {
70 | "version": "1.1.1",
71 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
72 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k="
73 | },
74 | "destroy": {
75 | "version": "1.0.4",
76 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
77 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
78 | },
79 | "ee-first": {
80 | "version": "1.1.1",
81 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
82 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
83 | },
84 | "encodeurl": {
85 | "version": "1.0.1",
86 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz",
87 | "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA="
88 | },
89 | "escape-html": {
90 | "version": "1.0.3",
91 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
92 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
93 | },
94 | "etag": {
95 | "version": "1.8.1",
96 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
97 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
98 | },
99 | "express": {
100 | "version": "4.16.2",
101 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz",
102 | "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=",
103 | "requires": {
104 | "accepts": "1.3.4",
105 | "array-flatten": "1.1.1",
106 | "body-parser": "1.18.2",
107 | "content-disposition": "0.5.2",
108 | "content-type": "1.0.4",
109 | "cookie": "0.3.1",
110 | "cookie-signature": "1.0.6",
111 | "debug": "2.6.9",
112 | "depd": "1.1.1",
113 | "encodeurl": "1.0.1",
114 | "escape-html": "1.0.3",
115 | "etag": "1.8.1",
116 | "finalhandler": "1.1.0",
117 | "fresh": "0.5.2",
118 | "merge-descriptors": "1.0.1",
119 | "methods": "1.1.2",
120 | "on-finished": "2.3.0",
121 | "parseurl": "1.3.2",
122 | "path-to-regexp": "0.1.7",
123 | "proxy-addr": "2.0.2",
124 | "qs": "6.5.1",
125 | "range-parser": "1.2.0",
126 | "safe-buffer": "5.1.1",
127 | "send": "0.16.1",
128 | "serve-static": "1.13.1",
129 | "setprototypeof": "1.1.0",
130 | "statuses": "1.3.1",
131 | "type-is": "1.6.15",
132 | "utils-merge": "1.0.1",
133 | "vary": "1.1.2"
134 | }
135 | },
136 | "finalhandler": {
137 | "version": "1.1.0",
138 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz",
139 | "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=",
140 | "requires": {
141 | "debug": "2.6.9",
142 | "encodeurl": "1.0.1",
143 | "escape-html": "1.0.3",
144 | "on-finished": "2.3.0",
145 | "parseurl": "1.3.2",
146 | "statuses": "1.3.1",
147 | "unpipe": "1.0.0"
148 | }
149 | },
150 | "forwarded": {
151 | "version": "0.1.2",
152 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
153 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
154 | },
155 | "fresh": {
156 | "version": "0.5.2",
157 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
158 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
159 | },
160 | "http-errors": {
161 | "version": "1.6.2",
162 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
163 | "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
164 | "requires": {
165 | "depd": "1.1.1",
166 | "inherits": "2.0.3",
167 | "setprototypeof": "1.0.3",
168 | "statuses": "1.3.1"
169 | },
170 | "dependencies": {
171 | "setprototypeof": {
172 | "version": "1.0.3",
173 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
174 | "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ="
175 | }
176 | }
177 | },
178 | "iconv-lite": {
179 | "version": "0.4.19",
180 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
181 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
182 | },
183 | "inherits": {
184 | "version": "2.0.3",
185 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
186 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
187 | },
188 | "ipaddr.js": {
189 | "version": "1.5.2",
190 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz",
191 | "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A="
192 | },
193 | "media-typer": {
194 | "version": "0.3.0",
195 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
196 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
197 | },
198 | "merge-descriptors": {
199 | "version": "1.0.1",
200 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
201 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
202 | },
203 | "methods": {
204 | "version": "1.1.2",
205 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
206 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
207 | },
208 | "mime": {
209 | "version": "1.4.1",
210 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
211 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ=="
212 | },
213 | "mime-db": {
214 | "version": "1.30.0",
215 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz",
216 | "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE="
217 | },
218 | "mime-types": {
219 | "version": "2.1.17",
220 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz",
221 | "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=",
222 | "requires": {
223 | "mime-db": "1.30.0"
224 | }
225 | },
226 | "ms": {
227 | "version": "2.0.0",
228 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
229 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
230 | },
231 | "negotiator": {
232 | "version": "0.6.1",
233 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
234 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
235 | },
236 | "on-finished": {
237 | "version": "2.3.0",
238 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
239 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
240 | "requires": {
241 | "ee-first": "1.1.1"
242 | }
243 | },
244 | "parseurl": {
245 | "version": "1.3.2",
246 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
247 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M="
248 | },
249 | "path": {
250 | "version": "0.12.7",
251 | "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz",
252 | "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=",
253 | "requires": {
254 | "process": "0.11.10",
255 | "util": "0.10.3"
256 | }
257 | },
258 | "path-to-regexp": {
259 | "version": "0.1.7",
260 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
261 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
262 | },
263 | "process": {
264 | "version": "0.11.10",
265 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
266 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
267 | },
268 | "proxy-addr": {
269 | "version": "2.0.2",
270 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz",
271 | "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=",
272 | "requires": {
273 | "forwarded": "0.1.2",
274 | "ipaddr.js": "1.5.2"
275 | }
276 | },
277 | "qs": {
278 | "version": "6.5.1",
279 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
280 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A=="
281 | },
282 | "range-parser": {
283 | "version": "1.2.0",
284 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
285 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
286 | },
287 | "raw-body": {
288 | "version": "2.3.2",
289 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
290 | "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
291 | "requires": {
292 | "bytes": "3.0.0",
293 | "http-errors": "1.6.2",
294 | "iconv-lite": "0.4.19",
295 | "unpipe": "1.0.0"
296 | }
297 | },
298 | "safe-buffer": {
299 | "version": "5.1.1",
300 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
301 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
302 | },
303 | "send": {
304 | "version": "0.16.1",
305 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz",
306 | "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==",
307 | "requires": {
308 | "debug": "2.6.9",
309 | "depd": "1.1.1",
310 | "destroy": "1.0.4",
311 | "encodeurl": "1.0.1",
312 | "escape-html": "1.0.3",
313 | "etag": "1.8.1",
314 | "fresh": "0.5.2",
315 | "http-errors": "1.6.2",
316 | "mime": "1.4.1",
317 | "ms": "2.0.0",
318 | "on-finished": "2.3.0",
319 | "range-parser": "1.2.0",
320 | "statuses": "1.3.1"
321 | }
322 | },
323 | "serve-static": {
324 | "version": "1.13.1",
325 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz",
326 | "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==",
327 | "requires": {
328 | "encodeurl": "1.0.1",
329 | "escape-html": "1.0.3",
330 | "parseurl": "1.3.2",
331 | "send": "0.16.1"
332 | }
333 | },
334 | "setprototypeof": {
335 | "version": "1.1.0",
336 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
337 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
338 | },
339 | "statuses": {
340 | "version": "1.3.1",
341 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
342 | "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4="
343 | },
344 | "type-is": {
345 | "version": "1.6.15",
346 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz",
347 | "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=",
348 | "requires": {
349 | "media-typer": "0.3.0",
350 | "mime-types": "2.1.17"
351 | }
352 | },
353 | "unpipe": {
354 | "version": "1.0.0",
355 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
356 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
357 | },
358 | "util": {
359 | "version": "0.10.3",
360 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
361 | "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
362 | "requires": {
363 | "inherits": "2.0.1"
364 | },
365 | "dependencies": {
366 | "inherits": {
367 | "version": "2.0.1",
368 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
369 | "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
370 | }
371 | }
372 | },
373 | "utils-merge": {
374 | "version": "1.0.1",
375 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
376 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
377 | },
378 | "vary": {
379 | "version": "1.1.2",
380 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
381 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
382 | }
383 | }
384 | }
385 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "javascript-heatmap-creator",
3 | "version": "1.0.0",
4 | "description": "An easy way to visualize your location history with Google and JavaScript",
5 | "dependencies": {
6 | "express": "^4.16.2",
7 | "path": "^0.12.7"
8 | },
9 | "scripts": {
10 | "start": "node app.js"
11 | },
12 | "author": "Brandon Morelli",
13 | "license": "MIT"
14 | }
15 |
--------------------------------------------------------------------------------
/public/style.css:
--------------------------------------------------------------------------------
1 | #map {
2 | height: 100%;
3 | }
4 | html, body {
5 | height: 100%;
6 | margin: 0;
7 | padding: 0;
8 | }
9 | #floating-panel {
10 | display: flex;
11 | position: absolute;
12 | top: 10px;
13 | left: 35%;
14 | z-index: 5;
15 | text-align: center;
16 | }
17 | .group {
18 | border: 1px solid #999;
19 | border-radius: 3px;
20 | margin: 5px;
21 | padding: 5px;
22 | line-height: 25px;
23 | background-color: white;
24 | font-family: 'Roboto','sans-serif';
25 | font-size: small;
26 | }
27 |
28 | #radiusNum, #intensityNum, #opacityNum {
29 | font-weight: 800;
30 | }
--------------------------------------------------------------------------------