2013-09-29 18 views
5

Şu anda müşteri verilerimizin interaktif bir haritasını oluşturmak için Javascript kullanarak ilk gerçek yolculuğum üzerinde çalışıyorum.Leaflet.js ve JSON verileri: optimizasyon ve performans

Şimdiye kadar temel çalışma prensiplerine sahibim, ancak 500 poi'nin üzerinde işaretleyicilerle veya daire işaretçileriyle 10.000'i aşmaya başladığımda performans düşmeye başlar. Zaten var ya da belki json verileri için uygun bir DB gibi bir mongo taşımak veya Node Js ile iş sunucu tarafında yapmak için belki de olabilir miyim?

Herhangi bir tavsiye çok takdir :)

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'; 
    } 

ve bazı örnek veriler:

render başa yardımcı Leaflet plugins bir çift vardır
{ 
    "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

Sizin darboğaz bu verileri göstermek için veritabanı değil . Bir bakışta veya 10.000 daire işaretçisinde 500 puan göstermek için gerçek bir düzine mi. Veya sorunuz 10000 çember işaretçileri içeren tanımlı bir bağ içinde veritabanındaki arama anlamına mı geliyor? – Bernhard

+0

Güncel demo sürümleri 500 - 2500 gibi düşük değerlerde çalışıyor ... son versiyonun bir seferde 10.000+ ve daha fazla veri noktası göstermesi gerekecek ... Bunun nedeni bununla ilgili olduğuna inanıyorum tarayıcı tarafında görüntüyü gerçek zamanlı olarak yapmak? Sadece farklı bir yol olup olmadığını merak ediyorum gerçekten sorun çözme sorunu olabilir – Guitaraholic

cevap

7

Müşterinin tarayıcısında büyük miktarlarda puan.

En basit yol, Marker Clusterer gibi işaretleyicileri kuran bir eklentiyi kullanmaktır. Kümeleyici, istemci bilgisayarındaki renderlemenin büyük ölçüde, istemci bilgisayarın 10,000 puan çizmesi gerekmediği anlamına geldiği için, 10-40'lık bir çizim yapmasına yardımcı olur.

Ayrıca sıcaklık haritası yapabilirdi

- bunun için iki eklentileri vardır, hem HTML5 Tuval dayalı:

+3

Biz markercluster eklentisini kullanıyoruz, ancak yine de noktaları oluşturulmalıdır. İşlenen noktaları elde etmek için bir ipad üzerinde yaklaşık 10 saniye sürebilir. – jelle

+0

Bence en iyi bahisten sonra sunucu tarafı. Sunucu üzerinde kümelemeyi yaparsınız ve daha sonra küme noktalarını görüntülemek için cihaza tek nokta olarak gönderirsiniz. Bu şekilde, bir tablet veya telefon işlemcisi yerine, analiz yapmak için sunucunun gücüne güvenebilirsiniz. – Josh