R: Cast geometry to another type: either simplify, or cast...

st_cast {sf} | R Documentation

## Cast geometry to another type: either simplify, or cast explicitly

### Description

Cast geometry to another type: either simplify, or cast explicitly

### Usage

    ## S3 method for class 'MULTIPOLYGON'
    st_cast(x, to, ...)

    ## S3 method for class 'MULTILINESTRING'
    st_cast(x, to, ...)

    ## S3 method for class 'MULTIPOINT'
    st_cast(x, to, ...)

    ## S3 method for class 'POLYGON'
    st_cast(x, to, ...)

    ## S3 method for class 'LINESTRING'
    st_cast(x, to, ...)

    ## S3 method for class 'POINT'
    st_cast(x, to, ...)

    ## S3 method for class 'GEOMETRYCOLLECTION'
    st_cast(x, to, ...)

    ## S3 method for class 'CIRCULARSTRING'
    st_cast(x, to, ...)

    ## S3 method for class 'MULTISURFACE'
    st_cast(x, to, ...)

    ## S3 method for class 'COMPOUNDCURVE'
    st_cast(x, to, ...)

    ## S3 method for class 'MULTICURVE'
    st_cast(x, to, ...)

    ## S3 method for class 'CURVE'
    st_cast(x, to, ...)

    st_cast(x, to, ...)

    ## S3 method for class 'sfc'
    st_cast(x, to, ..., ids = seq_along(x), group_or_split = TRUE)

    ## S3 method for class 'sf'
    st_cast(x, to, ..., warn = TRUE, do_split = TRUE)

    ## S3 method for class 'sfc_CIRCULARSTRING'
    st_cast(x, to, ...)

### Arguments

`x` | object of class `sfg`, `sfc` or `sf`
`to` | character; target type, if missing, simplification is tried; when `x` is of type `sfg` (i.e., a single geometry) then `to` needs to be specified.
`...` | ignored
`ids` | integer vector, denoting how geometries should be grouped (default: no grouping)
`group_or_split` | logical; if TRUE, group or split geometries; if FALSE, carry out a 1-1 per-geometry conversion.
`warn` | logical; if `TRUE`, warn if attributes are assigned to sub-geometries
`do_split` | logical; if `TRUE`, allow splitting of geometries in sub-geometries

### Details

the `st_cast` method for `sf` objects can only split geometries, e.g. cast `MULTIPOINT` into multiple `POINT` features. In case of splitting, attributes are repeated and a warning is issued when non-constant attributes are assigned to sub-geometries. To merge feature geometries and attribute values, use aggregate or summarise.

### Value

object of class `to` if successful, or unmodified object if unsuccessful. If information gets lost while type casting, a warning is raised.

In case `to` is missing, `st_cast.sfc` will coerce combinations of "POINT" and "MULTIPOINT", "LINESTRING" and "MULTILINESTRING", "POLYGON" and "MULTIPOLYGON" into their "MULTI..." form, or in case all geometries are "GEOMETRYCOLLECTION" will return a list of all the contents of the "GEOMETRYCOLLECTION" objects, or else do nothing. In case `to` is specified, if `to` is "GEOMETRY", geometries are not converted, else, `st_cast` will try to coerce all elements into `to`; `ids` may be specified to group e.g. "POINT" objects into a "MULTIPOINT", if not specified no grouping takes place. If e.g. a "sfc_MULTIPOINT" is cast to a "sfc_POINT", the objects are split, so no information gets lost, unless `group_or_split` is `FALSE`.

### Examples

    # example(st_read)
    nc = st_read(system.file("shape/nc.shp", package="sf"))
    mpl <- nc$geometry[[4]]
    #st_cast(x) ## error 'argument "to" is missing, with no default'
    cast_all <- function(xg) {
      lapply(c("MULTIPOLYGON", "MULTILINESTRING", "MULTIPOINT", "POLYGON", "LINESTRING", "POINT"),
          function(x) st_cast(xg, x))
    }
    st_sfc(cast_all(mpl))
    ## no closing coordinates should remain for multipoint
    any(duplicated(unclass(st_cast(mpl, "MULTIPOINT"))))  ## should be FALSE
    ## number of duplicated coordinates in the linestrings should equal the number of polygon rings
    ## (... in this case, won't always be true)
    sum(duplicated(do.call(rbind, unclass(st_cast(mpl, "MULTILINESTRING"))))
         ) == sum(unlist(lapply(mpl, length)))  ## should be TRUE

    p1 <- structure(c(0, 1, 3, 2, 1, 0, 0, 0, 2, 4, 4, 0), .Dim = c(6L, 2L))
    p2 <- structure(c(1, 1, 2, 1, 1, 2, 2, 1), .Dim = c(4L, 2L))
    st_polygon(list(p1, p2))
    mls <- st_cast(nc$geometry[[4]], "MULTILINESTRING")
    st_sfc(cast_all(mls))
    mpt <- st_cast(nc$geometry[[4]], "MULTIPOINT")
    st_sfc(cast_all(mpt))
    pl <- st_cast(nc$geometry[[4]], "POLYGON")
    st_sfc(cast_all(pl))
    ls <- st_cast(nc$geometry[[4]], "LINESTRING")
    st_sfc(cast_all(ls))
    pt <- st_cast(nc$geometry[[4]], "POINT")
    ## st_sfc(cast_all(pt))  ## Error: cannot create MULTIPOLYGON from POINT
    st_sfc(lapply(c("POINT", "MULTIPOINT"), function(x) st_cast(pt, x)))
    s = st_multipoint(rbind(c(1,0)))
    st_cast(s, "POINT")

[Package sf version 0.9-7 Index]