gpt4 book ai didi

r - 在 Shiny 中使用传单绘制多个多边形

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

我正在努力在 Shiny 应用程序中绘制多个多边形 - 基于传单包。

这是我希望的非应用程序输出:

data <- list(
beam1 = data.frame(lat = c(-115,-125, -125, -115),
lon = c(32, 32, 45,45)),
beam2 = data.frame(lat = c(-100, -111, -111, -100),
lon = c(42, 42, 50,50))
)
dataTemp <- do.call(rbind, lapply(data, function(x) rbind(x, NA)))

library(leaflet)
m = leaflet() %>% addTiles()
m %>%
addPolygons(
dataTemp[,"lat"],
dataTemp[,"lon"],
color = c('red', 'green'), weight = 3
)

然而,事实证明,用它创建一个 Shiny 应用程序是很困难的 - 多边形被绘制出来,然后一旦绘制了一个新的多边形就一个一个地消失。这是我正在使用的代码。您需要单击“绘制”以绘制多边形
注意如何:
1 - 绘制绿色时红色多边形消失(3 秒后)
2 - 这里的多边形是三角形,而在上面的代码中它们是矩形。
3 - 如果您查看下面 server.R 中的代码,我实际上不得不翻转“lat”和“lon”列才能获得远程正确的图片。

用户界面:
library(shiny)
library(leaflet)

shinyUI(navbarPage("Beams", id="nav",

tabPanel("Interactive map",
div(class="outer",

leafletMap("map", "100%", 650,
options = list(center = c(37.45, -93.85), zoom = 4)),
actionButton("drawPoints", "Draw")
)
)
))

服务器.R:
library(shiny)
library(leaflet)

data <- list(
beam1 = data.frame(lat = c(-115,-125, -125, -115),
lon = c(32, 32, 45,45)),
beam2 = data.frame(lat = c(-100, -111, -111, -100),
lon = c(42, 42, 50,50))
)

# server activity
shinyServer(function(input, output, session) {

map <- createLeafletMap(session, "map")

observe({

if(input$drawPoints == 0) {
return(NULL)
} else {

map$clearShapes()

for (i in seq_along(data)) {
map$addPolygon(
data[[i]][,"lon"], # - notice, i had to change lat and lon
data[[i]][,"lat"],
layerId=c("1"),
list( fillOpacity=0.4),
list(color = c('red','green')[i])

)
Sys.sleep(3) # - this is to see first (red) polygon
}
}
})


})

任何想法,将不胜感激!

最佳答案

我已经更新了您的代码以使用传单代理,这是更新现有 map 的一种更简洁的方法,并且是当前在对 leaflet 的持续更新中执行此操作的方法。包(据我所知)。我在 data.frame 中切换了您的“纬度”和“经度”以使它们正确。我还在坐标的末尾再次添加了原点以完成形状——这就是为什么你有三角形而不是矩形。最后,我更改了 layerId对于多边形 i让他们与众不同——这就是为什么他们互相抹去。

我假设您希望对形状进行硬编码,但是有一些方法可以向用户打开多边形图选择(甚至绘图)。有趣的笔记:在解决这个问题时,了解了 deferUntilFlush参数在 leafletProxy -- 如果没有设置为 FALSE ,两个形状都只在 Sys.sleep 之后绘制完成计数。

用户界面

library(shiny)
library(leaflet)

shinyUI(navbarPage("Beams", id="nav",

tabPanel("Interactive map",
div(class="outer",
leafletOutput("map", "100%", 650),
actionButton("drawPoints", "Draw")
)
)
))

服务器
library(shiny)
library(leaflet)

data <- list(
beam1 = data.frame(lon = c(-115,-125, -125, -115, -115),
lat = c(32, 32, 45, 45, 32)),
beam2 = data.frame(lon = c(-100, -111, -111, -100, -100),
lat = c(42, 42, 50, 50, 42))
)

shinyServer(function(input, output, session) {

map <- leaflet() %>% addTiles() %>% setView(-93.85, 37.45, zoom = 4)
output$map <- renderLeaflet(map)
proxy <- leafletProxy("map", deferUntilFlush = FALSE)

observeEvent(input$drawPoints, {
proxy %>% clearShapes()
for (i in seq_along(data)) {
proxy %>% addPolygons(
data[[i]][,"lon"],
data[[i]][,"lat"],
layerId=i,
opacity=0.4,
color = c('red','green')[i]
)
Sys.sleep(2) # - this is to see first (red) polygon
}
})
})

关于r - 在 Shiny 中使用传单绘制多个多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29976414/

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