|
var Canvas = require('canvas'), |
|
moment = require('moment'), |
|
fs = require('fs'); |
|
|
|
var sqlite3 = require('sqlite3').verbose(); |
|
var db = new sqlite3.Database('changesets_precise.sqlite'); |
|
|
|
var block = 1; |
|
var w = 360 * 4, h = 180 * 4; |
|
var c = new Canvas(w, h); |
|
var ctx = c.getContext('2d'); |
|
|
|
ctx.fillStyle = '#e9e9e9'; |
|
ctx.fillRect(0, 0, w, h); |
|
|
|
function x(lon) { |
|
return (lon + 180) / 360 * w; |
|
} |
|
|
|
function y(lat) { |
|
return (90 - lat) / 180 * h; |
|
} |
|
|
|
var drawn = {}; |
|
|
|
var gap = (60 * 60 * 24 * 73); |
|
var n = 0; |
|
|
|
var colors = ['#FF00C3', '#0091FF']; |
|
var col = 0; |
|
ctx.globalCompositeOperation = 'multiply'; |
|
ctx.fillStyle = colors[col]; |
|
ctx.fillText('OpenStreetMap', w - 100, h - 20); |
|
db.get('SELECT min(closed_at) as m FROM osm_changeset LIMIT 1;', function(err, min) { |
|
db.get('SELECT max(closed_at) as m FROM osm_changeset LIMIT 1;', function(err, max) { |
|
var start = min.m; |
|
var end = min.m + gap; |
|
ctx.fillText(moment(new Date(min.m * 1000)).format('L'), 10, h - 20); |
|
ctx.fillText(moment(new Date(max.m * 1000)).format('L'), 400, h - 20); |
|
|
|
function run() { |
|
drawn = {}; |
|
ctx.globalAlpha = 0.2; |
|
ctx.fillRect( |
|
70, |
|
h - 26, |
|
~~((((start - min.m) / (max.m - min.m)) * 290)), |
|
5); |
|
ctx.globalAlpha = 1; |
|
db.each("SELECT lon, lat FROM osm_changeset WHERE closed_at BETWEEN " + start + " AND " + end + ";", function(err, row) { |
|
var xp = Math.floor(x(row.lon)); |
|
var yp = Math.floor(y(row.lat)); |
|
var k = xp + ' ' + yp; |
|
if (drawn[k]) return; |
|
ctx.fillRect( |
|
xp, |
|
yp, |
|
block, block); |
|
drawn[k] = true; |
|
}, function() { |
|
var k = '' + n; |
|
if (k.length == 1) k = '0' + k; |
|
fs.writeFileSync('changesets_' + k + '.png', c.toBuffer()); |
|
if (start > max.m) return; |
|
start += gap; |
|
end += gap; |
|
n++; |
|
col++; |
|
if (col > 1) col = 0; |
|
ctx.fillStyle = colors[col]; |
|
run(); |
|
}); |
|
} |
|
|
|
run(); |
|
}); |
|
}); |
Create a lon and lat column in osm_changeset table type REAL.
Then,
UPDATE osm_changeset SET lat=(max_lon - ((max_lon - min_lon) / 2));
UPDATE osm_changeset SET lat=(max_lat - ((max_lat - min_lat) / 2));
Above creates arbitrary center points between the maximum and minimum values for lon and lat for the script to use.