Fix broken static maps bounds overlay (for very large areas)

This commit is contained in:
Petr Sloup 2017-05-05 16:14:22 +02:00
parent 1109c77ec2
commit c233d23523

View file

@ -310,11 +310,13 @@ module.exports = function(options, repo, params, id, dataResolver) {
var respondImage = function(z, lon, lat, bearing, pitch, var respondImage = function(z, lon, lat, bearing, pitch,
width, height, scale, format, res, next, width, height, scale, format, res, next,
opt_overlay) { opt_overlay) {
if (Math.abs(lon) > 180 || Math.abs(lat) > 85.06) { if (Math.abs(lon) > 180 || Math.abs(lat) > 85.06 ||
lon != lon || lat != lat) {
return res.status(400).send('Invalid center'); return res.status(400).send('Invalid center');
} }
if (Math.min(width, height) <= 0 || if (Math.min(width, height) <= 0 ||
Math.max(width, height) * scale > (options.maxSize || 2048)) { Math.max(width, height) * scale > (options.maxSize || 2048) ||
width != width || height != height) {
return res.status(400).send('Invalid size'); return res.status(400).send('Invalid size');
} }
if (format == 'png' || format == 'webp') { if (format == 'png' || format == 'webp') {
@ -466,9 +468,19 @@ module.exports = function(options, repo, params, id, dataResolver) {
return [px[0] * scale, px[1] * scale]; return [px[0] * scale, px[1] * scale];
}; };
var center = precisePx([x, y], z);
var mapHeight = 512 * (1 << z);
var maxEdge = center[1] + h / 2;
var minEdge = center[1] - h / 2;
if (maxEdge > mapHeight) {
center[1] -= (maxEdge - mapHeight);
} else if (minEdge < 0) {
center[1] -= minEdge;
}
var canvas = new Canvas(scale * w, scale * h); var canvas = new Canvas(scale * w, scale * h);
var ctx = canvas.getContext('2d'); var ctx = canvas.getContext('2d');
var center = precisePx([x, y], z);
ctx.scale(scale, scale); ctx.scale(scale, scale);
if (bearing) { if (bearing) {
ctx.translate(w / 2, h / 2); ctx.translate(w / 2, h / 2);
@ -656,9 +668,14 @@ module.exports = function(options, repo, params, id, dataResolver) {
bbox[3] = Math.max(bbox[3], pair[1]); bbox[3] = Math.max(bbox[3], pair[1]);
}); });
var bbox_ = mercator.convert(bbox, '900913');
var center = mercator.inverse(
[(bbox_[0] + bbox_[2]) / 2, (bbox_[1] + bbox_[3]) / 2]
);
var z = calcZForBBox(bbox, w, h, req.query), var z = calcZForBBox(bbox, w, h, req.query),
x = (bbox[0] + bbox[2]) / 2, x = center[0],
y = (bbox[1] + bbox[3]) / 2; y = center[1];
var overlay = renderOverlay(z, x, y, bearing, pitch, w, h, scale, var overlay = renderOverlay(z, x, y, bearing, pitch, w, h, scale,
path, req.query); path, req.query);