From 8302478c4f13a3c866e44ff24b2e93cc4f2a38fb Mon Sep 17 00:00:00 2001 From: Philipp Borgers Date: Wed, 19 Jan 2011 15:56:51 +0100 Subject: [PATCH] initial commit --- main.js | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 main.js diff --git a/main.js b/main.js new file mode 100644 index 0000000..96d2948 --- /dev/null +++ b/main.js @@ -0,0 +1,118 @@ +var mapnik = require('mapnik'); +var TC = require('./node-tokyocabinet/build/default/tokyocabinet'); + +var path = require('path'); +var clutch = require('clutch'); +var hasher = require('crypto').createHash('md5'); + +var async = require('async'); + +var queue = async.queue(render,2); + +var stylesheet = path.join(__dirname,"style.xml"); + +console.log("Tokyo Cabinet version " + TC.VERSION); + +var HDB = TC.HDB; + +var hdb = new HDB; + + if (!hdb.open('tile.tch', HDB.OWRITER | HDB.OCREAT)) { + sys.error(hdb.errmsg()); + } + + + + +function render(task, callback) { + + var map = new mapnik.Map(256,256); + map.load(task.stylesheet+".xml"); + map.zoom_all(); + + map.render(map.extent(),function(data) { + + if(data) { + //TODO clean up tags, different values for different tiles + //var hash = hasher.update(data).digest('hex'); + var hash = 'dfasdf'; + task.res.writeHead(200, { + 'Content-Type': 'image/png', + 'ETag' : hash, + 'Cache-Control' : 'max-age=3600', + //TODO fix date representation + 'Expires:' : new Date(new Date().getTime()+3600000), + }); + + task.res.end(data); + + var temp = { + 'data' : data.toString('base64'), + 'timestamp' : new Date().getTime(), + 'ETag' : hash, + }; + + console.log(temp.timestamp); + console.log(temp.ETag); + hdb.put(task.url, JSON.stringify(temp)); + //hdb.put(url, data.toString('base64')); + } + else { + task.res.writeHead(404, {'Content-Type': 'text/plain'}); + task.res.end(); + } + callback(); + }); + + + +} + +function render2(worker) { + //console.log(worker); + worker.finish(); +} + + +function requestHandler(req, res, style, z, x, y) { + //console.log(style, z, x, y); + var url = style + "/" + z + "/" + x + "/" + y; + + hdb.getAsync(url, function(err, value) { + //console.log(value); + if(err) { + var renderTask = { + 'url' : url, + 'res' : res, + 'stylesheet' : style, + 'z' : z, + 'x' : x, + 'y' : y + }; + + queue.push(renderTask, function() {}); + //var data = map.render_to_string(); + + } + else { + //console.log(value); + res.writeHead(200, {'Content-Type': 'image/png'}); + res.end(new Buffer( JSON.parse(value).data,'base64')); } + + }); + + +} + + +var myRoutes = clutch.route404([ + ['GET /(\\w+)/(\\d+)/(\\d+)/(\\d+).png$', requestHandler], + ]); + + + + +var http = require('http'); +http.createServer(myRoutes).listen(8080, 'localhost'); + +