r - sf:如何从 GEOMETRYCOLLECTION 回到 MULTIPOLYGON?

标签 r polygon spatial sf

我有一个世界国家数据集,想在本初子午线上拆分它,并将数据重新集中在太平洋上。
我正在尝试使用简单功能 (sf) 来执行此操作,但遇到了一个我无法解决的对象类型问题。
为了拆分数据,我尝试了以下操作:


   st_wg84 <- "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"

   # world country layer
   sfpolys <- rnaturalearth::ne_countries(scale = "medium", returnclass = "sf") 
   %>% st_sfc(crs = st_wg84 )

   # shift central/prime meridian towards west 
   shift <- 152 

   # create "split line" to split worldmap (split at Prime Meridian)
   split.line <- st_linestring(
     x = cbind(matrix(shift-180, 181, 1), matrix(-90:90,181,1))
    ) %>% 
     st_sfc(crs=st_wg84)

   # split country polygons along prime meridian
   sfpolys.split <- lwgeom::st_split(sfpolys, split.line)

哪个有效,导致 GEOMETRYCOLLECTION对象,沿所需的线分割,包含与传入 MULTIPOLYGON 相同数量的特征.
接下来,我需要移动坐标以使 map 重新居中,为此我必须将多边形坐标转换为数据框。
    countries <- data.table(map_data(as(sfpolys.split, "Spatial")))

    # Shift coordinates to fall correctly on shifted map
    countries$long.shift <- countries$long + shift
    countries$long.shift <- ifelse(countries$long.shift > 180, 
    countries$long.shift - 360, countries$long.shift)

    # plot shifted map
    ggplot() + 
      geom_polygon(data=countries, 
        aes(x=long.shift, y=lat, group=group), 
        colour="black", fill="gray80", size = 0.25) +
      coord_equal()
  
但是,此转换不适用于 GEOMETRYCOLLECTION ,但它确实与 MULTIPOLYGON .
所以为了找回MULTIPOLYGON我首先尝试了以下方法:
sfpolys.split <- sfpolys.split %>% st_cast("MULTIPOLYGON")

但这会导致以下错误:“m[1, ] 中的错误:维数不正确”
然后我试过:
sfpolys.split <- sfpolys.split %>% st_collection_extract(type="POLYGON")

但这给出了 POLYGON对象,我不知道如何正确分组到 MULTIPOLYGON .
有谁知道进行这种拆分和转移的更好方法,或者从 GEOMETRYCOLLECTION 获得的简单方法吗?到 MULTIPOLYGON ?
这是我想要的结果:
enter image description here

最佳答案

GEOMETRYCOLLECTION 是一个几何体列表,因此我们可以提取单个几何体。

幸运的是,您的每个 GEOMETRYCOLLECTION 几何图形都是 POLYGONS,因此我们可以很好地将它们包装成 MULTIPOLYGONS

geoms <- lapply( sfpolys.split$geometry, `[` )
mp <- lapply( geoms, function(x) sf::st_multipolygon( x = x ) )

然后创建一个sfc
sfc_mp <- sf::st_sfc( mp )

并将其附加到您的对象
sfpolys.split$mp <- sfc_mp
sfpolys.split <- sf::st_set_geometry( sfpolys.split, sfc_mp )

这是一个检查格陵兰岛 split 的阴谋。我在每个单独的多边形周围添加了一个白色边框
library(mapdeck)

sf_line <- sf::st_sf( geometry = split.line )

mapdeck() %>%
    add_path(
        data = sf_line
    ) %>%
    add_polygon(
        data = sfpolys.split
        , fill_colour = "name_pl"
        , stroke_colour = "#FFFFFF"
        , stroke_width = 50000
    )

enter image description here

其余的绘图代码不可重现,因此我将其留给您解决。

关于r - sf:如何从 GEOMETRYCOLLECTION 回到 MULTIPOLYGON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57677412/

相关文章:

r - sec.axis() 对每个方面进行不同的转换

java - 将迭代方法改为递归计算多边形面积

r - 距离路径最近的点

r - 如何在 R 中读取 .MAP 文件扩展名?

r - dplyr 0.7 函数中的 if/else 条件

r - 如何在 R 中创建年/学期格式的日期?

mysql - 将坐标插入 MySQL - PolyFromText SQL 语法错误/返回空值

javascript - 使用坐标中的多边形创建静态谷歌地图图像

r - 使用纬度/经度坐标创建六边形单元格

r - R 中的元素重复与全局重复