gpt4 book ai didi

r - 优化具有许多 'layers' 的详细 map 的 Shiny + Leaflet 性能

转载 作者:行者123 更新时间:2023-12-04 01:13:04 24 4
gpt4 key购买 nike

我想制作一个 Shiny 应用程序,其中 choropleth 的着色基于用户可以从中选择的许多可能的定量变量之一的数值。在简单的情况下,这很简单,但是当我们有 20 多个变量以及非常详细的形状文件(约 2300 个多边形)时,我不确定最佳实践。

变量可能彼此完全独立,例如“总人口”或“平均温度”,可能相关也可能不相关,但其中一些将具有时间关系,例如 3 个或更多时间点的“总人口” .

我使用的主要 shapefile 之一是 ABS Statistical Area 2 .下面我给出了澳大利亚的人口密度(总人口/面积)和悉尼的放大 View ,以更好地传达我感兴趣的细节水平。

澳大利亚
Australia
悉尼
Sydney

我已将 shapefile 读入 R 并使用 ms_simplify() 大大降低了复杂性/点数rmapshaper 中的函数包裹。

现在就 Shiny 和传单而言,这就是我一直在做的事情:

  • 之前server对象在 server.R 中定义,我构建了一个包含所有所需“图层”的主 map 对象。也就是说,一张带有无数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() 隐藏第一层的所有栏这样 map 的初始渲染就不会看起来很傻。
    hideGroup("layer_1") %>% 
    hideGroup("layer_2") %>%
    ...
    hideGroup("layer_n")
  • 在 Shiny 应用程序中,使用单选按钮 ( layer_selection ),用户可以选择他们想要查看的“图层”。我用 observeEvent(input$layer_selection, {})查看单选按钮选项的状态。
    为了更新情节,我使用 leafletProxy()hideGroup()隐藏所有组,然后 showGroup()取消隐藏所选图层。

  • 对于缺乏可重现的示例,我深表歉意。

    问题
  • 如何优化我的代码?我渴望让它更高效和/或更易于使用。我发现使用 hideGroup() 's/showGroup()对于每一层选择比使用 addPolygon() 快得多到空白 map ,但这会导致应用程序需要很长时间才能加载。
  • 我可以更改我正在为多边形着色的变量,而无需重新绘制或添加这些多边形吗?澄清一下,如果我有 2 个不同的变量要绘制,都使用相同的形状数据,我是否必须做 2 个不同的 addPolygon()电话?
  • 是否有更自动的方法可以根据所需的调色板(来自 viridis 包?)为每个图层的多边形着色。现在我发现为每个变量定义一个新的调色板,相当麻烦,例如:
    palette_layer_n <- colorNumeric(
    palette = "viridis",
    domain = aus_sa2_areas$aus_sa2_areas$var_n
    )

  • 旁问

    怎么样 this map在ABS网站上工作?它可以非常详细,但响应速度非常快。将网格块细节与 SA2(2310 个多边形)进行比较,示例如下:

    ABS web based map

    最佳答案

    由于您还没有得到任何答案,我将根据 发布一些可能对您有所帮助的内容。简单示例 .

    如果您的可重现,当然会更容易;我想通过环顾四周,您已经看到有几个相关的问题/请求(关于重新着色多边形),而似乎还没有真正的解决方案使其成为任何版本(传单)。

    通过以下解决方法,您应该能够避免多个 addPolygons并且可以覆盖任意数量的变量(虽然现在我只是将单个变量硬编码到 modFillCol 调用中)。

    library(leaflet)
    library(maps)
    library(viridis)

    mapStates = map("state", fill = TRUE, plot = FALSE)

    # regarding Question 3 - the way you set the domain it looks equivalent
    # to just not setting it up front, i.e. domain = NULL
    myPalette <- colorNumeric(
    palette = "viridis",
    domain = NULL
    )

    mp <- leaflet(data = mapStates) %>%
    addTiles() %>%
    addPolygons(fillColor = topo.colors(10, alpha = NULL), stroke = FALSE)

    # utility function to change fill color
    modFillCol <- function(x, var_x) {
    cls <- lapply(x$x$calls, function(cl) {
    if (cl$method == "addPolygons") {
    cl$args[[4]]$fillColor <- myPalette(var_x)
    }
    cl
    })
    x$x$calls <- cls
    x
    }

    # modify fill color depending on the variable, in this simple example
    # I just use the number of characters of the state-names
    mp %>%
    modFillCol(nchar(mapStates$names))

    关于r - 优化具有许多 'layers' 的详细 map 的 Shiny + Leaflet 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51607487/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com