Визуализация больших наборов данных с помощью 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 является бесплатным / открытым исходным кодом и т. Д.


1
Я забыл упомянуть, что пользователь должен иметь возможность фильтровать набор данных по атрибутам и отображать только соответствующие записи. Итак, скажем, из 10000 записей только 500, возможно, потребуется визуализировать для данного случая. Могу (или как бы) я сделать это с TileMill?
Imad

3
Нет. Возможно, вы захотите попробовать CartoDB , но вы должны знать, что сделать вещи динамичными и сделать их эффективными - противоположные цели.
tmcw

1
ссылка на карту переписи не работает!
Дрио

Все ссылки даны.
LeeGee

9

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

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


7

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


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

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

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


-5

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

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


2
Пожалуйста, расширьте свой ответ, чтобы он был полезен, даже если ваш сервер недоступен.
lynxlynxlynx

Да, это иронично. Так как ваша серверная ссылка не работает.
Макс фон Хиппель
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.