# I want to create a Voronoi diagram while retaining the data in the data frame

We will use st_voronoi() to create a Voronoi diagram.

I have three questions.

Point one.

I understand that the argument to st_voronoi() should be the following data.

■SFC format (an error occurs in SF format)

■MULTIPOINT format(Not in POINT form.) Is this understanding correct?

Point two.

If you run the following code, it will be converted to GEOMETRYCOLLECTION. Is there a way to convert this to MULTIPOINT?

Point three.

The original "nz_height" contains the word "elevation". However, the conversion to SFC format has erased that column. I would like to figure out the elevation of each area of the Voronoi diagram. What kind of processing should I do?

``````library(sf)
library(sp)
library(spData)

print(class(nz))

print(class(nz_height))
plot(st_geometry(nz_height))

#POINT to MULTIPOINT
nz_height_mp <- st_cast(nz_height,"MULTIPOINT")

#sf to sfc
nz_height_mp_sfc <- st_union(nz_height_mp)
print(class(nz_height_mp_sfc))

nz_height_v <-st_voronoi(nz_height_mp_sfc)

print(class(nz_height_v))
plot(st_geometry(nz_height_v),col=0)
``````
• I think everything you need is in the help for st_voronoi - combine point geometries to a single multipoint (not a vector of single-point MULTIPOINT geometries) with `c` (or possibly `st_combine`) and extract geometry then `st_intersects` to match points with polygons. May 18 '20 at 17:27
• Thank you for answering. If possible, I'd like to know the sample code. May 19 '20 at 0:57
• The code is in the help text, in the examples section. It shows how to merge points, do the voronoi, then match the points to the polygons. May 19 '20 at 6:03
• Where can I find help texts? May 19 '20 at 11:41
• `help(st_voronoi)`, or possibly via RStudio's interface if you are using that. May 19 '20 at 13:06

Here's a function that can take an `sf` data frame with `POINT` geometry in each row and produce the polygon geometry in the same order:

``````st_voronoi_point <- function(points){
## points must be POINT geometry
if(!all(st_geometry_type(points) == "POINT")){
stop("Input not  POINT geometries")
}
g = st_combine(st_geometry(points)) # make multipoint
v = st_voronoi(g)
v = st_collection_extract(v)
return(v[unlist(st_intersects(p, v))])
}

p = st_as_sf(data.frame(x=runif(10),y=runif(10),A=letters[1:10]),coords=1:2)
v = st_voronoi_point(p)
``````

`v` is now the polygon geometry vector that matches the order in the source. If you want you can then do:

``````pv = st_set_geometry(p, v)
``````

to make a version of `p` but with the polygons as geometry.