2013-09-29 67 views
5

我目前正在使用Javascript構建我的第一個真正的郊遊,以構建我們客戶數據的交互式地圖。Leaflet.js和JSON數據:優化和性能

到目前爲止,我已經掌握了基本的工作原理,但是當我開始使用標記或帶有圓圈標記的10,000個標記時,性能開始下降....如果任何人都可以提供一些關於如何優化我的建議我已經得到了,或者我最好是移動到一個適當的數據庫像mongo的JSON數據或工作服務器端的Node Js也許?

任何意見,將不勝感激:)

var apiKey = 'BC9A493B41014CAABB98F0471D759707', 
      styleID = '108219'; 
    // styleID = '997'; 


    // var map = L.map('map').setView([54.550, -4.433], 7); 

     var southWest = new L.LatLng(61.029031, 4.746094), 
      northEast = new L.LatLng(48.786962 ,-13.183594), 
      bounds  = new L.LatLngBounds(southWest, northEast); 

     var mapcenter  = new L.LatLng(53.457393,-2.900391); 
     var map   = new L.Map('map', 
           { 
            center: mapcenter, 
            zoom: 7, 
            // maxBounds: bounds, 
            zoomControl: false 
           }); 

     var cloudmadeUrl = generateTileURL(apiKey, styleID), 
      attribution = 'Map data © OpenStreetMap contributors.', 
      tileLayer = new L.TileLayer(
           cloudmadeUrl, 
           { 
            maxZoom: 18, 
            attribution: attribution, 
           }); 

      tileLayer.addTo(map); 

     var zoomControl  = new L.Control.Zoom({ position: 'topleft'}); 
      zoomControl.addTo(map); 
     var scaleControl = new L.Control.Scale({ position: 'bottomleft' }); 
      scaleControl.addTo(map); 




     geojsonLayer = L.geoJson(geojson, { 
      pointToLayer: function(feature, latlng) { 
      return new L.CircleMarker(latlng, {fillColor: feature.properties.MarkerColour, fillOpacity: 0.5, stroke: false, radius: 6}); 
      // return new L.Marker(latlng, {icon: L.AwesomeMarkers.icon({icon: feature.properties.MarkerIcon, color: feature.properties.MarkerColour, iconColor: 'white'}) }); 
      }, 
     onEachFeature: function (feature, layer) { 
      layer.bindPopup('<strong><b>Customer Data</b></strong><br />' + '<b>Result : </b>' + feature.properties.Result + '<br />' + '<b>Postcode : </b>' + feature.properties.Postcode + '<br />'); 
      } 
     }); 

      console.log('starting: ' + window.performance.now()); 

     map.addLayer(geojsonLayer); 

      console.log('ending: ' + window.performance.now()); 




    function generateTileURL(apiKey, styleID) { 
     return 'http://{s}.tile.cloudmade.com/' + apiKey + '/' + styleID + '/256/{z}/{x}/{y}.png'; 
    } 

和一些樣本數據:

{ 
    "type": "Feature", 
    "geometry": { 
     "type": "Point", 
     "coordinates": [ 
      -0.213467, 
      51.494815 
     ] 
    }, 
    "properties": { 
     "DateTime": "1372719435.39", 
     "Result": "Cable Serviceable", 
     "MarkerIcon": "ok-sign", 
     "MarkerColour": "green", 
     "Postcode": "W14 8UD"  
    } 
}, 
{ 
    "type": "Feature", 
    "geometry": { 
     "type": "Point", 
     "coordinates": [ 
      -0.389445, 
      51.512121 
     ] 
    }, 
    "properties": { 
     "DateTime": "1372719402.083", 
     "Result": "Refer for National Serviceability", 
     "MarkerIcon": "minus-sign", 
     "MarkerColour": "red", 
     "Postcode": "UB1 1NJ", 

    } 
}, 
{ 
    "type": "Feature", 
    "geometry": { 
     "type": "Point", 
     "coordinates": [ 
      -0.411291, 
      51.508012 
     ] 
    }, 
     "properties": { 
     "DateTime": "1372719375.725", 
     "Result": "Cable Serviceable", 
     "MarkerIcon": "ok-sign", 
     "MarkerColour": "green", 
     "Postcode": "UB3 3JJ" 
    } 
}, 
{ 
    "type": "Feature", 
    "geometry": { 
     "type": "Point", 
     "coordinates": [ 
      -2.11054, 
      53.500752 
     ] 
    }, 
    "properties": { 
     "DateTime": "1372719299.088", 
     "Result": "Cable Serviceable", 
     "MarkerIcon": "ok-sign", 
     "MarkerColour": "green", 
     "Postcode": "OL7 9LR", 

    } 
} 
+0

您的瓶頸不是表明數據的數據庫。在一個視圖或10,000個圓圈標記中顯示500pois是真正的szenario嗎?或者您的問題是否意味着在數據庫中搜索一個包含10000個圓圈標記的已定義邊界? – Bernhard

+0

目前的演示版本處理的值較低,大約在500 - 2500之間......最終版本需要能夠一次顯示10,000多個數據點......我相信這個問題是由於它在瀏覽器端實時渲染? 只是想知道是否有不同的方式我真的可以解決縮放問題 – Guitaraholic

回答

7

有一對夫婦的Leaflet plugins,幫助處理渲染客戶端瀏覽器中有大量的點數。

最簡單的方法是使用聚集標記的插件,如Marker Clusterer。 Clusterer很大程度上幫助客戶端渲染,因爲它意味着客戶端計算機不必畫10,000點,它只需畫10-40。

你也可以做一個熱圖 - 有兩個插件的是,兩者都基於HTML5的畫布:

+3

我們正在使用markercluster插件,但仍需要創建點。它仍然可以在iPad上花費大約10秒鐘來獲得點數。 – jelle

+0

我認爲你最好的選擇是服務器端。您可以在服務器上執行羣集,然後將羣集點作爲單個點發送到設備以供顯示。這樣,您可以依靠服務器的能力來進行分析,而不必使用平板電腦或手機處理器。 – Josh