У меня есть карта D3js, созданная с помощью topojson.js.
var projection = d3.geo.mercator();
Все работает нормально, но я ищу эффект, которого не могу добиться. Когда, увеличивая карту, я хотел бы, чтобы булавки над ней уменьшались, но если я уменьшаю ее, мне нужно пересчитать их координаты, и я не могу найти формулу для этого.
Обработчик масштабирования
scale = d3.event.scale;
if (scale >= 1) {
main.attr("transform", "translate(" + d3.event.translate + ")
scale(" + d3.event.scale + ")");
}
else {
main.attr("transform", "translate(" + d3.event.translate + ")scale(1)");
}
//43x49 is the size initial pine size when scale = 1
var pins = main.select("#pins").selectAll("g").select("image")
.attr("width", function () {
return 43 - (43 * (scale - 1));
})
.attr("height", function () {
return 49 - (49 * (scale - 1));
})
.attr("x", function () {
//Calculate new image coordinates;
})
.attr("y", function () {
//Calculate new image coordinates;
});
Мой вопрос: как рассчитать x и y на основе новой шкалы?
Я надеюсь, что я достаточно ясен.
Спасибо за вашу помощь
РЕДАКТИРОВАТЬ :
Расчет начальных координат пинов:
"translate(" + (projection([d.lon, d.lat])[0] - 20) + ","
+ (projection([d.lon, d.lat])[1] - 45) + ")"
-20 и -45, чтобы острие булавки попало точно в цель.
main
(который, как я предполагаю, является элементомg
илиsvg
), то вам вообще не нужно менятьx
иy
приscale
контейнере. Кроме того, вы можете установить scaleExtent вместо ручной проверкиscale >= 1
. Это также дало бы вам лучшее поведение (например, отсутствие гистерезиса при масштабировании, если пользователь слишком сильно уменьшает масштаб). - person musically_ut   schedule 15.04.2015