2018-09-30 14:50:09 -04:00
|
|
|
/**
|
|
|
|
* Tileserver routes for Express app
|
|
|
|
*
|
|
|
|
*/
|
2018-09-10 05:44:32 -04:00
|
|
|
import express from 'express';
|
|
|
|
|
2019-01-22 17:37:44 -05:00
|
|
|
import { render_tile } from './tile';
|
2019-02-24 07:17:59 -05:00
|
|
|
import { strictParseInt } from '../parse';
|
2018-09-10 05:44:32 -04:00
|
|
|
|
|
|
|
// tiles router
|
|
|
|
const router = express.Router()
|
|
|
|
|
2019-02-24 08:34:40 -05:00
|
|
|
router.get('/highlight/:z/:x/:y.png', handle_highlight_tile_request);
|
2018-10-25 05:16:18 -04:00
|
|
|
|
2019-02-24 08:34:40 -05:00
|
|
|
router.get('/base_light/:z/:x/:y.png', (req, res) => {
|
|
|
|
handle_tile_request('base_light', req, res)
|
2018-10-25 05:16:18 -04:00
|
|
|
});
|
|
|
|
|
2019-02-24 08:34:40 -05:00
|
|
|
router.get('/base_night/:z/:x/:y.png', (req, res) => {
|
|
|
|
handle_tile_request('base_night', req, res)
|
|
|
|
});
|
2018-09-10 05:44:32 -04:00
|
|
|
|
2019-02-24 08:34:40 -05:00
|
|
|
router.get('/date_year/:z/:x/:y.png', (req, res) => {
|
|
|
|
handle_tile_request('date_year', req, res)
|
2018-09-10 05:44:32 -04:00
|
|
|
});
|
|
|
|
|
2019-02-24 08:34:40 -05:00
|
|
|
router.get('/size_storeys/:z/:x/:y.png', (req, res) => {
|
|
|
|
handle_tile_request('size_storeys', req, res)
|
|
|
|
});
|
2018-09-10 05:44:32 -04:00
|
|
|
|
2019-02-24 08:34:40 -05:00
|
|
|
router.get('/location/:z/:x/:y.png', (req, res) => {
|
|
|
|
handle_tile_request('location', req, res)
|
2018-09-10 05:44:32 -04:00
|
|
|
});
|
|
|
|
|
2019-02-24 08:34:40 -05:00
|
|
|
router.get('/likes/:z/:x/:y.png', (req, res) => {
|
|
|
|
handle_tile_request('likes', req, res)
|
|
|
|
});
|
2018-09-10 05:44:32 -04:00
|
|
|
|
2019-02-24 08:34:40 -05:00
|
|
|
router.get('/conservation_area/:z/:x/:y.png', (req, res) => {
|
|
|
|
handle_tile_request('conservation_area', req, res)
|
2018-09-10 05:44:32 -04:00
|
|
|
});
|
|
|
|
|
2019-02-24 08:34:40 -05:00
|
|
|
function handle_tile_request(tileset, req, res) {
|
|
|
|
const { z, x, y } = req.params
|
|
|
|
const int_z = strictParseInt(z);
|
|
|
|
const int_x = strictParseInt(x);
|
|
|
|
const int_y = strictParseInt(y);
|
2018-09-10 05:44:32 -04:00
|
|
|
|
2019-02-24 08:34:40 -05:00
|
|
|
if (isNaN(int_x) || isNaN(int_y) || isNaN(int_z)){
|
|
|
|
console.error("Missing x or y or z")
|
|
|
|
return {error:'Bad parameter'}
|
|
|
|
}
|
2018-09-10 05:44:32 -04:00
|
|
|
|
2019-02-24 08:34:40 -05:00
|
|
|
render_tile(tileset, int_z, int_x, int_y, undefined, function(err, im) {
|
2018-10-25 07:39:41 -04:00
|
|
|
if (err) throw err
|
|
|
|
|
|
|
|
res.writeHead(200, {'Content-Type': 'image/png'})
|
|
|
|
res.end(im.encodeSync('png'))
|
|
|
|
})
|
2019-02-24 08:34:40 -05:00
|
|
|
}
|
2018-10-25 07:39:41 -04:00
|
|
|
|
2019-02-24 08:34:40 -05:00
|
|
|
function handle_highlight_tile_request(req, res) {
|
|
|
|
const { z, x, y } = req.params
|
|
|
|
const int_z = strictParseInt(z);
|
|
|
|
const int_x = strictParseInt(x);
|
|
|
|
const int_y = strictParseInt(y);
|
2018-10-25 08:48:48 -04:00
|
|
|
|
2019-02-24 08:34:40 -05:00
|
|
|
if (isNaN(int_x) || isNaN(int_y) || isNaN(int_z)){
|
|
|
|
console.error("Missing x or y or z")
|
|
|
|
return {error:'Bad parameter'}
|
|
|
|
}
|
2018-10-25 08:48:48 -04:00
|
|
|
|
2019-02-24 08:34:40 -05:00
|
|
|
// highlight layer uses geometry_id to outline a single building
|
|
|
|
const { highlight } = req.query
|
|
|
|
const geometry_id = strictParseInt(highlight);
|
|
|
|
if(isNaN(geometry_id)){
|
|
|
|
res.status(400).send({error:'Bad parameter'})
|
|
|
|
return
|
|
|
|
}
|
2019-01-19 11:55:30 -05:00
|
|
|
|
2019-02-24 08:34:40 -05:00
|
|
|
render_tile('highlight', int_z, int_x, int_y, geometry_id, function(err, im) {
|
2019-01-19 11:55:30 -05:00
|
|
|
if (err) throw err
|
|
|
|
|
|
|
|
res.writeHead(200, {'Content-Type': 'image/png'})
|
|
|
|
res.end(im.encodeSync('png'))
|
|
|
|
})
|
2019-02-24 08:34:40 -05:00
|
|
|
}
|
2019-01-19 11:55:30 -05:00
|
|
|
|
2018-09-10 05:44:32 -04:00
|
|
|
export default router;
|