マップの範囲を動的に変更することは現在不可能であることを知っています。
だから代わりに私はしようとしています:
マップを作成する イベントが発生したら、マップを廃棄し、新しい投影法を含む新しい詳細で新しいマップを描画します。
問題は、古い地図を適切にスクラップできないことです。私はマップ変数を取り、svg プロパティで remove() を呼び出し、パフォーマンスのために「delete svg」を使用してから、オブジェクトを分解しようとしていました。次に、マップ変数を関数 A の結果に再割り当てします。ここで、関数 A は新しいマップを設定するだけです。
新しいマップを作成する関数:
function createMap (latlon){
var basicMap = new Datamap({
element: document.getElementById("basic"),
setProjection: function(element) {
var projection = d3.geo.equirectangular()
.center(latlon)
.rotate([0, 0])
.scale(1200)
.translate([element.offsetWidth / 2, element.offsetHeight / 2]);
var path = d3.geo.path()
.projection(projection);
return {path: path, projection: projection};
},
projection: "mercator",
scope: 'world',
fills: {
defaultFill: "#ABDDA4",
},
responsive: true,
done: function(datamap){
datamap.svg.call(d3.behavior.zoom().on("zoom", redraw));
$("#resetZoom").on("click", function(){
resetZoom();
})
function redraw() {
datamap.svg.selectAll("g").attr("transform", "translate(" + d3.event.translate + ")scale(" + d3.event.scale + ")");
}
function resetZoom() { datamap.svg.selectAll("g").attr("transform", "translate(0,0)scale(1.0)"); }
},
});
return basicMap
}
破壊する機能:
function cleanUp(map){
map.svg.remove();
delete map.svg;
delete map;
}
次のようにマップを初期化basic
します
basic = createMap([2,46]);
その後、マップを消去して (破棄関数)、再割り当てします。
cleanUp(basic);
basic = createMap([personLon, personLat])
表面的には、問題なく動作します。そして、パフォーマンスは大丈夫です。しかし、実際には正しく機能していません。たとえば、ズーム機能が機能しなくなりました。ズームボタンが押されると、マップ変数を探して、もう見つけることができません。新しいマップはボタンなどの新しいクリックハンドラーを作成するため、これは意味がありません。それはほとんど動作します。
しかし、これはうまくいきません。任意のヒント?ありがとう。