Visualisierung großer Datensätze mit Leaflet

35

Bei Verwendung von Leaflet zur Visualisierung eines großen Datensatzes (GeoJSON mit 10.000-Punkt-Features) ist es nicht überraschend, dass der Browser abstürzt oder hängen bleibt. Eine Teilstichprobe von 1000 Features aus demselben Datensatz funktioniert einwandfrei. Leider kann ich den Datensatz nicht für andere zum Ausprobieren freigeben.

Hat jemand bessere Lösungen für die Visualisierung so großer Datensätze? (Letztendlich soll dies auf 2 Millionen Funktionen skaliert werden.) Ich bin sogar bereit, Offline-Visualisierungs-Frameworks in Betracht zu ziehen, falls browserbasierte Alternativen wie Polymaps oder d3.js usw. als unfähig erachtet werden.

Bearbeiten: Vergessen zu erwähnen, der Benutzer muss in der Lage sein, den Datensatz nach Attributen zu filtern. Also aus N verfügt, nur noch die passenden n <= N Möglicherweise müssen Funktionen dynamisch gerendert werden.

Imad
quelle
3
Ähnliche Diskussionen: gis.stackexchange.com/questions/4096/ gis.stackexchange.com/questions/14882 gis.stackexchange.com/questions/6954
Juli

Antworten:

23

Ich bin Flugblattautor. Es gibt ein großartiges Clustering-Plugin, Leaflet.markercluster . Es ist sehr schnell und effizient (siehe Beispiel mit 50.000 Markern), sieht aus und funktioniert sehr reibungslos mit netten Animationen und hat viele Optionen, die Ihren Bedürfnissen entsprechen.

Trauernde
quelle
3
Auch PruneClustersieht vielversprechend aus .
TLama
1
Ich möchte die ursprüngliche Frage erweitern. Ich muss so etwas tun: matall.in/posts/deep-insights-visualizing-1m-flight-routes Wie kann ich Pfade ohne Marker gruppieren?
Guilhermecgs
16

Sie können TileMill verwenden und Punkte als Rasterbilder rendern, mit schneller Interaktivität von UTFGrid . Es skaliert auf Millionen von Punkten und Polygonen wie diese Volkszählungskarte , da es auf intelligente Weise nur die Daten sendet, die für bestimmte Bereiche benötigt werden, genau dann, wenn sie benötigt werden.

Soweit ich weiß, gibt es keine anderen schnellen Methoden, um dies zu tun, als einen sehr schnellen WFS-Server, der für viele Betrachter schwierig zu warten / zu skalieren ist.

Disclosure: arbeite für MapBox , habe ziemlich viel Code geschrieben. Aber TileMill ist kostenlos / Open Source usw.

tmcw
quelle
1
Ich habe vergessen zu erwähnen, dass der Benutzer den Datensatz nach Attributen filtern und nur passende Datensätze anzeigen kann. Angenommen, von 10.000 Datensätzen müssen möglicherweise nur 500 für einen bestimmten Fall gerendert werden. Kann (oder wie würde) ich das mit TileMill machen?
Imad
3
Nee. Vielleicht möchten Sie CartoDB ausprobieren , aber Sie sollten wissen, dass die Dynamisierung und Leistungssteigerung von Dingen gegensätzliche Ziele sind.
tmcw
1
Der Link zur Volkszählungskarte ist tot!
Drho
Alle Links sind daed.
LeeGee
9

Haben Sie in den Merkblatt-Clusterer geschaut? Ein Blogbeitrag des Autors beschreibt ihn hier

Eine weitere Option, die einen Blick wert ist, kann die Verwendung von Broschüren in Kombination mit GIS Cloud sein . Schauen Sie sich diese Demo an, um zu sehen, wie schnell viele Geometrien verarbeitet werden. Sehr beeindruckend. Ich bin in keiner Weise mit GISCloud verbunden.

Kelso
quelle
7

Sie sollten niemals Millionen von Punkten auf einer Karte anzeigen. Nicht nur wegen der großen Leistungsprobleme, sondern auch aus Anwendersicht, denn für sie wird es mit Sicherheit schwierig sein, diese Daten zu interpretieren. Verwenden Sie eine Methode zum Aggregieren der Daten (Gruppieren, Aggregieren zu Polygonbereichen usw.) in Kombination mit verschiedenen Darstellungsarten bei verschiedenen Zoomstufen (z. B. zeigen Sie die "Roh" -Punktdaten nur bei sehr hohen Zoomstufen an und verwenden Sie aggregierte Daten an anderer Stelle). Ein Beispiel wäre eine Immobilienseite wie zillow.com .

chriserik
quelle
8
Sie sollten niemals "Sie sollten niemals" sagen. Locals & Tourists ist ein großartiges Beispiel für die Art von Einsicht, die die Visualisierung von Millionen (oder in diesem Fall Milliarden) Punkten geben kann.
Joseph Sheedy
1
Stimmen Sie mit @velotron überein, z. B. sechs Millionen Punkte, die wunderschön und schnell gerendert werden: mapbox.com/blog/supercluster
Max von Hippel
1
Ja, aber in diesem Fall werden diese Punkte auch gruppiert (abhängig von der Zoomstufe), sodass die Daten sehr einfach interpretiert und verstanden werden können.
Chriserik
2
@chriserik richtig, also die richtige Antwort wäre "Sie sollten Clustering oder Heatmaps verwenden, wenn Sie so viele Punkte haben, und hier ist, wie das geht ..."
Max von Hippel
3
Mein Punkt war, dass nicht gruppierte Diagramme mit Millionen von Punkten einen Einblick liefern können.
Joseph Sheedy
0

Ich schlage vor, dass Sie die gerenderte Menge an Punktfeatures reduzieren: Das menschliche Auge kann 10.000 Punkte nicht sehen, ganz zu schweigen von 2.000.000.

Sie könnten versuchen, den Datensatz dynamisch von einem benutzerdefinierten Server anzufordern (den Sie einrichten müssten), z

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

Ihr Server würde dann berechnen, welche Punkte zurückgegeben werden sollen, je nachdem, was der Benutzer gerade sehen möchte. Abhängig von Zoomfaktor und Clipping müssen Sie nur einen sehr kleinen Prozentsatz der Punkte zurückgeben, ohne die Benutzererfahrung zu beeinträchtigen.

Nachteile: Einrichten eines Servers (Sie sollten Bibliotheken zum Filtern der Geopunkte finden) und langsameres Rendern (nach jedem Zoomen oder Ziehen muss eine Serveranfrage gestellt werden)

phil294
quelle
-5

Ich hatte Lösungen, um 50 bis 100 Millionen Datensätze abzubilden. Sie müssen serverseitige Lösungen verwenden, um Raster- und dynamische Datensätze zu erstellen. Sie können nicht auf Webkarten-APIs (Google oder andere) antworten, um das Rendering auf der Clientseite durchzuführen.

[http://96.231.36.9:8080/rbgis/google_map.html[1] Probieren Sie die obigen Links aus und sehen Sie, wie

bdv_engine
quelle
2
Bitte erweitern Sie Ihre Antwort, damit es hilfreich ist, auch wenn auf Ihren Server nicht zugegriffen werden kann.
Lynxlynxlynx
Ja, das ist ironisch. Da Ihr serverseitiger Link nicht funktioniert.
Max von Hippel