Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Benedikt Groß
committed
Feb 9, 2017
1 parent
a1b0768
commit a9a49fd
Showing
3 changed files
with
98 additions
and
70 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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); | ||
}); |