2016-04-15 25 views
0

我對這個奇怪的標題表示歉意,描述我的問題並不容易,希望其他人需要對同一問題的解決方案最終在這裏結束。我在地圖上有一些標記;他們的x,y位置是由一些器件提供的long,lat產生的,所以一些標記重疊,因爲它們具有確切的x,y值。我試圖創建一個懸停的工具提示,將顯示所有重疊標記的名稱。這是我迄今爲止的地方。d3在鼠標懸停過濾數據後,從選擇中提取值

樣本數據集:

dataset= [ 
{long: -75, lat: 43, name: 'name1'}, 
{long: -75, lat: 43, name: 'name2'} 
] 

tooltip=d3.select('body').append('div') 

markers=d3.selecltAll('.marker').data(dataset).enter().append() 
    .attr('class', 'marker') 
    .on('mousemove', (d)-> 
    myv=[] 
    vals=projection([d.long, d.lat]) 
    d3.selectAll('.marker').filter((d,i) -> 
     proj = projection([d.long, d.lat]) 
     proj[0] < (vals[0]+5) && proj[0] > (vals[0]-5) && proj[1] < (vals[1]+5) && proj[1] > (vals[1]-5) 
    ).text (d) -> 
     myv.push(d.name) 
) 

因此,這裏是我的問題,

1)使用文本功能推d.name在MYV數據集,工作,但感覺不對。過去幾個小時我一直在嘗試以更清潔的方式推動這項工作,但無法做到。我嘗試使用datum(d) - > myv.push(d.name),它只在第一次懸停時出於某種原因才起作用。

2)現在我有數據集myv如何在工具提示中顯示它?

3)有沒有更好的/更清潔的方式來實現我想要做的?

預先感謝您的時間!

回答

1

關於(1),可以使用.each來一次,在選擇每個數據運行的函數:

d3.selectAll('.marker') 
     .filter(...) 
     .each(function(d) { myv.push(d.name); }); 

顯示工具提示裏面的名字會要求你做不同的選擇和然後使用myv數組作爲數據集。

tooltip.selectAll(".name") 
    .data(myv) 
    // do stuff 
+0

感謝您的支持! 。每!我到底是怎麼想的呢?我會盡快嘗試。關於工具提示,這不是我正在尋找的。我試圖將所有d.names放在每個重疊標記的一個工具提示中。 – scooterlord