Я отвечаю за доставку страниц для отображения первичных результатов выборов в США по штатам. На каждой странице нужен баннер с изображением штата, размером примерно 250 на 250 пикселей. Теперь все, что мне нужно сделать, это выяснить, как обслуживать / генерировать эти изображения ...
Я копался в документации / примерах для Protovis и думаю, что я
мог бы поднять контуры координат штата- мне пришлось бы
вручную преобразовать данные координат, чтобы они были выровнены по размеру
правильно (ick)
На другом конце умного / грубого спектра огромный спрайт
или серия спрайтов. Даже с сжатием PNG 8 размер файла
сетка из 50 неперекрывающихся 250x250px спрайтов является проблемой, и
к сожалению, такой файл, кажется, не существует, поэтому мне придется его создать
с руки. Также неприятно.
У кого есть идея получше?
Ответ: правильное решение - перейти на d3.
Что мы взломали на данный момент:
drawStateInBox = function(box, state, color) {
var w = $("#" + box).width(),
h = $("#" + box).height(),
off_x = 0,
off_y = 0;
borders = us_lowres[state].borders;
//Preserve aspect ratio
delta_lat = pv.max(borders[0], function(b) b.lat) - pv.min(borders[0], function(b) b.lat);
delta_lng = pv.max(borders[0], function(b) b.lng) - pv.min(borders[0], function(b) b.lng);
if (delta_lat / h > delta_lng / w) {
scaled_h = h;
scaled_w = w * delta_lat / delta_lng;
off_x = (w - scaled_w) / 2;
} else {
scaled_h = h * delta_lat / delta_lng;
scaled_w = w;
off_y = (h - scaled_h) / 2;
}
var scale = pv.Geo.scale()
.domain(us_lowres[state].borders[0])
.range({x: off_x, y: off_y},
{x: scaled_w + off_x, y: scaled_h + off_y});
var vis = new pv.Panel(state)
.canvas(box)
.width(w)
.height(h)
.data(borders)
.add(pv.Line)
.data(function(l) l)
.left(scale.x)
.top(scale.y)
.fillStyle(function(d, l, c) {
return(color);
})
.lineWidth(0)
.strokeStyle(color)
.antialias(false);
vis.render();
};