Я хочу создать приложение Shiny, в котором раскраска картограммы основана на числовом значении одной из многих возможных количественных переменных, из которых пользователь может выбирать. В простых случаях это просто, но я не уверен в лучших практиках, когда у нас есть 20+ переменных с довольно подробными файлами форм (~ 2300 полигонов).
Может иметь значение, а может и не быть, что переменные могут быть полностью независимыми друг от друга, например, «Общая популяция» или «Средняя температура», но некоторые из них будут иметь временную взаимосвязь, например, «Общая популяция» в 3 или более моментов времени. .
Один из основных шейп-файлов, которые я использую, - это Статистическая область АБС 2. Ниже я даю плотность населения (общая численность населения / площадь) для Австралии и увеличенный вид Сиднея, чтобы лучше передать интересующий меня уровень детализации.
Я прочитал шейп-файл в R и значительно уменьшил сложность / количество точек, используя функцию ms_simplify()
в пакете rmapshaper
.
Что касается Shiny и листовок, то вот чем я занимаюсь:
Прежде чем объект
server
будет определен вserver.R
, я создаю первичный объект карты со всеми желаемыми «слоями». То есть буклет с многочисленнымиaddPolygon()
призывами определить окраску каждого «слоя» (группы).# Create main map primary_map <- leaflet() %>% addProviderTiles( providers$OpenStreetMap.BlackAndWhite, options = providerTileOptions(opacity = 0.60) ) %>% # Layer 0 (blank) addPolygons( data = aus_sa2_areas, group = "blank" ) %>% # Layer 1 addPolygons( data = aus_sa2_areas, fillColor = ~palette_layer_1(aus_sa2_areas$var_1), smoothFactor = 0.5, group = "layer_1" ) %>%
...
# Layer N addPolygons( data = aus_sa2_areas, fillColor = ~palette_layer_n(aus_sa2_areas$var_n), smoothFactor = 0.5, group = "layer_n" ) %>% ...
Затем все, кроме первого слоя, скрывается с помощью
hideGroup()
, чтобы первоначальный рендеринг карты не выглядел глупо.hideGroup("layer_1") %>% hideGroup("layer_2") %>% ... hideGroup("layer_n")
В приложении Shiny с помощью переключателей (
layer_selection
) пользователь может выбрать «слой», который он хотел бы видеть. Я используюobserveEvent(input$layer_selection, {})
для просмотра состояния параметров переключателя. Чтобы обновить график, я используюleafletProxy()
иhideGroup()
, чтобы скрыть все группы, а затемshowGroup()
, чтобы отобразить выбранный слой.
Прошу прощения за отсутствие воспроизводимого примера.
Вопросы
Как я могу оптимизировать свой код? Я очень хочу сделать его более производительным и / или простым в работе. Я обнаружил, что использование
hideGroup()
/showGroup()
для выбора каждого слоя намного быстрее, чем использованиеaddPolygon()
для пустой карты, но это приводит к тому, что приложение загружается очень долго.Могу ли я изменить переменную, которой я раскрашиваю многоугольники, без перерисовки или добавления этих многоугольников снова? Чтобы уточнить, если у меня есть 2 разные переменные для построения, обе используют одни и те же данные формы, нужно ли мне делать 2 разных
addPolygon()
вызова?Есть ли более автоматический способ разумно раскрасить полигоны для каждого слоя в соответствии с желаемой палитрой (из пакета viridis?). Прямо сейчас я нахожу определение новой палитры для каждой переменной довольно громоздкой, например:
palette_layer_n <- colorNumeric( palette = "viridis", domain = aus_sa2_areas$aus_sa2_areas$var_n )
Дополнительный вопрос
Как работает эта карта на веб-сайте ABS? Он может быть невероятно подробным и в то же время чрезвычайно отзывчивым. Сравните детали Mesh Block с SA2 (2310 полигонов), пример ниже: