Wizualizacja dużych zbiorów danych za pomocą Ulotki

35

Podczas korzystania z Ulotki do wizualizacji dużego zestawu danych (GeoJSON z 10.000 punktami), nic dziwnego, że przeglądarka zawiesza się lub zawiesza. Podpróbka 1000 obiektów z tego samego zestawu danych działa bezbłędnie. Niestety nie mogę udostępnić zestawu danych innym osobom do wypróbowania.

Czy ktoś ma lepsze rozwiązania do wizualizacji tak dużych zbiorów danych? (ostatecznym celem jest zwiększenie tej skali do 2 milionów funkcji). Jestem nawet skłonny rozważyć ramy wizualizacji offline, na wypadek gdyby alternatywy oparte na przeglądarce, takie jak Polymaps lub d3.js, zostały uznane za niezdolne.

Edycja: zapomniałem wspomnieć, że użytkownik musi mieć możliwość filtrowania zestawu danych według atrybutów. Tak więc z N wyposażony tylko dopasowanie n <N wyposażony może być konieczne dynamicznie renderowane.

Imad
źródło
3
Podobne dyskusje: gis.stackexchange.com/questions/4096/ gis.stackexchange.com/questions/14882 gis.stackexchange.com/questions/6954
Julien

Odpowiedzi:

23

Jestem autorem ulotki. Jest do tego niesamowita wtyczka do klastrowania, Leaflet.markercluster . Jest bardzo szybki i wydajny (spójrz na przykład na 50k znaczników), wygląda i działa bardzo płynnie z ładnymi animacjami i ma wiele opcji dostosowanych do twoich potrzeb.

Żałobnik
źródło
3
PruneClusterWygląda również obiecująco.
TLama,
1
Chciałbym rozwinąć oryginalne pytanie. Muszę zrobić coś takiego: matall.in/posts/deep-insights-visualizing-1m-flight-routes Jak mogę grupować ścieżki w kierunku znaczników?
guilhermecgs
16

Możesz używać TileMill i renderować punkty jako obrazy rastrowe z szybką interaktywnością z UTFGrid . Skaluje się do milionów punktów i wielokątów, takich jak ta mapa spisu , ponieważ inteligentnie wysyła tylko dane potrzebne do określonych obszarów, dokładnie wtedy, gdy są potrzebne.

O ile mi wiadomo, nie ma innych szybkich metod, jak tylko bardzo szybki serwer WFS, który jest trudny do utrzymania / skalowania dla wielu widzów.

Ujawnienie: praca dla MapBox , napisałem sporo kodu. Ale TileMill jest darmowy / open source itp.

tmcw
źródło
1
Zapomniałem wspomnieć, że użytkownik powinien mieć możliwość filtrowania zestawu danych według atrybutów i wyświetlania tylko pasujących rekordów. Powiedzmy, że na 10 000 rekordów w danym przypadku może być konieczne renderowanie tylko 500. Czy (lub jak miałbym to zrobić) za pomocą TileMill?
Imad
3
Nie. Być może chcesz wypróbować CartoDB , ale powinieneś wiedzieć, że zwiększanie dynamiki i zwiększanie wydajności są sprzeczne z celami.
tmcw
1
link do mapy spisu nie działa!
drho
Wszystkie linki są połączone.
LeeGee,
9

Czy przejrzałeś klaster ulotek? Opisuje to post na blogu autora tutaj

Inną opcją wartą obejrzenia może być użycie ulotki w połączeniu z GIS Cloud . Spójrz na to demo, aby zobaczyć, jak bardzo szybko obsługuje wiele geometrii. Bardzo imponujące. Nie jestem w żaden sposób związany z GISCloud.

Kelso
źródło
7

Nigdy nie powinieneś wyświetlać milionów punktów na mapie. Nie tylko ze względu na poważne problemy z wydajnością, ale także z perspektywy użytkownika, ponieważ dla nich z pewnością trudno będzie interpretować te dane. Użyj niektórych sposobów agregowania danych (grupowanie, agregowanie do obszarów wielokąta itp.) W połączeniu z różnymi typami wyświetlania przy różnych poziomach powiększenia (np. Pokaż „surowe” dane punktowe tylko przy bardzo wysokich poziomach powiększenia i używaj zagregowanych danych gdziekolwiek indziej). Przykładem może być strona z nieruchomościami, taka jak zillow.com .

chriserik
źródło
8
Nigdy nie powinieneś mówić „nigdy nie powinieneś”. Miejscowi i turyści to doskonały przykład wglądu, jaki może dać wizualizacja milionów (lub miliardów w tym przypadku) punktów.
Joseph Sheedy
1
Zgadzam się z / @velotron, np. Sześć milionów punktów pięknie i szybko renderowanych: mapbox.com/blog/supercluster
Max von Hippel
1
Tak, ale w tym przypadku punkty te są również grupowane (w zależności od poziomu powiększenia), co bardzo ułatwia interpretację i zrozumienie danych.
chriserik
2
@chriserik racja, więc poprawna odpowiedź brzmi: „powinieneś użyć grupowania lub map cieplnych, jeśli masz tyle punktów, a oto jak to zrobić ...”
Max von Hippel,
3
Chodziło mi o to, że niezaklasyfikowane wykresy milionów punktów mogą zapewnić wgląd.
Joseph Sheedy
0

Sugeruję zmniejszenie renderowanej liczby cech punktowych: ludzkie oko nie będzie w stanie zobaczyć 10 000 punktów, nie mówiąc już o 2 000 000.

To, co możesz spróbować, to dynamicznie żądać zestawu danych z serwera niestandardowego (który musisz skonfigurować), np

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

Twój serwer obliczy następnie, które punkty zwrócić, w zależności od tego, co użytkownik chce teraz zobaczyć. W zależności od współczynnika powiększenia i przycinania wystarczy zwrócić bardzo niewielki procent punktów bez pogorszenia komfortu użytkowania.

Wady: konfiguracja serwera (powinieneś znaleźć biblioteki do filtrowania punktów geograficznych) i wolniejsze renderowanie (po każdym powiększeniu lub przeciągnięciu należy złożyć żądanie serwera)

phil294
źródło
-5

Miałem rozwiązania do mapowania od 50 do 100 milionów rekordów, musisz użyć rozwiązań po stronie serwera, aby wykonać grid i dynamiczne. Nie możesz odpowiadać na interfejsy API map internetowych (Google lub inne), aby renderować po stronie klienta ....

[http://96.231.36.9:8080/rbgis/google_map.html][1] wypróbuj powyższe linki i zobacz jak

bdv_engine
źródło
2
Rozwiń swoją odpowiedź, aby była pomocna nawet wtedy, gdy twój serwer jest niedostępny.
lynxlynxlynx
Tak, to ironiczne. Ponieważ link po stronie serwera nie działa.
Max von Hippel,