使用leafpm的Cut layers功能时Polygon重复问题求助
问题根源&解决办法
问题出在leafpm的Edit和Cut工具对图层的处理逻辑完全不一样:
- 用Edit工具时,只是修改原有多边形的坐标,图层的
layerId还是你一开始指定的那个,所以调用removeShape能精准删掉原图形。 - 但Cut工具是直接把原多边形删掉,重新生成几个新的子多边形,这些新多边形的
layerId是leafpm自动生成的临时ID,不是你原来的那个。这时候你再用原ID去删,地图上早就没这个图层了,自然删不掉,新图形加上去就重叠了。
两种解决思路
思路1:一刀切清除所有图形(适合只留最终一个多边形的场景)
初始化的时候先把要管理的图层ID存好,保存的时候直接清空所有图形,再把编辑后的新图形加进去,简单粗暴但有效:
# 用reactiveValues存目标图层ID,方便后续更新 rv <- reactiveValues(target_poly_id = "my_poly") output$map <- renderLeaflet({ leaflet() %>% addTiles() %>% # 给初始多边形指定固定layerId addPolygons(layerId = rv$target_poly_id, data = your_initial_poly) %>% addPmToolbar(pmControls = c("edit", "cut")) }) # 保存按钮的逻辑 observeEvent(input$save_btn, { edited_data <- input$map_pm_edited map_proxy <- leafletProxy("map") # 先清空所有图形,不管是原图形还是Cut出来的临时图形 map_proxy %>% clearShapes() # 再添加编辑后的新图形,用原来的ID或者新ID都行 if (!is.null(edited_data)) { map_proxy %>% addPolygons(layerId = rv$target_poly_id, data = edited_data) } })
思路2:跟踪Cut生成的新图层ID(适合要保留多个切割后图形的场景)
如果需要保留切割后的多个多边形,就得监听Cut事件,把新生成的图层ID记下来,保存时删掉这些ID对应的图层:
rv <- reactiveValues(target_poly_ids = c("my_poly")) output$map <- renderLeaflet({ leaflet() %>% addTiles() %>% addPolygons(layerId = rv$target_poly_ids[1], data = your_initial_poly) %>% addPmToolbar(pmControls = c("edit", "cut")) }) # 监听Cut事件,更新目标图层ID为新生成的临时ID observeEvent(input$map_pm_cut, { # 从Cut返回的数据里提取所有新图层的ID new_ids <- sapply(input$map_pm_cut, function(x) x$layerId) rv$target_poly_ids <- new_ids }) # 保存逻辑:删掉所有目标ID的图层,再加新的 observeEvent(input$save_btn, { edited_data <- input$map_pm_edited map_proxy <- leafletProxy("map") # 逐个删掉所有目标ID对应的图层 for (id in rv$target_poly_ids) { map_proxy <- map_proxy %>% removeShape(layerId = id) } # 添加新图形,重新指定ID if (!is.null(edited_data)) { new_id <- "updated_poly" map_proxy %>% addPolygons(layerId = new_id, data = edited_data) rv$target_poly_ids <- new_id } })
重点提醒
别再纠结原图层ID了,Cut操作后原图层已经被leafpm彻底删掉了,根本不存在了,自然删不掉。要么直接清空所有图形,要么跟踪Cut生成的新ID。
内容的提问来源于stack exchange,提问作者Victor Cz
相关产品推荐
相关产品推荐

