Come utilizzare Leaflet per mostrare in modo efficiente parti di un enorme set di dati?


13

Continuo a vedere sviluppatori web non GIS che si imbattono in questo problema e non sono sicuro di quale sia la soluzione.

  1. Esistono alcuni set di dati di migliaia di articoli.
  2. Vogliamo mostrare una mappa all'utente, con il suo sottoinsieme visibile mostrato come elementi interattivi e cliccabili.

Quali metodi ci sono per farlo?

Posso pensare a questi, ma non sono molto soddisfacenti, quindi mi chiedo cos'altro c'è:

  1. Memorizza tutti i dati in un file GeoJSON, trasferiscili nel browser e lascia che Leaflet li visualizzi. Problema: non funziona davvero con set di dati di grandi dimensioni. TopoJSON aumenta un po 'il limite. Inoltre provoca un grande ritardo al caricamento della pagina.

  2. Usa Mapbox, archivia tutti i dati in un livello interattivo su Mapbox e usa Mapbox.js per visualizzarli. Funziona alla grande, ma costa denaro e non puoi ospitarti da solo.

  3. Utilizzare GeoServer per accedere a un database PostGIS, utilizzare il plug-in leaflet WFS-geojson per accedere ai dati da lì. Probabilmente funziona, ma il plug-in Leaflet WFS-geojson non sembra più essere mantenuto.

  4. Utilizzare CartoDB, archiviare tutti i dati in una tabella CartoDB e utilizzare CartoDB.js per visualizzarli. Funziona alla grande, ma può diventare molto costoso. È possibile ospitarlo da soli, ma l'installazione di CartoDB non è banale.

Tutto ciò mi fa pensare che ci debba essere un modo molto migliore e libero che mi manca. Che cos'è?

MODIFICARE

Forse ho cancellato il plugin WFS-geojson troppo facilmente. C'è un fork che vede ancora qualche attività (4 mesi fa): https://github.com/johanlahti/azgs-leaflet


1
basta chiedere al geoserver wfs per json?
Ian Turton

Bene, se ho capito bene, se decodifichi una richiesta per JSON in, allora stai semplicemente dicendo che trasferisce l'intero set di dati come un singolo BLOB JSON - proprio come la soluzione 1. Per ottenere richieste che sono limitate è necessario WFS effettivo alla finestra corrente, no?
Steve Bennett,

filtra la richiesta wfs per Bounds of map (L'opuscolo non lo fa automaticamente?)
Ian Turton

Per fare ciò dovrebbe parlare WFS, no? E afaik che esiste solo nel plug-in (non mantenuto) WFS-geojson?
Steve Bennett,

1
WFS non è così difficile - forse il problema è il volantino>
Ian Turton

Risposte:


4

Ok, i miei presupposti in 2 erano errati. È possibile utilizzare mapbox.js. Il risultato finale sarà un po 'diverso, credo: i marker stessi saranno un layer raster statico, ma saranno cliccabili.

Le specifiche che consentono l'interattività su larga scala sono https://github.com/mapbox/utfgrid-spec

È implementato sul lato client in https://github.com/danzel/Leaflet.utfgrid (plug-in leaflet) e anche mapbox.js.

Server è implementato in https://github.com/mapbox/tilelive.js e quindi TileMill ad esempio: http://tilemill-server/tile/projectname/7/115/78.grid.json

È anche implementato in TileStache, ma non tilestream o mbtiles-server. I dati UTFgrid sembrano essere memorizzati nel file mbtiles da TileMill, ma vengono ignorati da quelli.

Quindi non solo non hai bisogno di mapbox.com, ma non hai nemmeno bisogno di mapbox.js. Mapbox.js sembra quasi incollare cose insieme per comodità: una singola chiamata che crea un'istanza di una mappa, recupera riquadri e aggiunge interattività.

Ma se usi mapbox.js, c'è un po 'del puzzle che mi manca, e questo è tilejson. Dai a mapbox.json il file tilejson corrispondente alla tua mappa.



0

Se non hai ancora trovato la soluzione, eccone una: http://gis.xyz/leaflet.html#

 var owsrootUrl = 'http://217.8.255.188:8080/geoserver/opengeo/ows';

 var defaultParameters = {
     service : 'WFS',
     version : '2.0',
     request : 'GetFeature',
     typeName : 'opengeo:evernote_geom',
     outputFormat : 'text/javascript',
     format_options : 'callback:getJson',
     SrsName : 'EPSG:4326'
};

var parameters = L.Util.extend(defaultParameters);
var URL = owsrootUrl + L.Util.getParamString(parameters);

var WFSLayer = null;
var ajax = $.ajax({
    url : URL,
    dataType : 'jsonp',
    jsonpCallback : 'getJson',
    success : function (response) {
       WFSLayer = L.geoJson(response, {
            style: function (feature) {
                return {
                    stroke: false,
                    fillColor: 'FFFFFF',
                    fillOpacity: 0
                };
            },
            onEachFeature: function (feature, layer) {
                popupOptions = {maxWidth: 600};
                layer.bindPopup('<h4>'+feature.properties.url+'</h4><br>'+feature.properties.title
                    ,popupOptions);
            }
        }).addTo(map);
    }
});

Non vedo come questo limiti la richiesta al viewport corrente?
alphabetasoup,

0

Il modo più rapido per farlo è https://mangomap.com , dovresti essere in grado di impostare tutto in circa 10 minuti senza scrivere una singola riga di codice.


1
Interessante, non ne avevo mai sentito parlare prima. Ma a $ 29 / mese, questo è decisamente al di fuori della fascia di prezzo dell'hobbista o della maggior parte dei piccoli progetti di ricerca.
Steve Bennett,

4
Questo in realtà non risponde alla domanda e si legge come un annuncio pubblicitario. Sembra che il richiedente desideri un metodo che promuove la visualizzazione efficiente di grandi set di dati. Semplicemente fornire al tuo prodotto nessuna spiegazione del perché sia ​​più efficiente sembra insufficiente.
Conor,

1
L'OP ha presentato un problema, ho presentato una possibile soluzione. Tutte le soluzioni a questo problema avranno un costo in termini di tempo o denaro.
ChrisInCambo,

@Conor sebbene questo post sembri rispondere alla domanda, ed è perfettamente in primo piano sulla natura della soluzione e sulla connessione del poster con il prodotto, trarrebbe beneficio da qualche elaborazione del perché potrebbe essere raccomandato.
whuber

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.