suppressPackageStartupMessages(library(sf)) library(testthat) # "vertical" conversions: # column 1: mp = st_sfc(st_multipoint(matrix(0:3,,2)), st_multipoint(matrix(10:15,,2))) (ls = st_cast(mp, "LINESTRING")) st_cast(ls, "MULTIPOINT") # column 2: mls = st_sfc(st_multilinestring(list(rbind(c(0,0), c(10,0), c(10,10), c(0,10)), rbind(c(5,5),c(5,6), c(6,6), c(6,5)))), st_multilinestring(list(rbind(c(0,0), c(1,0), c(1,1), c(0,1))))) (pol = st_cast(mls, "POLYGON")) st_cast(pol, "MULTILINESTRING") # "horizontal" conversions: (pt = st_cast(mp, "POINT")) (i = attr(pt, "ids")) (xx = st_cast(pt, "MULTIPOINT", rep(seq_along(i), i))) try(yy <- st_cast(pt, "LINESTRING", rep(seq_along(i), i))) #(zz = st_cast(yy, "MULTILINESTRING")) #(zz = st_cast(yy, "POLYGON")) st_cast(mls, "LINESTRING") (g = st_sfc(c(mls, ls))) st_cast(g, "MULTILINESTRING") expect_warning(st_cast(g, "LINESTRING")) st_cast(st_cast(g, "MULTILINESTRING"), "LINESTRING") # will not loose gc = st_sfc(st_geometrycollection( list( st_multilinestring(list(rbind(c(0,0), c(10,0), c(10,10), c(0,10)), rbind(c(5,5),c(5,6), c(6,6), c(6,5)))), st_multilinestring(list(rbind(c(0,0), c(1,0), c(1,1), c(0,1)))), st_point(0:1) ))) try(st_cast(mls, "POINT")) try(st_cast(mls, "MULTIPOINT")) outer = matrix(c(0,0,10,0,10,10,0,10,0,0),ncol=2, byrow=TRUE) hole1 = matrix(c(1,1,1,2,2,2,2,1,1,1),ncol=2, byrow=TRUE) hole2 = matrix(c(5,5,5,6,6,6,6,5,5,5),ncol=2, byrow=TRUE) pol1 = list(outer, hole1, hole2) pol2 = list(outer + 12, hole1 + 12) pol3 = list(outer + 24) mp = list(pol1,pol2,pol3) mp1 = st_multipolygon(mp) s = st_sfc(mp1) x = st_cast(s, "MULTIPOINT") x = st_cast(s, "POINT") expect_warning(st_cast(mp1, "LINESTRING")) expect_warning(st_cast(mp1, "POINT")) mls = mls[[1]] class(mls) #expect_error(st_cast(mls, "POLYGON")) st_cast(mls, "POLYGON") expect_warning(st_cast(mls, "POINT")) p1 = st_polygon(pol1) expect_warning(st_cast(p1, "POINT")) ls = ls[[1]] class(ls) expect_warning(st_cast(ls, "POINT")) mls = st_cast(p1, "MULTILINESTRING") p2 = st_cast(mls, "POLYGON") # st_is: st_is(st_point(0:1), "POINT") sfc = st_sfc(st_point(0:1), st_linestring(matrix(1:6,,2))) st_is(sfc, "POINT") st_is(sfc, "POLYGON") st_is(sfc, "LINESTRING") st_is(st_sf(a = 1:2, sfc), "LINESTRING") st_is(sfc, c("POINT", "LINESTRING")) #1194: wkt <- "MULTICURVE (COMPOUNDCURVE (LINESTRING (-83.62333 35.55244, -83.62328 35.55232, -83.62323 35.55223, -83.62319 35.55216, -83.62312 35.55209, -83.6231 35.55207), CIRCULARSTRING (-83.6231 35.55207, -83.62307 35.55205, -83.62302 35.55204), LINESTRING (-83.62302 35.55204, -83.62299 35.55203, -83.62289 35.55198, -83.62281 35.55189, -83.62271 35.55182)))" g <- st_as_sfc(wkt) g <- st_sf(demo = "test", geom = g, crs = 4326) m = st_cast(g, "MULTILINESTRING") identical(m$geom[[1]], st_cast(g$geom[[1]], "MULTILINESTRING")) st_cast(st_sfc(st_geometrycollection(), st_multipolygon()), 'MULTIPOLYGON') #1961 st_cast(st_sfc(st_geometrycollection(), st_multipolygon(), st_point(0:1)), 'POINT') #1961