闪亮的传单添加大量分离的折线

2024-05-23

我有一个 200k 行数据集,其中包含出发地和目的地的坐标。我有一个 R 闪亮的应用程序,带有传单地图,可以在这些坐标上显示圆圈,尽管坐标数量很大,但效果很好。

这是数据的简化示例。每行包含出行id、出发地经纬度、目的地经纬度。

  id lat_begin lat_end lng_begin lng_end
1  1     46.49   46.27      2.65    7.66
2  2     45.94   49.24      7.94    0.76
3  3     48.07   49.50      2.05    2.61
4  4     46.98   48.94      0.80    5.76
5  5     46.94   48.82      7.36    6.40
6  6     47.37   48.52      5.83    7.00

现在我的目标是在每个出发地和目的地之间添加线路,即 20 万条线路。

我在 1000 行样本上尝试了几种想法,但它总是花费太多时间,并且显示 200k 行需要几个小时。

第一种方法:

addPolylines 函数上的 for 循环

library(dplyr)
library(shiny)
library(leaflet)


n = 1000 # small number of lines 
data_dots = data.frame(id = 1:n,
                       lat_begin = round(runif(n,45,50),2),
                       lat_end = round(runif(n,45,50),2),
                       lng_begin = round(runif(n,0,8),2),
                       lng_end = round(runif(n,0,8),2))

ui <- fluidPage(
  leafletOutput("map")
)

server <- function(input, output) {
  # Initiate the map
  output$map <- renderLeaflet({
    myMap = leaflet() %>% 
      addTiles(options = providerTileOptions(noWrap = TRUE)) %>%
      setView(lng=3.07381,lat=45.7829,zoom=5) %>%

      # add dots
      addCircles(data = data_dots, ~c(lng_begin,lng_end) , ~c(lat_begin,lat_end), 
                 stroke=FALSE, fillOpacity = 0.7)

    # add lines
    for(i in 1:n){
          myMap = myMap %>%
            addPolylines(data = data_dots[i,],
                         lng= ~ c(lng_begin, lng_end),
                         lat= ~ c(lat_begin, lat_end),
                         color = 'blue',
                         weight = 1)
    }
    myMap

    # also tried with apply
    # lapply(data_dots$id,
    #        function(x) {
    #          addPolylines(myMap,
    #                       data = data_dots[data_dots$id == x, ],
    #                       lng = ~c(lng_begin, lng_end),
    #                       lat = ~c(lat_begin, lat_end),
    #                       color = 'blue',
    #                       weight = 1)
    #        })
    # myMap

  })
}
shinyApp(ui = ui, server = server)

第二种方法:

创建空间线对象

library(dplyr)
library(shiny)
library(leaflet)
library(maptools)
library(sp)

n = 1000
data_dots = data.frame(id = 1:n,
                       lat_begin = round(runif(n,45,50),2),
                       lat_end = round(runif(n,45,50),2),
                       lng_begin = round(runif(n,0,8),2),
                       lng_end = round(runif(n,0,8),2))

begin <- data_dots %>% 
  select(id, lat_begin, lng_begin) %>%
  rename(latitude = lat_begin, longitude = lng_begin)

end <- data_dots %>%
  select(id, lat_end, lng_end) %>%
  rename(latitude = lat_end, longitude =lng_end)


data_lines = bind_rows(begin, end)

# make data_lines a spatialdataframe
coordinates(data_lines) <- c('longitude', 'latitude')

# create a list per id
id_list <- sp::split(data_lines, data_lines[['id']])

id <- 1
#for each id, create a line that connects all points with that id
for ( i in id_list ) {
  event.lines <- SpatialLines( list( Lines( Line( i[1]@coords ), ID = id ) ),
                               proj4string = CRS( "+init=epsg:4326" ) )
  if ( id == 1 ) {
    sp_lines  <- event.lines
  } else {
    sp_lines  <- spRbind( sp_lines, event.lines )
  }
  id <- id + 1
}



ui <- fluidPage(
  leafletOutput("map")
)

server <- function(input, output) {
  # Initiate the map
  output$map <- renderLeaflet({
    myMap = leaflet() %>% 
      addTiles(options = providerTileOptions(noWrap = TRUE)) %>%
      setView(lng=3.07381,lat=45.7829,zoom=5) %>%

      # add dots
      addCircles(data = data_dots, ~c(lng_begin,lng_end) , ~c(lat_begin,lat_end), 
                 stroke=FALSE, fillOpacity = 0.7) %>%
      # add lines
      addPolylines(data = sp_lines)

  })

shinyApp(ui = ui, server = server)

每个案例需要几秒钟,有 1000 行。我可以用 200k 条线快速添加圆圈,但最大的问题是添加线。


为什么使用 for 循环来循环每一行而不是一次绘制整个数据框?这已经快得多了,但是对于 200k 行,渲染仍然会“慢”。

  output$map <- renderLeaflet({
    myMap = leaflet() %>% 
      addTiles(options = providerTileOptions(noWrap = TRUE)) %>%
      setView(lng=3.07381,lat=45.7829,zoom=5) %>%

      # add dots
      addCircles(data = data_dots, ~c(lng_begin,lng_end) , ~c(lat_begin,lat_end), 
                 stroke=FALSE, fillOpacity = 0.7) %>% 

        addPolylines(data = data_dots,
                     lng= ~ c(lng_begin, lng_end),
                     lat= ~ c(lat_begin, lat_end),
                     color = 'blue',
                     weight = 1)

    myMap
  })

Maybe mapview可能对此有所帮助,因为它曾经有一个处理大型数据集的函数(addLargeFeatures)并在内部使用了相当多的 C++。

我认为该功能消失了,希望现在已实现addFeatures。这应该比纯传单要快一些。

library(dplyr)
library(shiny)
library(leaflet)
library(mapview)
library(sf)


n = 10000 # small number of lines 
data_dots = data.frame(id = 1:n,
                       lat_begin = round(runif(n,45,50),2),
                       lat_end = round(runif(n,45,50),2),
                       lng_begin = round(runif(n,0,8),2),
                       lng_end = round(runif(n,0,8),2))

ui <- fluidPage(
  leafletOutput("map")
)

server <- function(input, output) {
  # Initiate the map
  output$map <- renderLeaflet({
    data_dots_sf_begin <- data_dots %>% 
      st_as_sf(coords=c("lng_begin", "lat_begin"))

    data_dots_sf_end <- data_dots %>% 
      st_as_sf(coords=c("lng_end", "lat_end"))

    data_dots_sf <- st_combine(cbind(data_dots_sf_begin, data_dots_sf_end)) %>% 
      st_cast("LINESTRING")

    st_crs(data_dots_sf) <- 4326

    leaflet() %>% 
      addTiles(options = providerTileOptions(noWrap = TRUE)) %>%
      addFeatures(data = data_dots_sf,
                  color = 'blue',
                  weight = 1)
  })
}
shinyApp(ui = ui, server = server)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

闪亮的传单添加大量分离的折线 的相关文章

随机推荐

  • MS Access - 拆分数据库上出现“文件已在使用中”错误

    我在 Windows 7 上的 MS Access 2010 中有一个拆分数据库 后端位于网络驱动器上的一个文件夹中 只有某些人具有写入权限 每个人都有读取权限 每个用户都有自己的前端副本存储在其本地计算机上 BE 和 FE 均设置为对所有
  • IDA pro asm 指令更改

    我只是想知道我怎样才能 更改IDA视图A中的asm指令 如何编辑指令 对于 实例 jnz 到 jmp 如何插入新指令 call func1 调用 func2 插入到现有的 代码 我知道如何制作 diff 文件 我知道如何在我的 DLL 上应
  • Python:创建登录系统[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想使用 python 创建一个登录
  • 使用 JSF 2.0 Ajax 响应访问 bean 函数的返回值?

    我正在使用 JSF 2 0 构建一个调度应用程序 用户可以在其中将项目添加到日历中 然后编辑这些对象 我广泛使用 AJAX 来防止页面刷新 我遇到的问题是从使用 AJAX 调用的函数中获取返回值
  • 在ABAP中显示消息语句内的变量

    如何在不使用消息类的情况下显示消息语句中的变量 IF acct bal lt min bal MESSAGE customer balance less than minimum Balance gt acct bal TYPE E END
  • java.lang.NoClassDefFoundError: com.itextpdf.text.Document

    我已将 jar 文件添加到现有项目中 如下所述http www vogella com articles Eclipse article html classpath http www vogella com articles Eclips
  • 为什么总是在 mouseDoubleClickEvent 之前调用 mousePressEvent

    请考虑以下代码 include
  • HTML Mobile - 强制软键盘隐藏[重复]

    这个问题在这里已经有答案了 我正在为一家优惠券公司开发前端网站 我有一个页面 用户只需输入电话号码和花费的美元 我们想出了一个有趣的内置 Javascript 屏幕键盘 它易于使用且快速 但是 我正在寻找一种解决方案 以在用户聚焦并在这些字
  • 在 Shiny 应用程序中更改 bsModal 的背景

    我正在开发一个 Shiny 应用程序 我需要确保最终用户不会意外关闭 bsModal 因为它上面有一些操作按钮 我做了一些研究并了解到我需要覆盖背景和键盘参数 但即使我看到了一些建议 我也不知道这到底需要放在我的代码中的哪里 我不精通 Ja
  • 如何从 fastapi 响应返回 PIL 图像文件列表?

    我使用 fastapi 创建了一个rest api 它将文档 pdf 作为输入并返回它的 jpeg 图像 我使用一个名为 docx2pdf 的库进行转换 from docx2pdf import convert to from fastap
  • Espresso-android jar - android studio 8.x 中“打开 zip 文件时出错”

    我一直收到此错误 我已经尝试了此处所述的解决方案 Android studio 无法完成 gradle 执行 打开 zip 文件时出错 https stackoverflow com questions 23828085 android s
  • 为什么应该或不应该将数据集、数据表等存储为 ASP.NET 页面中的会话变量?

    我正在开发一个使用 Web 服务返回的数据集的 Web 应用程序 当应用程序运行时 我将该数据集存储为会话变量 以便在用户导航到将编辑数据集中的表的不同页面时反复使用 这个想法是 当应用程序加载时 用户只需要等待一次数据 然后应用程序将使用
  • Visual Studio 2010 Intellisense 抛出错误

    我编写 2D 游戏引擎已经大约两年了 最近智能感知一直抛出错误 代码编译 链接和运行都很好 但智能感知会报告多达 70 个 错误 我尝试删除测试项目和库生成器项目的 SQL 文件 但在重建智能感知数据库时 只有一个构建的错误停止了 尽管它不
  • 指针数组与元素数组

    今天早上我和一位同事就这个话题进行了讨论 他说 将数组分配为指针数组总是更好 因为单独分配每个元素更有机会获得空闲内存块 有点像这样 Consider n elements as a dynamic value int n elements
  • 使用 Pandas 读取 CSV 时如何删除 .0

    我有一个 CSV 文件正在读入 pandas 数据帧 所有数字都没有任何小数位 但是当我将其读入 dframe 时 它 会在带小数的数字中添加尾随零 1205 变为 1205 0 如何在 pd read csv 期间去掉 0 我知道我可以在
  • JFreeChart - 具有 2 个图例的颜色问题

    我尝试在图表中创建自定义图例 但当我显示一两个图例时 会发生一些奇怪的情况 当我显示 2 个图例 旧的和新的 时 一切都很好 图例和图表中的颜色受到尊重 但是 当我只想显示新图例时 图例中的颜色受到尊重 但图表中的颜色不再受到尊重 这是我的
  • context.xml 的 glassfish 替代品是什么

    我习惯于配置网络应用程序context xml 包括jdbc资源和应用程序配置参数 在 glassfish 下 什么被认为是存储应用程序配置信息的标准位置 我们曾经将它存储在context xml文件如下
  • sizeToFit 运行异常

    我有一段代码 每次发生后端数据库更改时都会执行 本质上我在父视图中有一个标签 标签由许多状态消息之一更新 每个状态消息位于不同的行上 并以换行符 n 结尾 每条状态消息只能在一行上 并且不能过多 我遇到的问题是 当视图首次重新加载时 一切正
  • Visual Studio 2010 支持 iPhone 开发吗? [复制]

    这个问题在这里已经有答案了 可能的重复 如何使用 Windows 开发机为 iPhone 进行开发 https stackoverflow com questions 22358 how can i develop for iphone u
  • 闪亮的传单添加大量分离的折线

    我有一个 200k 行数据集 其中包含出发地和目的地的坐标 我有一个 R 闪亮的应用程序 带有传单地图 可以在这些坐标上显示圆圈 尽管坐标数量很大 但效果很好 这是数据的简化示例 每行包含出行id 出发地经纬度 目的地经纬度 id lat