Visualizzazione di set di dati di grandi dimensioni con Leaflet


35

Quando si utilizza Leaflet per visualizzare un set di dati di grandi dimensioni (GeoJSON con funzionalità da 10.000 punti), non sorprende che il browser si blocchi o si blocchi. Un sottocampione di 1000 funzionalità dello stesso set di dati funziona perfettamente. Sfortunatamente non posso condividere il set di dati che altri potrebbero provare.

Qualcuno ha soluzioni migliori per visualizzare set di dati così grandi? (l'obiettivo finale è ridimensionare questo a 2 milioni di funzionalità) Sono anche disposto a prendere in considerazione quadri di visualizzazione offline nel caso in cui le alternative basate su browser come Polymaps o d3.js ecc. siano ritenute incapaci.

Modifica: dimenticato di menzionare, l'utente deve essere in grado di filtrare il set di dati in base agli attributi. Così fuori di N caratteristiche, solo la corrispondenza n <= N caratteristiche potrebbero aver bisogno di essere reso in modo dinamico.


3
Discussioni simili: gis.stackexchange.com/questions/4096/ gis.stackexchange.com/questions/14882 gis.stackexchange.com/questions/6954
julien

Risposte:


23

Sono l'autore del volantino. C'è un fantastico plugin di clustering per questo, Leaflet.markercluster . È molto veloce ed efficiente (dai un'occhiata all'esempio di 50k marker), guarda e funziona in modo molto fluido con animazioni piacevoli e ha molte opzioni per soddisfare le tue esigenze.


3
PruneClusterSembra anche promettente.
TLama

1
Vorrei espandere la domanda originale. Devo fare qualcosa del genere: matall.in/posts/deep-insights-visualizing-1m-flight-routes Come posso raggruppare i percorsi all'interno dei marker?
Guilhermecgs,

16

È possibile utilizzare TileMill e rendere i punti come immagini raster, con interattività rapida da UTFGrid . Ridimensiona a milioni di punti e poligoni, come questa mappa del censimento , poiché invia in modo intelligente solo i dati necessari per aree specifiche, esattamente quando è necessario.

Per quanto ne so, non ci sono altri metodi veloci per farlo oltre ad avere un server WFS molto veloce, che è piuttosto difficile da mantenere / ridimensionare per molti visualizzatori.

Disclosure: funziona per MapBox , ha scritto un bel po 'di codice. Ma TileMill è gratuito / open source, ecc.


1
Ho dimenticato di dire che l'utente dovrebbe essere in grado di filtrare il set di dati in base agli attributi e visualizzare solo i record corrispondenti. Diciamo che su 10.000 record, in realtà potrebbe essere necessario renderne solo 500 per un determinato caso. Posso (o come) fare questo con TileMill?
Imad,

3
No. Potresti provare CartoDB , ma dovresti sapere che rendere le cose dinamiche e rendere le cose performanti sono obiettivi opposti.
tmcw,

1
il link della mappa del censimento è morto!
drho,

Tutti i collegamenti sono gestiti.
LeeGee,

9

Hai guardato nel cluster di volantini? Un post sul blog dell'autore lo descrive qui

Un'altra opzione che vale la pena dare un'occhiata potrebbe essere l'uso del volantino in combinazione con GIS Cloud . Dai un'occhiata a questa demo per vedere che gestisce molte geometrie molto rapidamente. Molto impressionante. Non sono in alcun modo affiliato a GISCloud.


7

Non dovresti mai visualizzare milioni di punti su una mappa. Non solo a causa dei maggiori problemi di prestazioni, ma anche dal punto di vista dell'utente perché per loro sarà sicuramente difficile interpretare questi dati. Utilizzare alcuni mezzi per aggregare i dati (raggruppamento, aggregazione in aree poligonali, ecc.) Combinati con diversi tipi di visualizzazione a diversi livelli di zoom (ad esempio, mostrare i dati dei punti "grezzi" solo a livelli di zoom molto elevati e utilizzare i dati aggregati ovunque). Un esempio potrebbe essere un sito immobiliare come zillow.com .


8
Non dovresti mai dire "non dovresti mai". Locals & Tourists è un ottimo esempio del tipo di intuizione che può dare la visualizzazione di milioni (o miliardi in questo caso) di punti.
Joseph Sheedy,

1
Accetto w / @velotron, ad esempio sei milioni di punti magnificamente e rapidamente resi: mapbox.com/blog/supercluster
Max von Hippel,

1
Sì, ma in questo caso anche quei punti sono raggruppati (a seconda del livello di zoom), rendendo molto semplice l'interpretazione e la comprensione dei dati.
Chriserik,

2
@chriserik giusto, quindi la risposta corretta sarebbe "dovresti usare il clustering o le mappe di calore se hai così tanti punti, ed ecco come farlo ..."
Max von Hippel

3
Il mio punto era che trame non cluster di milioni di punti possono fornire informazioni.
Joseph Sheedy,

0

Ti suggerisco di ridurre la quantità di rendering delle caratteristiche dei punti: l'occhio umano non sarà in grado di vedere 10.000 punti, per non parlare di 2.000.000.

Quello che potresti provare è richiedere dinamicamente il set di dati da un server personalizzato (che dovresti impostare), ad es.

    map = ...
    map.on('moveend', function(e) {
        getGeoJson(e);
    });
    map.on('zoomend', function(e) {
        getGeoJson(e);
    });
    map.setView([2,3], 2);

    function getGeoJson(event) {
        // todo determine current viewport
        $http.get('someGeoJsonDataProvider.someLanguage?currentView=[lat0,lon0,lat1,lon1]').then(function (resp) {
            // todo clear layers
            // new layer
            map.addLayer(
                L.geoJson(resp.data)
            );
        });
    }

Il tuo server calcolerebbe quindi quali punti restituire, a seconda di ciò che l'utente vuole vedere in questo momento. A seconda del fattore di zoom e del ritaglio, dovrai solo restituire una percentuale molto piccola di punti senza peggiorare l'esperienza dell'utente.

Lati negativi: impostazione di un server (dovresti trovare librerie per filtrare i punti geografici) e rendering più lento (dopo ogni zoom o trascinamento, è necessario effettuare una richiesta del server)


-5

Avevo soluzioni per mappare da 50 a 100 milioni di record, è necessario utilizzare soluzioni lato server per fare griglia e basate dinamiche. Non è possibile rispondere sulle API della mappa Web (Google o altri) per eseguire il rendering sul lato client ....

[http://96.231.36.9:8080/rbgis/google_map.html[[1] prova i link sopra e scopri come


2
Espandi la tua risposta, quindi sarà utile anche quando il tuo server è inaccessibile.
lynxlynxlynx,

Sì, è ironico. Dal momento che il collegamento sul lato server non funziona.
Max von Hippel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.