2013-03-22 10 views
9

Mam globalną bazę danych obiektów (punkty na mapie), które chciałbym pokazać na mapie ulotek. Zamiast ładowania całej bazy danych (po prostu zbyt dużej) naraz i tworzenia obiektów w grupie LeafletGroup, czy istnieje skuteczniejszy sposób sprawdzania danych zapytania, na przykład przy ładowaniu każdego kafelka mapy, czy też szukam rozwiązania niestandardowego? dla tego?Efektywny sposób uzyskiwania dostępu do dużych zestawów danych do wyświetlenia na ulotce

+0

Jak służyć mapę? Spodziewam się, że serwer ma metodę, którą można sprawdzić za pomocą ramki ograniczającej. Lub w zależności od ilości obiektów, możesz prawdopodobnie użyć znaczników. Ich przykład ma [mapę wyświetlającą 50000 pozycji] (http://leaflet.github.com/Leaflet.markercluster/example/marker-clustering-realworld.50000.html). – flup

+0

Nie chcę używać znaczników, ponieważ chcę wyświetlić każdy znacznik, który jest widoczny zamiast agregowania. Próbuję zdecydować, w jaki sposób powinienem obsługiwać moją mapę. Ponieważ jest to przesuwane lub powiększane, prawdopodobnie nie ma sensu wysyłać zapytania do serwera za każdym razem, zgodnie z nowym obwiednią (która może częściowo pokrywać się ze starym). Mogę sobie wyobrazić kilka sposobów, aby to zrobić, ale zanim odkryję nowe koło, chciałbym się upewnić, że nie ma już dobrego rozwiązania. – CuNimb

+0

Cóż, w pewnym momencie, kiedy przybliżasz się do całego świata, to " d oznacza pokazywanie każdego pojedynczego markera. Zatem tworzenie klastrów ma sens. Czy też nie pokażecie żadnych znaczników poniżej pewnego minimalnego poziomu powiększenia? Ile masz markerów? – flup

Odpowiedz

13

Można oglądać „moveend” zdarzenie na mapie z map.on('moveend',loadstuff), wykonać połączenie ajax wewnątrz loadstuff() porwać znaczniki wewnątrz bieżącego map.getBounds(), a następnie dodaj/usuń znaczniki (Przypuszczam masz jakiś globalny identyfikator dla każdego z nich), niezależnie od tego, czy są one obecne, czy też nie.

+0

To powinno być oznaczone jako odpowiedź, jest to właściwy sposób, aby to zrobić. – Rudi

+0

Dzięki za wskazanie tego. Nie jestem jeszcze bardzo wyrafinowanym użytkownikiem SO. – CuNimb

+0

@snkashis - czy mógłbyś podać trochę więcej szczegółów, jak to zrobić? Dokładnie to próbuję zrobić, ale moje umiejętności nie są tak wspaniałe! –

3

Istnieje standardowy i skuteczny sposób robienia tego, co snkashis powiedział. Utwórz kafelkową usługę geoJSON i użyj wtyczki leaflet-tilelayer-geojson.

Następnie cały kod będzie trzeba po stronie przeglądarki jest (od strony GitHub):

var geojsonURL = 'http://polymaps.appspot.com/state/{z}/{x}/{y}.json'; 
var geojsonTileLayer = new L.TileLayer.GeoJSON(geojsonURL, { 
     clipTiles: true, 
     unique: function (feature) { 
      return feature.id; 
     } 
    }, { 
     style: style, 
     onEachFeature: function (feature, layer) { 
      if (feature.properties) { 
       var popupString = '<div class="popup">'; 
       for (var k in feature.properties) { 
        var v = feature.properties[k]; 
        popupString += k + ': ' + v + '<br />'; 
       } 
       popupString += '</div>'; 
       layer.bindPopup(popupString); 
      } 
      if (!(layer instanceof L.Point)) { 
       layer.on('mouseover', function() { 
        layer.setStyle(hoverStyle); 
       }); 
       layer.on('mouseout', function() { 
        layer.setStyle(style); 
       }); 
      } 
     } 
    } 
); 
map.addLayer(geojsonTileLayer); 
Powiązane problemy