[R-sig-Geo] Helping with write a function. Merging shape files?

Zia Ahmed zua3 at cornell.edu
Thu Jan 21 03:40:56 CET 2010


Hi Matt,

Your  code  work perfectly. As a test run, I am able to merge lower 48 
states and create a polygon of Con. USA when  all files are in one  
folder.  But  SSURGO data  organized like  following way (not exactly)
state_name (wd)/
     state_001 (subfolder)/spatial/several shape files (a_shape001.shp, 
*poly_shape001.shp,* l_shape001.shp)
     state_003 (subfolder)/spatial/several shape files (a_shape003.shp, 
*poly_shape003.shp*,  l_shape003.shp)
     state_005 (subfolder)/spatial/several shape files (a_shape005.shp, 
*poly_shape005.shp*,  l_shape005.shp)
---------
     state_065 (subfolder)/spatial/several shape files (a_shape065.shp, 
*poly_shape065.shp*,  l_shape065.shp)

like this.

I like to select one shape file (suppose *poly_shape-----.shp*)   from 
each  of sub folder of  my working directory and merge them together. Is 
there any way to do this in a loop?
Thanks again
Zia

Matt Beard wrote:
> Zia,
>
> The error you received was 'invalid class "SpatialPolygons" object: 
> non-unique Polygons ID slot values'.
> Renaming the Polygons IDs so that they are unique should fix your problem.
>
> The following code along with some test shapefiles I used are attached.
>
> library(rgdal)
> setwd("C:/test")
>
> # obtain shapefiles in current directory
> files <- list.files(pattern = "shp")
>
> # get polygons from first file
> data.first <- readOGR(files[1], gsub(".shp","",files[1]))
> polygons <- slot(data.first, "polygons")
>
> # add polygons from remaining files
> for (i in 2:length(files)) {
>    data.temp <- readOGR(files[i], gsub(".shp","",files[i]))
>    polygons <- c(slot(data.temp, "polygons"),polygons)
> }
>
> # rename IDs of Polygons
> for (i in 1:length(polygons)) {
>    slot(polygons[[i]], "ID") <- paste(i)
> }
>
> # ain't that spatial
> spatialPolygons <- SpatialPolygons(polygons)
> spdf <- SpatialPolygonsDataFrame(spatialPolygons, 
> data.frame(fakeData=1:length(polygons)))
>
> # output combined results
> plot(spatialPolygons)
> writeOGR(spdf, dsn="C:/test/combined.shp", layer="combined", 
> driver="ESRI Shapefile")
>
> # end of code
>
> My test shapefiles had very different attribute tables, so I didn't 
> bother combining the data tables.
> However, the code above should at least show you that your method can 
> work.
>
> I found it interesting that when I combined the polygons in the 
> opposite order:
> polygons <- c(polygons,slot(data.temp, "polygons"))
>
> the SoutheasternStates polygons completely covered up the Florida 
> polygons in QGis, but
> the Florida polygons showed up when plotting in R:
> plot(spatialPolygons)
>
> Does the R 'plot' function order the polygons before displaying them? 
> Is it possible to view the code
> for a function like plot(SpatialPolygons)?
>
> Matt
>
>
>
>
>
>
>
>
>
>
> On Wed, Jan 20, 2010 at 4:14 PM, Zia Ahmed <zua3 at cornell.edu 
> <mailto:zua3 at cornell.edu>> wrote:
>
>     Thanks! I am trying to write a function to merge or combine
>     several shape files.
>
>     First I try to use following function when all shape files in one
>     folder. It showed error.
>
>     setwd("E:/Zia/SURRGO_Data/SSURGO_RAW_DATA/Test1")
>     library(rgdal)
>     ## obtain shapefile names in current directory
>     fs <- list.files(pattern = "shp")
>      ## read the first one
>      d <- readOGR(fs[1], gsub(".shp", "", fs[1]))
>      for (i in 2:length(fs)) {
>      d.tmp <- readOGR(fs[i], gsub(".shp", "", fs[i]))
>      }
>      d <- rbind(d, d.tmp)
>     >  d <- rbind(d, d.tmp)
>     Error in validObject(.Object) :
>     invalid class "SpatialPolygons" object: non-unique Polygons ID
>     slot values
>
>
>     Then I am trying to use following code, but it did  not work. it 
>     _created a empty layer. _I think I did something wrong.  Any idea,
>
>     # Code for similar file name (shape.shp)
>     setwd("E:/Zia/SURRGO_Data/SSURGO_RAW_DATA/Testf")
>     library(rgdal)
>
>     files <- list.files(pattern = "shp")  # get all the names in the
>     directory
>     files <- files[file.info <http://file.info>(files)$isdir]  # only
>     keep the directories
>
>     layer<- file('layer.shp')  # output file
>     for (Dir in files){
>         input <- readOGR(file.path(Dir, "shape.shp")) 
>         rbind(input, layer)  
>     }
>     close(layer)
>
>     I have a situations  like   all shape files are different names
>     (like...001.shp, ...003.shp, ....005.shp  so on ) and were saved
>     in different folders (like fn001, fn003, fn005....... If someone
>     helps me to write correct code  for solving this it will be great.
>
>     Zia 
>



More information about the R-sig-Geo mailing list