Визуализация больших наборов данных с помощью Leaflet

35

При использовании Leaflet для визуализации большого набора данных (GeoJSON с 10 000 точечными объектами) неудивительно, что браузер падает или зависает. Подвыборка из 1000 объектов из того же набора данных работает безупречно. К сожалению, я не могу поделиться набором данных для других, чтобы попробовать.

У кого-нибудь есть лучшие решения для визуализации таких больших наборов данных? (конечная цель состоит в том, чтобы расширить это до 2 миллионов функций) Я даже готов рассмотреть автономные платформы визуализации в случае, если альтернативы на основе браузера, такие как Polymaps или d3.js и т. д., будут признаны недееспособными.

Редактировать: забыл упомянуть, пользователь должен иметь возможность фильтровать набор данных по атрибутам. Таким образом, из N объектов, только соответствующие n <= N объектов могут нуждаться в динамическом рендеринге.

Имад
источник
3
Подобные обсуждения: gis.stackexchange.com/questions/4096/ gis.stackexchange.com/questions/14882 gis.stackexchange.com/questions/6954
2012 года
Перепроведении ссылки , так что они будут работать gis.stackexchange.com/questions/4096/... gis.stackexchange.com/questions/14882/... gis.stackexchange.com/questions/6954/...
Рафаил

Ответы:

23

Я автор Leaflet. Для этого есть отличный плагин кластеризации, Leaflet.markercluster . Он очень быстрый и эффективный (взгляните на пример с 50 тыс. Маркеров), выглядит и работает очень плавно, с красивой анимацией, и имеет множество вариантов, соответствующих вашим потребностям.

плакальщик
источник
3
Также PruneClusterвыглядит многообещающе.
TLama
1
Я хотел бы расширить оригинальный вопрос. Мне нужно сделать что-то вроде этого: matall.in/posts/deep-insights-visualizing-1m-flight-routes Как я могу кластеризовать пути между маркерами?
guilhermecgs
16

Вы можете использовать TileMill и визуализировать точки как растровые изображения с быстрой интерактивностью из UTFGrid . Он масштабируется до миллионов точек и полигонов, как эта карта переписи , поскольку он интеллектуально отправляет только данные, необходимые для конкретных областей, именно тогда, когда это необходимо.

Насколько я знаю, нет других быстрых способов сделать это, кроме очень быстрого WFS-сервера, который довольно сложно поддерживать / масштабировать для многих зрителей.

Раскрытие: работа для MapBox , написал совсем немного кода. Но TileMill является бесплатным / открытым исходным кодом и т. Д.

tmcw
источник
1
Я забыл упомянуть, что пользователь должен иметь возможность фильтровать набор данных по атрибутам и отображать только соответствующие записи. Итак, скажем, из 10000 записей только 500, возможно, потребуется визуализировать для данного случая. Могу (или как бы) я сделать это с TileMill?
Imad
3
Нет. Возможно, вы захотите попробовать CartoDB , но вы должны знать, что сделать вещи динамичными и сделать их эффективными - противоположные цели.
tmcw
1
ссылка на карту переписи не работает!
Дрио
Все ссылки даны.
LeeGee
9

Вы смотрели в кластер листовок? Сообщение в блоге автора описывает это здесь

Другим вариантом, заслуживающим внимания, может быть использование листовки в сочетании с ГИС-облаком . Взгляните на эту демонстрацию, чтобы увидеть, как она справляется со многими геометриями очень быстро. Очень впечатляюще. Я никоим образом не связан с GISCloud.

Келсо
источник
7

Вы никогда не должны отображать миллионы точек на карте. Не только из-за серьезных проблем с производительностью, но и с точки зрения пользователя, потому что для них, безусловно, будет трудно интерпретировать эти данные. Используйте некоторые средства агрегации данных (кластеризация, агрегирование по областям многоугольника и т. Д.) В сочетании с различными типами отображения на разных уровнях масштабирования (например, показывайте «необработанные» точечные данные только при очень высоких уровнях масштабирования и используйте агрегированные данные повсюду). Примером может служить сайт по недвижимости, такой как zillow.com .

chriserik
источник
8
Вы никогда не должны говорить «ты никогда не должен». Местные жители и туристы - отличный пример такого понимания, которое могут дать миллионы (или, в данном случае, миллиарды) очков.
Джозеф Шиди
1
Согласитесь с @velotron, например, шесть миллионов очков красиво и быстро отрисованы: mapbox.com/blog/supercluster
Макс фон Хиппель
1
Да, но в этом случае эти точки также сгруппированы (в зависимости от уровня масштабирования), что позволяет очень легко интерпретировать и понимать данные.
chriserik
2
@ chriserik верно, поэтому правильным ответом будет «вы должны использовать кластеризацию или тепловые карты, если у вас есть столько точек, и вот как это сделать ...»
Макс фон Хиппель
3
Моя точка зрения заключалась в том, что незавершенные графики из миллионов точек могут дать представление.
Джозеф Шиди
0

Я предлагаю вам уменьшить количество визуализированных точечных объектов: человеческий глаз не сможет увидеть 10 000 точек, не говоря уже о 2 000 000.

То, что вы можете попробовать, это динамический запрос набора данных с пользовательского сервера (который вам нужно будет настроить), например

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

Ваш сервер будет затем рассчитывать, какие точки вернуть, в зависимости от того, что пользователь хочет увидеть прямо сейчас. В зависимости от коэффициента масштабирования и отсечения, вам нужно будет только вернуть очень маленький процент точек без ухудшения пользовательского опыта.

Недостатки: настройка сервера (вы должны найти библиотеки для фильтрации географических точек) и медленный рендеринг (после каждого масштабирования или перетаскивания необходимо выполнить запрос к серверу)

phil294
источник
-5

У меня были решения для отображения от 50 до 100 миллионов записей, вам нужно использовать серверные решения для построения сетки и динамики. Вы не можете отвечать на API веб-карты (Google или другие), чтобы выполнить рендеринг на стороне клиента ....

[http://96.231.36.9:8080/rbgis/google_map.html][1] попробуйте вышеуказанные ссылки и посмотрите, как

bdv_engine
источник
2
Пожалуйста, расширьте свой ответ, чтобы он был полезен, даже если ваш сервер недоступен.
lynxlynxlynx
Да, это иронично. Так как ваша серверная ссылка не работает.
Макс фон Хиппель