Visualisation de grands ensembles de données avec Leaflet

35

Lorsque vous utilisez Leaflet pour visualiser un jeu de données volumineux (GeoJSON avec 10 000 entités ponctuelles), le navigateur se bloque ou se bloque. Un sous-échantillon de 1000 entités du même jeu de données fonctionne parfaitement. Malheureusement, je ne peux pas partager le jeu de données pour que les autres puissent l'essayer.

Quelqu'un a-t-il de meilleures solutions pour visualiser des jeux de données aussi volumineux? (Le but ultime est de faire passer cela à 2 millions de fonctionnalités.) Je suis même prêt à envisager des cadres de visualisation hors ligne au cas où des alternatives basées sur un navigateur, telles que Polymaps ou d3.js, etc., seraient considérées comme étant incapables.

Edit: oublié de mentionner, l'utilisateur doit pouvoir filtrer le jeu de données par attributs. Donc, sur N entités, seules les entités n <= N correspondantes peuvent nécessiter un rendu dynamique.

Imad
la source
3
Discussions similaires: gis.stackexchange.com/questions/4096/ gis.stackexchange.com/questions/14882 gis.stackexchange.com/questions/6954
julien

Réponses:

23

Je suis l'auteur de Leaflet. Il existe un plugin de clustering génial pour cela, Leaflet.markercluster . Il est très rapide et efficace (regardez l'exemple des marqueurs 50k), semble et fonctionne très bien avec de jolies animations et offre de nombreuses options pour répondre à vos besoins.

Pleureuse
la source
3
PruneClusterSemble également prometteur.
TLama
1
Je voudrais élargir la question initiale. J'ai besoin de faire quelque chose comme ceci: matall.in/posts/deep-insights-visualizing-1m-flight-routes Comment puis-je mettre en cluster des chemins au lieu de marqueurs?
Guilhermecgs
16

Vous pouvez utiliser TileMill et rendre des points en tant qu'images raster, avec une interactivité rapide à partir de UTFGrid . Comme sur cette carte de recensement , elle évolue en millions de points et en polygones, car elle envoie intelligemment uniquement les données nécessaires pour des zones spécifiques, au moment opportun.

Autant que je sache, il n’existe d’autres méthodes rapides pour le faire que celle d’un serveur WFS très rapide, qui est plutôt difficile à maintenir / à mettre à l’échelle pour de nombreux téléspectateurs.

Divulgation: travail pour MapBox , écrit un peu du code. Mais TileMill est libre / open source, etc.

tmcw
la source
1
J'ai oublié de mentionner que l'utilisateur devrait pouvoir filtrer l'ensemble de données par attributs et afficher uniquement les enregistrements correspondants. Supposons que sur 10 000 enregistrements, seuls 500 soient réellement nécessaires pour un cas donné. Puis-je (ou comment) faire cela avec TileMill?
Imad
3
Nan. Vous voudrez peut-être essayer CartoDB , mais vous devez savoir que dynamiser et rendre performant sont des objectifs opposés.
tmcw
1
le lien de la carte du recensement est mort!
drho
Tous les liens sont supprimés.
LeeGee
9

Avez-vous regardé dans le clusterer de tracts? Un article de blog de l'auteur le décrit ici

Une autre option qui mérite d'être examinée consiste peut-être à utiliser la brochure en association avec GIS Cloud . Jetez un coup d'œil à cette démo pour voir qu'elle gère très rapidement beaucoup de géométries. Très impressionnant. Je ne suis en aucun cas affilié à GISCloud.

Kelso
la source
7

Vous ne devriez jamais afficher des millions de points sur une carte. Non seulement à cause des problèmes de performances majeurs, mais aussi du point de vue de l'utilisateur car il sera très certainement difficile d'interpréter ces données. Utilisez des moyens d’agrégation des données (regroupement, agrégation sur des surfaces surfaciques, etc.) associés à différents types d’affichage à différents niveaux de zoom (par exemple, affichez les données ponctuelles «brutes» uniquement sur des niveaux de zoom très élevés et utilisez des données agrégées partout ailleurs. Un exemple serait un site immobilier tel que zillow.com .

chriserik
la source
8
Vous ne devriez jamais dire "vous ne devriez jamais". Les sections locales et les touristes sont un excellent exemple du type de perspicacité que la visualisation de millions (ou de milliards dans ce cas) de points peut donner.
Joseph Sheedy
1
D'accord avec @velotron, par exemple, six millions de points magnifiquement et rapidement rendus: mapbox.com/blog/supercluster
Max von Hippel
1
Oui, mais dans ce cas, ces points sont également regroupés (en fonction du niveau de zoom), ce qui facilite grandement l'interprétation et la compréhension des données.
chriserik
2
@chriserik à droite, alors la bonne réponse serait "tu devrais utiliser le clustering ou les cartes de chaleur si tu as autant de points, et voici comment faire cela ..."
Max von Hippel
3
Mon idée était que des parcelles non regroupées de plusieurs millions de points peuvent fournir un aperçu.
Joseph Sheedy
0

Je vous suggère de réduire le nombre de traits rendus: L'œil humain ne pourra pas voir 10 000 points, sans parler de 2 000 000.

Ce que vous pouvez essayer est de demander dynamiquement le jeu de données à un serveur personnalisé (que vous devez configurer), par exemple:

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

Votre serveur calculera ensuite les points à renvoyer, en fonction de ce que l'utilisateur souhaite voir maintenant. En fonction du facteur de zoom et du découpage, il vous suffira de renvoyer un très petit pourcentage de points sans détériorer l'expérience utilisateur.

Inconvénients: configuration d'un serveur (vous devriez trouver des bibliothèques pour filtrer les points géographiques) et un rendu plus lent (après chaque zoom ou glissement, une requête du serveur doit être faite)

phil294
la source
-5

J'avais des solutions pour cartographier de 50 à 100 millions d'enregistrements. Vous devez utiliser des solutions côté serveur pour effectuer une grille et une dynamique. Vous ne pouvez pas répondre sur les API de carte Web (Google ou autres) pour effectuer le rendu côté client ....

[http://96.231.36.9:8080/rbgis/google_map.html][1] essayez les liens ci-dessus et voyez comment

bdv_engine
la source
2
Veuillez développer votre réponse afin qu’elle soit utile même lorsque votre serveur est inaccessible.
lynxlynxlynx
Oui c'est ironique. Depuis votre lien côté serveur ne fonctionne pas.
Max von Hippel