[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