2013-03-22 14 views
9

Ho un database globale di oggetti (punti su una mappa) che vorrei mostrare su una mappa Leaflet. Invece di caricare tutto il database (semplicemente troppo grande) in una volta e creare gli oggetti su un Leaflet LayerGroup, c'è un modo più efficiente per fare una query sui dati, forse quando viene caricata una porzione di mappa, o sto cercando di creare una soluzione personalizzata per questo?Modo efficiente per accedere a set di dati di grandi dimensioni da visualizzare su Leaflet

+0

Come si servono la mappa? Mi aspetto che il server abbia un metodo che può essere interrogato usando un riquadro di delimitazione. Oppure, a seconda della quantità di oggetti, puoi usare Markerclusters. Il loro esempio ha [una mappa che mostra 50000 articoli] (http://leaflet.github.com/Leaflet.markercluster/example/marker-clustering-realworld.50000.html). – flup

+0

Non voglio usare markerclusters, perché voglio visualizzare ogni marker che è visibile invece di aggregare. Quello che sto cercando di decidere è esattamente come dovrei servire la mia mappa. Poiché questo viene spostato o ingrandito, probabilmente non avrebbe molto senso interrogare il server ogni volta in base al nuovo riquadro di delimitazione (che potrebbe parzialmente sovrapporsi a quello precedente). Posso immaginare alcuni modi per farlo, ma prima di reinventare la ruota, vorrei assicurarmi che non ci sia già una buona soluzione a questo – CuNimb

+0

Bene, ad un certo punto, quando si esegue lo zoom in tutto il mondo, quello ' d significa mostrare ogni singolo marker. Quindi il clustering ha senso. O non mostrerai alcun indicatore al di sotto di un livello minimo di zoom? Quanti marcatori hai? – flup

risposta

13

si poteva guardare l'evento 'MoveEnd' sulla mappa con la map.on('moveend',loadstuff), effettuare una chiamata AJAX all'interno loadstuff() per afferrare i marcatori all'interno della corrente map.getBounds(), e quindi aggiungere/rimuovere i marcatori (Parto dal presupposto di avere un qualche tipo di identificatore globale per ogni di loro) se si trovano all'interno o all'esterno della vista corrente.

+0

Questo dovrebbe essere contrassegnato come una risposta, è il modo corretto per farlo. – Rudi

+0

Grazie per aver indicato questo. Io non sono un SO user molto sofisticato ancora – CuNimb

+0

@snkashis - potresti fornire qualche dettaglio in più su come farlo? È esattamente quello che sto cercando di fare, ma le mie capacità non sono così grandi! –

3

C'è un modo standard ed efficiente per fare ciò che dicono gli snkashis. Creare un servizio geoJSON piastrellato e utilizzare il plug-in leaflet-tilelayer-geojson.

Poi tutto il codice che avrebbe bisogno di browser lato è (dalla pagina 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); 
Problemi correlati