Skip to content

Commit

Permalink
refactoring and upgrades
Browse files Browse the repository at this point in the history
  • Loading branch information
Benedikt Groß committed Feb 9, 2017
1 parent a1b0768 commit a9a49fd
Show file tree
Hide file tree
Showing 3 changed files with 98 additions and 70 deletions.
56 changes: 56 additions & 0 deletions TileService.js
@@ -0,0 +1,56 @@
"use strict";

var config = require('./config');
var MBTiles = require('mbtiles');
var path = require('path');
var fs = require('fs');


var TileService = function(query) {
this.q = query;
};

TileService.prototype.getInfo = function(done) {
this._initMBTiles(function(err, mbtiles) {
if (err) return done(err);
mbtiles.getInfo(function(err, info) {
if (err) return done(new Error('cannot get metadata'));
done(null, info);
});
});
};

TileService.prototype.getTile = function(done) {
var that = this;
that._initMBTiles(function(err, mbtiles) {
if (err) return done(err);
mbtiles.getTile(that.q.params.z, that.q.params.x, that.q.params.y, function(err, tile, headers) {
if (err) return done(err);
done(null, tile, headers);
});
});
};

TileService.prototype.getGrid = function(done) {
var that = this;
that._initMBTiles(function(err, mbtiles) {
if (err) return done(err);
mbtiles.getGrid(that.q.params.z, that.q.params.x, that.q.params.y, function(err, tile, headers) {
if (err) return done(err);
done(null, tile, headers);
});
});
};

TileService.prototype._initMBTiles = function(done) {
var mbtilesfile = path.join(config.TILES_DIR, this.q.params.ts + '.mbtiles');
fs.exists(mbtilesfile, function (exists) {
if (!exists) return done(new Error('cannot find MBTiles file on server: ' + mbtilesfile));
new MBTiles(mbtilesfile, function(err, mbtiles) {
if (err) return done(new Error('cannot initialize MBTiles object'));
done(null, mbtiles);
});
});
};

module.exports = TileService;
12 changes: 6 additions & 6 deletions config.js
@@ -1,12 +1,12 @@
"use strict";

var path = require("path");
var path = require('path');

var config = {
PORT: process.env.OPENSHIFT_NODEJS_PORT || 8000,
IPADDRESS: process.env.OPENSHIFT_NODEJS_IP || '0.0.0.0',
TILES_DIR: process.env.OPENSHIFT_DATA_DIR || path.join(__dirname, '/data'),
PORT: process.env.OPENSHIFT_NODEJS_PORT || 8000,
IPADDRESS: process.env.OPENSHIFT_NODEJS_IP || '0.0.0.0',
TILES_DIR: process.env.OPENSHIFT_DATA_DIR || path.join(__dirname, '/data'),
MAP_DIR: path.join(__dirname, '/static/map'),
}

console.log(config);
module.exports = config;
module.exports = config;
100 changes: 36 additions & 64 deletions server.js
@@ -1,90 +1,62 @@
var express = require("express"),
app = express(),
config = require('./config'),
MBTiles = require('mbtiles'),
path = require("path"),
fs = require('fs');
"use strict";

var express = require('express');
var app = exports.app = express();

/* ----- this is the tile service ------ */
var TileService = function(query) {
this.q = query;
};

TileService.prototype.getInfo = function(done) {
this._initMBTiles(function(err, mbtiles) {
if (err) return done(err);
mbtiles.getInfo(function(err, info) {
if (err) return done(new Error("cannot get metadata"));
console.log(info);
done(null, info);
});
});
};

TileService.prototype.getTile = function(done) {
var that = this;
console.log(that.q.params);
that._initMBTiles(function(err, mbtiles) {
if (err) return done(err);
mbtiles.getTile(that.q.params.z, that.q.params.x, that.q.params.y, function(err, tile, headers) {
if (err) return done(err);
done(null, tile, headers);
});
});
};

TileService.prototype._initMBTiles = function(done) {
var mbtilesfile = path.join(config.TILES_DIR, this.q.params.ts + '.mbtiles');
console.log(mbtilesfile);
fs.exists(mbtilesfile, function(exists) {
if (!exists) return done(new Error("cannot find MBTiles file on server: " + mbtilesfile));
new MBTiles(mbtilesfile, function(err, mbtiles) {
if (err) return done(new Error("cannot initialize MBTiles object"));
done(null, mbtiles);
});
});
};
var config = require('./config');
var TileService = require('./TileService');

/* ------- the route handlers -------- */

var handlers = {
var routeHandlers = {
getTile: function(req, res, next) {
var tileService = new TileService(req);
tileService.getTile(function(err, tile, headers) {
if (err) res.status(404).send(err.message);
if (err) return res.status(404).send(err.message);
res.set(headers);
res.send(tile);
});
},
getGrid: function(req, res, next) {
var tileService = new TileService(req);
tileService.getGrid(function(err, tile, headers) {
if (err) return res.status(404).send(err.message);
res.set(headers);
res.send(tile);
});
},
getInfo: function(req, res, next) {
var tileService = new TileService(req);
tileService.getInfo(function(err, info) {
if (err) return next(err);
if (err) return res.status(404).send(err.message);
res.json(info);
});
},
ping: function(req, res, next){
res.send("tileservice says pong");
}
res.send('tilehut says pong!');
},
// openshift expects to get a valid response from '/' (health status)
healthStatus: function(req, res, next){
res.send(':)');
},
};

// TODO Cache-Control: setting

app.route('/ping').get(handlers.ping);
app.route('/data/:ts/:z/:x/:y.*').get(handlers.getTile);
app.route('/data/:ts/meta.json').get(handlers.getInfo);

app.use('*', function(req, res, next) {
next();
// set CORS response header AFTER the get functions ...
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'X-Requested-With');
});

app.use('/:ts/map', express.static(config.MAP_DIR));

//http://localhost:8000/data/de_berlin_1_100/10/8.580322/48.173413
/*
{"scheme":"tms","basename":"de_berlin_1_100.mbtiles","id":"de_berlin_1_100","filesize":111284224,"name":"de_berlin_1_100.mbtiles","description":"de_berlin_1_100.mbtiles","version":"1","minzoom":0,"maxzoom":14,"center":[8.580322,48.173413,14],"bounds":[5.85608,47.29663,25.223128,60.256121],"type":"overlay","format":"pbf","vector_layers":[{"id":"de_berlin_1_100","description":"","minzoom":0,"maxzoom":14,"fields":{"n":"Number"}}]}
*/
//http://localhost:8000/data/test/14/88.593321/47.049833
/*
{"scheme":"tms","basename":"test.mbtiles","id":"test","filesize":11542528,"name":"test.mbtiles","description":"test.mbtiles","version":"2","minzoom":0,"maxzoom":14,"center":[-106.138916,34.912962,14],"bounds":[-106.171875,-39.368279,88.59375,68.007571],"type":"overlay","format":"pbf","vector_layers":[{"id":"mapgeojson","description":"","minzoom":0,"maxzoom":14,"fields":{}}]}
*/
app.route('/:ts/:z/:x/:y.*grid.json$').get(routeHandlers.getGrid);
app.route('/:ts/:z/:x/:y.*').get(routeHandlers.getTile);
app.route('/:ts/meta.json').get(routeHandlers.getInfo);
app.route('/ping').get(routeHandlers.ping);
app.route('/').get(routeHandlers.healthStatus);

app.listen(config.PORT, config.IPADDRESS, function() {
console.log('Tilehut on http://%s:%s', config.IPADDRESS, config.PORT);
console.info('Tilehut on http://%s:%s', config.IPADDRESS, config.PORT);
});

0 comments on commit a9a49fd

Please sign in to comment.