0

時間の経過とともに 2 つの変数を比較する米国の州のマップを作成しようとしています。これを Web ベースのインタラクティブなものにしたいと思います。R、リーフレット、シャイニーを組み合わせてこれを成功させました。ただし、実際には非常に遅いです。

datadrivers.shinyapps.io/opioid_map/

R リーフレットの指示に従って、マップ全体を再描画するのではなく、leafletProxy を使用して関心のあるレイヤーを更新しました。また、それほど多くのデータをレンダリングする必要がないことを期待して、マップの境界を制限しようとしました。スライダーが移動すると、更新に 4 ~ 5 秒かかります。それは遅すぎる。

rMaps と googleVis で他のすばらしい Web マップを調べましたが、一度に 1 つのマップ レイヤーしか許可されていないことがわかります。2 つの変数を提示する必要があります。たとえば、googleVis では、gvisGeoChart を使用してマーカーまたはポリゴンのいずれかを配置できますが、両方を同じマップに配置することはできません。

私の最後の選択肢は、maptools のようなもので静的マップを作成することです。これはより高速になると思いますが、インタラクティブではないため、可能であればそのルートを避けたいと思います。

さらにリーフレットを最適化するためのガイダンスをいただければ幸いです。または、複数の変数をオーバーレイできる別のパッケージを利用してください (この方法で rMaps や googleVis を利用する方法を完全には理解していない可能性があります)。

参考までに、これが Shiny アプリのサーバー コードです。残念ながら、これに関するデータを提供することはできません。

server <- function(input, output, session) {
  output$mymap<-renderLeaflet({
    pal <- colorNumeric(
      palette = "Blues",
      domain = us_state@data$death_rate_2014
    )
    leaflet(us_state) %>% addTiles() %>%
      setView(lng = -96, lat = 38, zoom = 3) %>%
      addLegend(position = "topright",
                pal = pal, values = ~death_rate_2014,
                title = "Deaths by Drug Poisoning, per 100,000",
                opacity = 1) %>%
      setMaxBounds(-72, 40, -70, 43)

  })
  observe({
    pal <- colorNumeric(
      palette = "Blues",
      domain = get(paste0("death_rate_",input$timeSlider),us_state@data)
    )
      leafletProxy("mymap",data=us_state) %>%
      #clearShapes %>% #Commented this step out-clearing the map each time adds a step and confuses the user
      addPolygons(stroke=FALSE,smoothFactor=.2,fillOpacity=.5,
                  color=~pal(get(paste0("death_rate_",input$timeSlider),us_state@data)),
                  popup=~get(paste0("death_rate_",input$timeSlider),us_state@data)) %>%
      addCircles(data=state.centroids2,lat=~Y,lng=~X,
                 radius=~get(paste0("kids_rate_",input$timeSlider),state.centroids2)*250,
                 weight=1,color="red",popup=
                   paste("Foster Care Caseload:",
                         as.character(round(get(paste0("kids_rate_",input$timeSlider),state.centroids2))),
                         "per 100,000"))
  })
}
4

0 に答える 0