Visualizar grandes conjuntos de datos con Leaflet

35

Al usar Leaflet para visualizar un gran conjunto de datos (GeoJSON con características de 10,000 puntos), no sorprende que el navegador se bloquee o se cuelgue. Una submuestra de 1000 características del mismo conjunto de datos funciona a la perfección. Lamentablemente, no puedo compartir el conjunto de datos para que otros lo prueben.

¿Alguien tiene mejores soluciones para visualizar conjuntos de datos tan grandes? (el objetivo final es escalar esto a 2 millones de funciones) Incluso estoy dispuesto a considerar los marcos de visualización fuera de línea en caso de que las alternativas basadas en navegador como Polymaps o d3.js, etc. se consideren incapaces.

Editar: Olvidé mencionar que el usuario debe poder filtrar el conjunto de datos por atributos. Entonces, de las N funciones, solo las funciones n <= N coincidentes pueden necesitar ser renderizadas dinámicamente.

Imad
fuente
3
Discusiones similares: gis.stackexchange.com/questions/4096/ gis.stackexchange.com/questions/14882 gis.stackexchange.com/questions/6954
julien

Respuestas:

23

Soy el autor del folleto. Hay un plugin de agrupación impresionante para esto, Leaflet.markercluster . Es muy rápido y eficiente (eche un vistazo al ejemplo de los marcadores de 50k), se ve y funciona muy bien con animaciones agradables, y tiene muchas opciones para satisfacer sus necesidades.

Doliente
fuente
3
También se PruneClusterve prometedor.
TLama
1
Me gustaría ampliar la pregunta original. Necesito hacer algo como esto: matall.in/posts/deep-insights-visualizing-1m-flight-routes ¿Cómo puedo agrupar rutas en lugar de marcadores?
guilhermecgs
16

Puede usar TileMill y renderizar puntos como imágenes ráster, con una interactividad rápida desde UTFGrid . Se escala a millones de puntos y polígonos, como este mapa censal , ya que envía de manera inteligente solo los datos necesarios para áreas específicas, exactamente cuando es necesario.

Hasta donde sé, no hay otros métodos rápidos para hacer esto que no sea tener un servidor WFS muy rápido, que es bastante difícil de mantener / escalar para muchos espectadores.

Divulgación: trabajo para MapBox , escribió un poco del código. Pero TileMill es gratuito / de código abierto, etc.

tmcw
fuente
1
Olvidé mencionar que el usuario debería poder filtrar el conjunto de datos por atributos y mostrar solo registros coincidentes. Entonces, digamos que de 10,000 registros, solo 500 pueden necesitar renderizarse para un caso dado. ¿Puedo (o cómo lo haría) hacer esto con TileMill?
Imad
3
No Es posible que desee probar CartoDB , pero debe saber que hacer que las cosas sean dinámicas y que funcionen correctamente son objetivos opuestos.
tmcw
1
¡el enlace del mapa del censo está muerto!
drho
Todos los enlaces son daed.
LeeGee
9

¿Has mirado en el grupo de folletos? Una publicación de blog del autor lo describe aquí.

Otra opción que vale la pena echarle un vistazo puede ser usar un folleto en combinación con GIS Cloud . Eche un vistazo a esta demostración para ver cómo maneja muchas geometrías muy rápidamente. Muy impresionante. De ninguna manera estoy afiliado a GISCloud.

Kelso
fuente
7

Nunca debe mostrar millones de puntos en un mapa. No solo por los principales problemas de rendimiento, sino también desde la perspectiva del usuario, porque para ellos será muy difícil interpretar estos datos. Utilice algunos medios para agregar los datos (agrupamiento, agregación a áreas de polígonos, etc.) combinados con diferentes tipos de visualización en diferentes niveles de zoom (por ejemplo, muestre los datos de puntos "en bruto" solo en niveles de zoom muy altos y use datos agregados en cualquier otro lugar). Un ejemplo sería un sitio inmobiliario como zillow.com .

chriserik
fuente
8
Nunca debes decir "nunca deberías". Locales y turistas es un gran ejemplo del tipo de información que puede proporcionar visualizar millones (o miles de millones en este caso) de puntos.
Joseph Sheedy
1
De acuerdo con @velotron, por ejemplo, seis millones de puntos bellamente y rápidamente: mapbox.com/blog/supercluster
Max von Hippel
1
Sí, pero en este caso esos puntos también están agrupados (dependiendo del nivel de zoom), lo que hace que sea muy fácil interpretar y comprender los datos.
chriserik
2
@chriserik bien, entonces la respuesta correcta sería "deberías usar mapas de clustering o de calor si tienes tantos puntos, y aquí está cómo hacerlo ..."
Max von Hippel
3
Mi punto era que las parcelas no agrupadas de millones de puntos pueden proporcionar información.
Joseph Sheedy
0

Le sugiero que reduzca la cantidad representada de características de puntos: el ojo humano no podrá ver 10,000 puntos, por no hablar de 2,000,000.

Lo que podría intentar es solicitar dinámicamente el conjunto de datos de un servidor personalizado (que tendría que configurar), por ejemplo

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

Su servidor luego calcularía qué puntos devolver, dependiendo de lo que el usuario quiera ver en este momento. Según el factor de zoom y el recorte, solo tendrá que devolver un porcentaje muy pequeño de puntos sin empeorar la experiencia del usuario.

Desventajas: configurar un servidor (debe encontrar bibliotecas para filtrar los puntos geográficos) y una representación más lenta (después de cada zoom o arrastre, se debe realizar una solicitud del servidor)

phil294
fuente
-5

Tenía soluciones para mapear 50 a 100 millones de registros, necesita usar soluciones del lado del servidor para hacer la cuadrícula y la dinámica. No puede responder en las API de mapas web (Google u otros) para hacer la representación del lado del cliente ...

[http://96.231.36.9:8080/rbgis/google_map.htmlfont>[1] pruebe los enlaces anteriores y vea cómo

bdv_engine
fuente
2
Expanda su respuesta, por lo que será útil incluso cuando su servidor sea inaccesible.
lynxlynxlynx
Sí, eso es irónico. Dado que su enlace del lado del servidor no funciona.
Max von Hippel