2014-02-19 59 views
0

我使用傳單地圖和html5地理位置。我有一個觀點,它接收來自node.js服務器的coords併爲每個唯一id添加標記,並在新的coords進來時更新它們的位置。我將標記對象存儲在對象中,ID作爲鍵,標記爲價值。將JSON值轉換爲數組

Object {qwpW9K0L1OtOhsV3CF0G: e, syeQs_oH7s8z8f0UCF0I: e} 

當e是一個實際的標記:所以markers對象跟蹤兩臺設備時,看起來是這樣的。

我正在處理的問題是單張api喜歡接收數據數組。例如,我想使用特徵組和map.fitBounds(...)來匹配地圖視圖界限。因此,我遍歷對象並將標記推入一個新數組中,並在每次創建新標記或新座標進入時更新地圖邊界,並且看起來效率極低,並且只是明確了實現它的錯誤方法。

完全socket.io代碼塊我工作:

socket.on('markerCoords', function(data) { 
    var markerGroup = []; 
    if(data.id in markers) { 
     markers[data.id].setLatLng([data.data.latitude, data.data.longitude]); 
     $.each(markers, function(i, e) { 
      markerGroup.push(e); 
     }); 
     var group = new L.featureGroup(markerGroup); 
     map.fitBounds(group.getBounds().pad(0.5)); 
    } else { 
     var marker = L.marker([data.data.latitude, data.data.longitude], {"title": data.id, "draggable": true}).addTo(map); 
     markers[data.id] = marker; 
     $.each(markers, function(i, e) { 
      markerGroup.push(e); 
     }); 
     var group = new L.featureGroup(markerGroup); 
     map.fitBounds(group.getBounds().pad(1.0)); 
    } 
}); 
+0

這似乎與JSON沒有任何關係。 –

回答

2

看起來像一個可能的解決方案是簡單地創建功能組只有一次,必要時進行更新它:

var group = new L.featureGroup(); 

socket.on('markerCoords', function(data) { 
    var markerGroup = []; 
    if(data.id in markers) { 
     markers[data.id].setLatLng([data.data.latitude, data.data.longitude]); 
     map.fitBounds(group.getBounds().pad(0.5)); 
    } else { 
     markers[data.id] = L.marker(
      [data.data.latitude, data.data.longitude], 
      {"title": data.id, "draggable": true} 
     ).addTo(map); 

     group.addLayer(markers[data.id]); 
     map.fitBounds(group.getBounds().pad(1.0)); 
    } 
}); 

您可能也可能只是在啓動時將組添加到地圖,而不是單個標記。

+0

聰明!謝謝。 –

+0

只是讓你的編輯和工作順利。代碼看起來更清晰,並且可能對許多用戶運行得更好。再次感謝。 –

+0

不客氣!我假設'getBounds'仍然會使用大部分的運行時,所以這不會改變,但是至少你不會每次都創建一個新的數組和組,每次都會變慢。 –