Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SpatialPolygons - Creating a set of polygons in R from coordinates

Tags:

r

spatial

sp

rgdal

I am trying to take create a set of polygons from vertex locations, saved in X,Y format.

Here is an example of my data - each row represents the vertices for one polygon. the polygons are squares

square <- rbind(c(255842.4, 4111578, 255862.4, 4111578, 255862.4, 4111558, 
                  255842.4, 4111558, 255842.4, 4111578, 255842.4, 4111578),
                c(257397.0, 4111309, 257417.0, 4111309, 257417.0, 4111289, 
                  257397.0, 4111289, 257397.0, 4111309, 257397.0, 4111309))

ID <- c("SJER1", "SJER2")'

I am using SpatialPolygons, thus my data need to be in a list. so i created a loop to attempt to get my data into a list format from a matrix.

I create a loop following code that I found in some other questions on this site. I broke out each step to try to understand why i am only getting one polygon as the output even through I have 2 sets of points.

for (i in 1:2) {  
  pts <- rbind(c(square[i,1], square[i,2]), c(square[i,3], square[i,4]), 
               c(square[i,5],square[i,6]), c(square[i,7],square[i,8]), 
               c(square[i,9],square[i,10]))
  sp1 <- list(Polygon(pts))
  sp2 <- list(Polygons(sp1,i))
  sp = SpatialPolygons(sp2)  
}
plot(sp)

Can you please help me understand how I adjust the code to write out two polygons instead of just one? And also, how I assign the ID to each polygon given I am using a matrix (square) as my starting dataset and if I assign a character id, it transforms all of my data into a character.

My ultimate goal is two polygons in the SpatialPolygons object, the first with the ID SJER1 and the second with the ID SJER2 stored in the SpatialPolygons object.

Then I will write this out to a shapefile.

like image 938
Leah Wasser Avatar asked Oct 28 '14 23:10

Leah Wasser


People also ask

How do you construct a polygon using coordinates?

For Start X Field and Start Y Field, select the field containing the X coordinates (longitude) and Y coordinates (latitude) of the starting points, respectively. For End X Field and End Y Field, select the field containing the X coordinates (longitude) and Y coordinates (latitude) of the ending points, respectively.

What is a spatial polygon in R?

Spatial polygons are a set of spatially explicit shapes/polygons that represent a geographic location. Spatial polygons are composed of vertices which are a set of a series of x and y coordinates or Spatial points. Spatial polygons can be combined with data frames to create what's called a SpatialPolygonsDataFrame .

How do you change the class of a polygon?

From the PCB panel (in Polygons mode), right-click in the Polygon Classes region then click the Add Class or Properties command depending on whether you are creating a new class or editing an existing one.


1 Answers

There's some information at ?'SpatialPolygons-class', but you more-or-less want to do the following:

polys <- SpatialPolygons(list(
  Polygons(list(Polygon(matrix(square[1, ], ncol=2, byrow=TRUE))), ID[1]),
  Polygons(list(Polygon(matrix(square[2, ], ncol=2, byrow=TRUE))), ID[2])
))

plot(polys)

enter image description here

The basic gist is that you need to create Polygon objects (e.g., from 2-column matrices with x coordinates in the first column and y coordinates in the second). These are combined in lists to create Polygons objects (each of which should have a unique ID). These Polygons objects are combined in a list to create a SpatialPolygons object. You can add a CRS if you like, with the proj4string argument to SpatialPolygons (see ?SpatialPolygons).

To write it out to an ESRI Shapefile, you'll need to convert it to a SpatialPolygonsDataFrame object by combining the polys object we created and some data. We'll just add the IDs as data for lack of anything more interesting.

polys.df <- SpatialPolygonsDataFrame(polys, data.frame(id=ID, row.names=ID))

and then write it out...

writeOGR(polys.df, '.', 'fancysquares', 'ESRI Shapefile')

The second argument ('.') says to write it out to the current working directory.


EDIT

To quickly create a SpatialPolygonsDataFrame when you have many rows describing polygons, you could use the following:

# Example data
square <- t(replicate(50, {
  o <- runif(2)
  c(o, o + c(0, 0.1), o + 0.1, o + c(0.1, 0), o)
}))
ID <- paste0('sq', seq_len(nrow(square)))

# Create SP
polys <- SpatialPolygons(mapply(function(poly, id) {
  xy <- matrix(poly, ncol=2, byrow=TRUE)
  Polygons(list(Polygon(xy)), ID=id)
}, split(square, row(square)), ID))

# Create SPDF
polys.df <- SpatialPolygonsDataFrame(polys, data.frame(id=ID, row.names=ID))

plot(polys.df, col=rainbow(50, alpha=0.5))

enter image description here

like image 97
jbaums Avatar answered Nov 03 '22 01:11

jbaums