2016-02-12 1 views
6

Я использую пакет буклетов в R, чтобы создать карту с большим количеством кругов на ней. Цель - это карта, которую я могу опубликовать на своем веб-сайте. Проблема, с которой я сталкиваюсь, заключается в том, что по мере увеличения количества кругов результирующая карта загружается очень медленно, я получаю предупреждения «невосприимчивого скрипта» и в конечном итоге полностью замораживает мой браузер.Как создать карту листовки с тысячами отметок, которая не разбивает мой браузер?

Я знаю, что такого рода вещи можно, потому что я нашел карту листовку, которая работает так, как я хочу, чтобы мои работы:

http://cartologic.com/geoapps/map_viewer/5/ny-crimes-2014-dot-density-map

Я замечаю на карте выше, что круги надевают 't кажутся «кликабельными», как круги на моей карте, и что они, похоже, загружаются в квадратные куски. У меня есть подозрение, что эти вещи связаны с моей проблемой. К сожалению, я слишком много новичок в материалах листовки/javascript, чтобы понять это самостоятельно.

Вот это игрушка пример, иллюстрирующий мою проблему:

library("leaflet") 
library("htmlwidgets") 

dots <- data.frame(x=c(runif(10000, -93.701281, -93.533053)), 
        y=c(runif(10000, 41.515962, 41.644369))) 

m <- leaflet(dots) %>% 
    addTiles('http://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png') %>% 
    setView(-93.617167, 41.580166, zoom = 12) %>% 
    addCircles(~x, ~y, weight = 1, radius = 5, 
      color = "#FFA500", stroke = TRUE, fillOpacity = 0.1) 

m 

saveWidget(widget = m, file="example.html", selfcontained = TRUE) 
+0

кластер - это отличные варианты (https://rstudio.github.io/leaflet/markers.html). Ваш пример работает очень хорошо! Сколько очков вы говорите? – MLavoie

+0

@MLavoie Спасибо за предложение. Я возился с параметрами кластера и просто не мог получить требуемую производительность. Мой пример хорошо работает в зависимости от используемой машины. Но увеличение количества точек, и вы, в конечном счете, достигли предела. Я ищу что-то гораздо более масштабируемое, чтобы делать карты с большой плотностью. – DWal

ответ

0

Если вы хотите добавить большое количество векторных объектов на карте, это редко, что это может быть сделано легко.

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

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

У меня есть приложение, подобное этому, где я в основном разбиваю свои векторные данные на границах плитки и сохраняю информацию в файлах geojson. Когда я получаю событие, в которое загружена растровая плитка, я могу загрузить эквивалентный векторный файл в качестве слоя geojson (то же самое, когда растровая плитка выгружается). Таким образом, вы можете ограничить количество векторных данных, которые должны отображаться в любой момент времени.

Если у вас много очков, на самом деле они не будут отображаться при низких уровнях масштабирования, поэтому лучше просто показать их при соответствующем уровне масштабирования (возможно, с другим представлением при низких масштабах - как тепловая карта). Это приведет к тому, что количество данных будет отображаться в любой момент ниже.

2

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

ваш пример с 1 Mio. очки:

library(mapview) 
library(sp) 

dots <- data.frame(x=c(runif(1000000, -93.701281, -93.533053)), 
        y=c(runif(1000000, 41.515962, 41.644369))) 

coordinates(dots) <- ~ x + y 
proj4string(dots) <- "+init=epsg:4326" 

mapview(dots) 

Может потребоваться некоторое время для рендеринга, но после визуализации он должен быть достаточно отзывчивым. Обратите внимание, что mapview предназначен для работы с пространственными * объектами, поэтому нам нужны вызовы для установки координатного слота и проекции.

Для получения дополнительной информации посмотрите здесь:

http://environmentalinformatics-marburg.github.io/web-presentations/20150723_mapView.html

Надежда, что помогает.

+0

с версией mapview_1.0.0 ваши очки не отображаются на карте (даже через несколько минут). Карта там все в порядке, но пустое. Любые причины, которые могли бы объяснить это поведение – MLavoie

+0

@MLavoie приведенный выше пример с 1 Mio. очки отлично подходят для меня с версией 1.0.0. Если вы пытаетесь сделать что-то еще, как пример воспроизводимого примера? – TimSalabim

+0

Я использую точно такой же пример, и все, что у меня есть, - это карта Де-Мойна и карта не в полном размере (~ 90% монитора) на моем ноутбуке. Также загружен листlet1.0.1.9002. – MLavoie

0

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

Во-первых, я нашел TileMill. Просто загрузите файл данных координат в TileMill, создайте стиль, который вы хотите, чтобы он появился, и выведите плитки (png). Храните эти плитки в Интернете где-нибудь и загрузите их лифтом. Этот процесс был слишком ручным для меня, потому что TileMill продолжал сбой, когда я загружался в файлы csv, которые были слишком большими для его отображения на моей машине.

Я нашел лучшее решение для использования Обработка данных, адаптировавших код Robert Manduca здесь: https://github.com/rmanduca/jobmaps. Я не использую Python, поэтому я переписал эти части в R и изменил код обработки в соответствии с моими спецификациями.

Смежные вопросы