2015-11-05 72 views
0

我正在使用D3在正交投影上製作一些JSON數據的交互式可視化。用戶應該能夠通過拖動鼠標/觸控板來旋轉地球儀。D3旋轉球體:如何旋轉格線(網格)?

使用下面的代碼我可以成功地旋轉點,但是格線保持靜態。

我打算在下面創建一個工作片段,但它在嵌入式預覽器上的顯示與在我的機器上顯示的不同;關於如何獲得這項工作的任何提示也感謝!

leeroyjenkins = function() { 
 
    var data = [{ 
 
    "latitude": 0, 
 
    "longitude": 0, 
 
    "magnitude": "1.0" 
 
    }, { 
 
    "latitude": 10, 
 
    "longitude": 10, 
 
    "magnitude": "2.0" 
 
    }, { 
 
    "latitude": 20, 
 
    "longitude": 20, 
 
    "magnitude": "3.0" 
 
    }, { 
 
    "latitude": 30, 
 
    "longitude": 30, 
 
    "magnitude": "4.0" 
 
    }, { 
 
    "latitude": 40, 
 
    "longitude": 40, 
 
    "magnitude": "5.0" 
 
    }, ] 
 

 

 
    main(data); 
 
}; 
 

 

 
var main = function(points) { 
 

 

 
    var width = 600, 
 
     height = 600, 
 
     //rotate = [10, -10], 
 
     time = Date.now(); 
 

 
    var sphere = { 
 
     type: "Sphere" 
 
    }; 
 

 
    var graticule = d3.geo.graticule(); 
 

 

 
    var projection = d3.geo.orthographic() 
 
     .scale(250) 
 
     .translate([width/2, height/2]) 
 
     .clipAngle(90); 
 

 
    var pointpath = function(d, r) { 
 
     var pr = d3.geo.path().projection(projection).pointRadius(r); 
 
     return pr({ 
 
     type: "Point", 
 
     coordinates: [d.longitude, d.latitude] 
 
     }) 
 
    } 
 

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

 
    var λ = d3.scale.linear() 
 
     .domain([0, width]) 
 
     .range([-180, 180]); 
 

 
    var φ = d3.scale.linear() 
 
     .domain([0, height]) 
 
     .range([90, -90]); 
 

 
    var drag = d3.behavior.drag().origin(function() { 
 
     var r = projection.rotate(); 
 
     return { 
 
      x: λ.invert(r[0]), 
 
      y: φ.invert(r[1]) 
 
     }; 
 
     }) 
 
     .on("drag", function() { 
 
     projection.rotate([λ(d3.event.x), φ(d3.event.y)]); 
 
     svg.selectAll("path.point").attr("d", function(d) { 
 
      return pointpath(d, d.magnitude * 2.5); 
 
     }); 
 
     svg.selectAll("path.graticule").attr("d", path); 
 

 
     }); 
 

 

 

 
    var svg = d3.select("body").append("svg") 
 
     .attr("width", width) 
 
     .attr("height", height); 
 

 
    svg.append("path") 
 
     .datum(graticule) 
 
     .attr("class", "graticule") 
 
     .attr("d", path); 
 

 
    var point = svg.selectAll("path.point").data(points); 
 

 
    point.enter() 
 
     .append("path") 
 
     .attr("class", "point") 
 
     .attr("d", function(d) { 
 
     return pointpath(d, 0) 
 
     }) 
 
     .transition() 
 
     .delay(function(d, i) { 
 
     return i * 200; 
 
     }) 
 
     .duration(200) 
 
     .attr("d", function(d) { 
 
     return pointpath(d, d.magnitude * 2.5) 
 
     }); 
 

 
    svg.call(drag); 
 

 
    } //end Main 
 

 
leeroyjenkins();
body { 
 
    background-color: #DDD; 
 
    color: #555; 
 
} 
 
country { 
 
    fill: #ccc; 
 
    stroke: #fff; 
 
    stroke-width: .5px; 
 
    stroke-linejoin: round; 
 
} 
 
graticule { 
 
    fill: none; 
 
    stroke: #EEE; 
 
    stroke-opacity: .3; 
 
    stroke-width: .5px; 
 
} 
 
graticule.outline { 
 
    stroke: #333; 
 
    stroke-opacity: 1; 
 
    stroke-width: 1.5px; 
 
} 
 
div.tooltip { 
 
    position: absolute; 
 
    text-align: center; 
 
    width: 240px; 
 
    height: 60px; 
 
    padding: 2px; 
 
    font: 12px sans-serif; 
 
    background: #FFF; 
 
    border: 0px; 
 
    border-radius: 8px; 
 
    /*pointer-events: none;   */ 
 
} 
 
title { 
 
    display: inline-block; 
 
    font-size: 48px; 
 
    line-height: 90px; 
 
    text-align: center; 
 
} 
 
path.point { 
 
    stroke: red; 
 
    fill: red; 
 
}
<script src="http://d3js.org/topojson.v1.min.js"></script> 
 
<script src="http://d3js.org/d3.geo.projection.v0.min.js"></script> 
 
<script src="http://d3js.org/d3.v3.min.js"></script>

回答

0

我相信我竟然張貼在我的問題正確的代碼,但是,我與預覽問題意味着我沒有注意到,這是工作。

在任何情況下我是有麻煩的部分是:

svg.selectAll("path.graticule").attr("d", path); 

這點我是return pointpath下把就行了。簡單地把代碼放在那個線下就行了。