Имам 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