2016-12-09 5 views
0

Mike Bostockのスピングローブのバージョンを実装し、国ラベルをオーバーレイしようとしています。これは正常にここに達成されました:http://bl.ocks.org/dwtkns/4686432回転グローブでラベルを変換できません

残念ながら私は私を逃れる理由のために私自身のコードでこれを実装することはできません。そして、私はこれがズーム機能を追加したという事実によるものではないかと思います。

これは、私はこれは私が私のコードはここで見つけることができますラベル

function position_labels() { 
    var centerPos = projection.invert([width/2,height/2]); 

    var arc = d3.geo.greatArc(); 

    svg.selectAll(".label") 
    .attr("text-anchor",function(d) { 
     var x = projection(d.geometry.coordinates)[0]; 
     return x < width/2-20 ? "end" : 
      x < width/2+20 ? "middle" : 
      "start" 
    }) 
    .attr("transform", function(d) { 
     var loc = projection(d.geometry.coordinates), 
     x = loc[0], 
     y = loc[1]; 
     var offset = x < width/2 ? -5 : 5; 
     return "translate(" + (x+offset) + "," + (y-2) + ")" 
    }) 
    .style("display",function(d) { 
     var d = arc.distance({source: d.geometry.coordinates, target: centerPos}); 
     return (d > 1.57) ? 'none' : 'inline'; 
    }) 

} 

を変換しようとする方法であるラベル

var label = svg.selectAll("text") 
     .data(collection.features) 
     .enter() 
     .append("text") 
     .attr("class", "label") 
//  .attr("transform", function(d) { return "translate(" + //path.centroid(d) + ")"; }) 
     .text(function(d) { return d.properties.name;}); 

を初期化する方法です。 http://jsfiddle.net/Guill84/3078L7x2/あなたのヘルプは非常に高く評価されるだろう

、あなたは毎回世界の動きをラベルの位置を更新し続ける必要がある)

答えて

1

。あなたのコードを少し変更し、私の変更のためにコメント// updateを追加しました。これは、地球と一緒にラベルを移動するだけです。しかし、うまくいけば出発点として役立つ。 textstartAnimation()move()中を付加した後position_labels()を呼び出すhttp://jsfiddle.net/3078L7x2/4/

function position_labels() { 
    // var centerPos = projection.invert([width/2,height/2]); 
    // var arc = d3.geo.greatArc(); 
    // update: update path projection before applying it to labels position 
    path.projection(projection); 
    svg.selectAll(".label").attr("transform", function(d) { 
      return "translate(" + path.centroid(d) + ")"; 
     }) 
     // svg.selectAll(".label") 
     // .attr("text-anchor",function(d) { 
     //  var x = projection(d.geometry.coordinates)[0]; 
     //  return x < width/2-20 ? "end" : 
     //   x < width/2+20 ? "middle" : 
     //   "start" 
     // }) 
     // .attr("transform", function(d) { 
     // var loc = projection(d.geometry.coordinates), 
     //  x = loc[0], 
     //  y = loc[1]; 
     // var offset = x < width/2 ? -5 : 5; 
     // return "translate(" + (x+offset) + "," + (y-2) + ")" 
     // }) 
     // .style("display",function(d) { 
     //  var d = arc.distance({source: d.geometry.coordinates, target: centerPos}); 
     //  return (d > 1.57) ? 'none' : 'inline'; 
     // }) 
} 

+0

Phoa - 私はアニメーションをリフレッシュするのを忘れて信じられないほどです。確かに非常にダム。私はあなたのコードを進歩させ、コードを修正して、地球の反対側のラベルを隠すようにしました。私は(私は)パス重心と地球の中心位置との間の距離を計算することによってこれを行うと考える。しかし何らかの理由でそれは矛盾していて、間違ったラベルを隠しているようです...私は私の仕事を次のように保存しました - 私が間違っていることを知らせてください:http://jsfiddle.net/Guill84/kh3kegsy/ – Noobster

+0

@Noobster - ラベルを隠すために 'circle.clip(d)'を使って 'position_labels'関数を修正しました。国のパスがマップ上に描かれているのと同じ方法です。ここにはフィドルがあります - [http://jsfiddle.net/kh3kegsy/5/](http://jsfiddle.net/kh3kegsy/5/) – phoa

関連する問題