如何为mapview地图的多个点位添加不同的iframe弹窗?
解决mapview为不同点位添加独立iframe弹窗的问题
哈哈,这个问题我之前折腾过好一会儿!核心问题在于你得给每个点位单独生成对应的iframe弹窗,而不是把所有iframe打包传进去。下面给你具体的解决步骤和代码示例:
1. 先准备带视频链接的空间数据
首先你需要有一个包含各个点位对应视频嵌入链接的空间对象(比如sf格式),这里我用三个示例点位和不同的视频嵌入链接来演示:
library(mapview) library(sf) # 构造带视频链接的sf点数据 points <- st_sfc( st_point(c(116.397, 39.908)), # 示例点位1 st_point(c(121.473, 31.230)), # 示例点位2 st_point(c(113.264, 23.129)) # 示例点位3 ) %>% st_sf( video_url = c( "https://www.youtube.com/embed/iApz08Bh53w?autoplay=1", "https://www.youtube.com/embed/dQw4w9WgXcQ?autoplay=1", "https://www.youtube.com/embed/9bZkp7q19f0?autoplay=1" ), crs = 4326 )
2. 为每个点位生成专属的iframe弹窗
用lapply(或者purrr::map)遍历所有视频链接,逐个调用popupIframe生成对应的弹窗对象,这样得到的是一个弹窗对象列表,每个元素对应一个点位:
# 用lapply生成每个点位的专属弹窗 popup_list <- lapply(points$video_url, function(url) { mapview::popupIframe(url, width = 300, height = 225) }) # 如果你习惯用tidyverse风格,也可以用purrr::map # library(purrr) # popup_list <- map(points$video_url, ~popupIframe(.x, width = 300, height = 225))
3. 调用mapview实现点位与弹窗的一一对应
最后把生成的popup_list直接传给mapview的popup参数就可以了,mapview会自动将列表中的第n个弹窗匹配到第n个点位:
mapview(points, popup = popup_list)
为什么之前的方法会失败?
你之前尝试的方式相当于把所有iframe弹窗内容合并后传给每个点位,而mapview的popup参数如果接收的是列表,会默认将列表元素与点位一一绑定,这样就能实现每个点位只显示自己对应的iframe啦!
内容的提问来源于stack exchange,提问作者W148SMH
相关产品推荐
相关产品推荐

