科幻小说:如何从GEOMETRYCOLLECTION回到MULTIPOLYGON?

时间:2019-08-27 14:54:39

标签: r polygon spatial sf

我有一个世界国家/地区数据集,并希望将其在本初子午线上拆分,然后将数据重新居中以将重点放在太平洋上。

我正在尝试使用简单功能(sf)进行此操作,但是遇到了我无法解决的对象类型问题。

为了拆分数据,我尝试了以下操作:

java.math.BigDecimal

工作原理会导致 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

但是,此转换不适用于 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

但这会导致以下错误:“ m [1,]中的错误:维数不正确”

然后我尝试了:

sfpolys.split <- sfpolys.split %>% st_cast("MULTIPOLYGON")

但这提供了一个sfpolys.split <- sfpolys.split %>% st_collection_extract(type="POLYGON") 对象,我无法弄清楚如何正确地将其分组为POLYGON

有人知道是进行这种拆分和转移的更好方法,还是从MULTIPOLYGONGEOMETRYCOLLECTION的简单方法?

这是我想要的结果:

enter image description here

1 个答案:

答案 0 :(得分:0)

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

幸运的是,您的每个GEOMETRYCOLLECTION几何都是多边形,所以我们可以将它们很好地包装成MULTIPOLYGONS

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

然后创建一个证监会

sfc_mp <- sf::st_sfc( mp )

并将其附加到您的对象

sfpolys.split$mp <- sfc_mp
sfpolys.split <- sf::st_set_geometry( sfpolys.split, sfc_mp )

这是一个检查格陵兰岛已被分割的阴谋。我在每个单独的多边形周围添加了白色边框

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

其余的绘图代码不可复制,因此我留给您整理。