You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 15:15:57