【问题标题】:label for overlapping polygons in R leafletR传单中重叠多边形的标签
【发布时间】:2017-10-31 14:11:09
【问题描述】:

我需要标记几个重叠的多边形,但只显示最大的一个的标签。但是,当我使用一些模拟数据进行测试时,标签显示正确。我仔细比较了两种情况下的数据,但找不到导致问题的差异。

这是一个模拟重叠多边形的最小示例:

library(leaflet)
library(sp)

poly_a <- data.frame(lng = c(0, 0.5, 2, 3),
                     lat = c(0, 4, 4, 0))
poly_b <- data.frame(lng = c(1, 1.5, 1.8),
                     lat = c(2, 3, 2))
pgons = list(
  Polygons(list(Polygon(poly_a)), ID="1"),
  Polygons(list(Polygon(poly_b)), ID="2")
)
poly_dat <- data.frame(name = as.factor(c("a", "b")))
rownames(poly_dat) <- c("1", "2")

spgons = SpatialPolygons(pgons)
spgonsdf = SpatialPolygonsDataFrame(spgons, poly_dat, TRUE)

leaflet() %>% addPolygons(data = spgonsdf, label = ~name
                          #           ,
                          #           highlightOptions = highlightOptions(
                          # color = "red", weight = 2,bringToFront = TRUE)
)

它工作正常:

但是它不适用于我的数据。

https://github.com/rstudio/leaflet/files/1430888/Gabs.zip

您可以将 zip 拖入 this site 并使用 i 按钮查看其是否正确标记

library(rgdal)

# download Gabs.zip and extract files to Gabs folder
hr_shape_gabs <- readOGR(dsn = 'Gabs', layer = 'Gabs - OU anisotropic')
hr_shape_gabs_pro <- spTransform(hr_shape_gabs, 
                                 CRS("+proj=longlat +datum=WGS84 +no_defs"))
leaflet(hr_shape_gabs_pro) %>%
  addTiles() %>% 
  addPolygons(weight = 1, label = ~name)

只显示最大的多边形标签:

两种情况下的数据都是 SpatialPolygonsDataFrame,数据槽有正确的多边形名称。

【问题讨论】:

    标签: r leaflet


    【解决方案1】:

    更改hr_shape_gabs中多边形的顺序:位置3的多边形应该是较小的那个。

    library(leaflet)
    library(sp)
    library(rgdal)
    hr_shape_gabs <- readOGR(dsn = 'Gabs - OU anisotropic.shp', 
                             layer = 'Gabs - OU anisotropic')
    
    # Change the position of the smaller and wider polygons
    # Position 1 = wider polygon, position 3 = smaller polygon
    pol3 <- hr_shape_gabs@polygons[[3]]
    hr_shape_gabs@polygons[[3]] <- hr_shape_gabs@polygons[[1]]
    hr_shape_gabs@polygons[[1]] <- pol3
    hr_shape_gabs$name <- rev(hr_shape_gabs$name)
    
    hr_shape_gabs_pro <- spTransform(hr_shape_gabs, 
                                     CRS("+proj=longlat +datum=WGS84 +no_defs"))
    leaflet() %>%
      addTiles() %>% 
      addPolygons(data= hr_shape_gabs_pro, weight = 1, label = ~name)
    

    【讨论】:

    • 我考虑了多边形的顺序并尝试更改plotOrder,但没有效果。在这种情况下不应该使用plotOrder 吗?然而,在切换多边形后,标签放错了位置。标签似乎只是按顺序放置,与多边形 ID 不匹配,所以我也需要更改 data 行顺序。
    • @dracodoc 你是对的。抱歉,我没有更改标签顺序。我更新了我的答案,添加了hr_shape_gabs$name &lt;- rev(hr_shape_gabs$name)。现在订单正常。 plotOrder 似乎对多边形的绘制顺序没有影响。
    【解决方案2】:

    这是基于this answersf 中的多层可扩展解决方案。

    这个想法是通过减小大小对多边形进行排序,这样最小的多边形最后绘制

    library(sf)
    library(dplyr)
    
    # calculate area of spatial polygons sf object
    poly_df$area <- st_area(poly_df)
    poly_df <- arrange(poly_df, -area)
    
    # view with labels in leaflet to see that small polygons plot on top
    leaflet(poly_df) %>% addTiles() %>% addPolygons(label = ~id)
    

    对缺乏可重复性表示歉意。这更像是一个概念答案。

    【讨论】:

      猜你喜欢
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 2023-02-07
      • 1970-01-01
      • 2014-09-18
      相关资源
      最近更新 更多