2013-04-02 144 views
1

我正在修改可縮放和可點擊的地圖,找到http://bl.ocks.org/mbostock/2206340來繪製一些點並做一些其他的事情。現在,我試圖讓它在放大和點擊動作時,繪製的點也移動/兌現縮放。我不確定這裏的代碼是什麼錯誤,因爲我似乎在zoom + click中調用red.circle和blue.circle對象 - 任何人都可以確定問題嗎?謝謝! data.csv的格式如下:d3.js - 縮放和點擊中心 - 地圖比例尺,點不要

lon_0,lat_0,lon_1,lat_1 
-122.1430195,37.4418834,-122.415278,37.778643 
-122.1430195,37.4418834,-122.40815,37.785034 
-122.4194155,37.7749295,-122.4330827,37.7851673 
-122.4194155,37.7749295,-122.4330827,37.7851673 
-118.4911912,34.0194543,-118.3672828,33.9164666 
-121.8374777,39.7284944,-121.8498415,39.7241178 
-115.172816,36.114646,-115.078011,36.1586877 

這裏是d3.js腳本。

.background { 
    fill: none; 
    pointer-events: all; 
} 

#states path { 
    fill: #aaa; 
    stroke: #fff; 
    stroke-width: 1.5px; 
} 

#states path:hover { 
    stroke: white; 
} 

</style> 
<body> 
<script> 

var width = 1920/2, 
    height = 1000/2; 

var projection = d3.geo.albersUsa() 
    .scale(width) 
    .translate([width/2, height/2]); 

var path = d3.geo.path() 
    .projection(projection); 

var zoom = d3.behavior.zoom() 
    .translate(projection.translate()) 
    .scale(projection.scale()) 
    .scaleExtent([height, 50 * height]) 
    .on("zoom", zoom); 

var svg = d3.select("body").append("svg") 
    .attr("width", width) 
    .attr("height", height) 
    .attr("style", "stroke:black; stroke-width:2px"); 

var states = svg.append("g") 
    .attr("id", "states") 
    .call(zoom); 

var dataset = []; 


states.append("rect") 
    .attr("class", "background") 
    .attr("width", width) 
    .attr("height", height); 

d3.json("us-states.json", function(json) { 

    states.selectAll("path") 
     .data(json.features) 
    .enter().append("path") 
     .attr("d", path) 
     .on("click", click); 

d3.csv("data.csv", function(data) { 
    states.selectAll(".blue.circle") 
    .data(data) 
    .enter() 
    .append("circle") 
    .attr("cx", function(d) { 
       return projection([d["lon_0"], d["lat_0"] ])[0]; 
       }) 
    .attr("cy", function(d) { 
       return projection([d["lon_0"],d["lat_0"] ])[1]; 
       }) 
    .attr("r", 5) 
    .attr("class", "blue circle") 
    .style("fill", "blue"); 
    states.selectAll(".red.circle") 
    .data(data) 
    .enter() 
    .append("circle") 
    .attr("cx", function(d) { 
       return projection([+d["lon_1"], +d["lat_1"] ])[0]; 
       }) 
    .attr("cy", function(d) { 
       return projection([+d["lon_1"],+d["lat_1"] ])[1]; 
       }) 
    .attr("r", 5) 
    .attr("class", "red circle") 
    .style("fill", "red"); 
    }); 

}); 

function click(d) { 
    var centroid = path.centroid(d), 
     translate = projection.translate(); 

    projection.translate([ 
    translate[0] - centroid[0] + width/2, 
    translate[1] - centroid[1] + height/2 
    ]); 

    zoom.translate(projection.translate()); 

    states.selectAll("path").transition() 
     .duration(1000) 
     .attr("d", path); 

    states.selectAll("red.circle").transition() 
     .duration(1000) 
     .attr("d", circle); 
    states.selectAll("blue.circle").transition() 
     .duration(1000) 
     .attr("d", circle);  

} 

function zoom() { 
    projection.translate(d3.event.translate).scale(d3.event.scale); 
    states.selectAll("path").attr("d", path); 
    states.selectAll("red.circle").attr("d", path); 
    states.selectAll("blue.circle").attr("d",path); 
} 
</script> 

回答

0

你設置圓的座標,當你加載地圖,所以當你點擊放大功能,顯示你的圈子中但沒有使用相同的座標 - 我認爲 - 如果您可以創建http://bl.ocks.org來查看此信息,這將有所幫助。

也許這可能有幫助http://bl.ocks.org/nkhine/3150901只有英國,美國和Afganistan的作品,但我基本上重新投影輔助地圖,以適應新的縮放級別。