Batch convert .csv files to .shp files in R

。_饼干妹妹 提交于 2019-12-25 06:39:23

问题


I am trying to convert a large number (>500) of text files into shapefiles. I can successfully convert a single .csv into a projected shapefile. And I can get lapply and 'for' loops to work when just loading, cleaning up, and exporting the text files. But the code fails when I add in steps to convert to shapefiles within the loops. Below are two ways I've tried tackling the problem and the associated error messages:

General processing/definitions-

    library(rgdal)
    library(sp)

    crs.geo<-CRS("+proj=utm +zone=14 +ellps=GRS80 +datum=NAD83 +units=m +no_defs ")  #define projection
    coltype=c("character","character","character","numeric","numeric")   #define data types for input .csv (x,y UTM coords are columns 4,5)

    setwd("C:/.../testdata/out")
    all.the.filenames <- list.files(pattern= "\\.csv")  #create list of files to batch process

head(exampledata,2)
       Point            Location                 Time easting northing
1 Trackpoint 14 S 661117 3762441 12/1/2008 5:57:02 AM  661117  3762441
2 Trackpoint 14 S 661182 3762229 12/1/2008 5:58:02 AM  661182  3762229

Batch conversion with a 'for' loop

    names <- substr(all.the.filenames, 1, nchar(all.the.filenames)-4)   #clean up file names

    for(i in names) {
      filepath <- file.path("../out",paste(i,".csv",sep=""))
      assign(i, read.table(filepath, colClasses=coltype, header=TRUE, sep=",", na.strings=c("NA",""))) 
      coordinates(i) <- c(4,5)  #coords in columns 4,5
      proj4string(i) <- crs.geo
      writeOGR(i,"C:/Users/Seth/Documents/testdata/out","*",driver="ESRI Shapefile") }

R returns this error message:

Error in (function (classes, fdef, mtable)  : 
      unable to find an inherited method for function ‘coordinates<-’ for signature ‘"character"’

If I end the 'for' loop after the 'assign' line, it successfully imports all .csv files as separate objects in R. The problem seems to be that function 'coordinates' is not seeing the coords as numeric, and I get the same error message no matter how explicitly I try to define them as such (e.g., coordinates(i) <- c(as.numeric("easting","northing")) Also, these lines of code work successfully when applied to a single .csv file, the problem is when I subset within a loop.

Batch conversion using lapply

files.to.process <- lapply(all.the.filenames, function(x) read.csv(x, colClasses=coltype, header=TRUE))
lapply(files.to.process, function(c) coordinates(c)<-c("easting","northing"))
[[1]]
[1] "easting"  "northing"
[[2]]
[1] "easting"  "northing"
[[3]]
[1] "easting"  "northing"
[[4]]
[1] "easting"  "northing"
[[5]]
[1] "easting"  "northing"

lapply(files.to.process, function(p) proj4string(p) <- crs.geo)

which returns the error message:

Error in (function (classes, fdef, mtable)  : 
  unable to find an inherited method for function ‘proj4string<-’ for signature ‘"data.frame", "CRS"’

#Double-check if function 'coordinates' worked
    class(files.to.process) == "SpatialPoints"
    [1] FALSE

Conclusion/problem

With both approaches the problem seems to be in the 'coordinates' step to make a spatial object. What am I doing wrong in the loops? Thanks much for any help! Seth H.


回答1:


In your first attempt, the object i inside the loop is a character object. So,

coordinates(get(i))

would work better; I don't have a batch of csv files to test it on. In the second attempt using lapply(), I'm not exactly sure what's going on, but

class(files.to.process)

should be "list", so what you want to do is

lapply(files.to.process,class)

and that will tell you if the objects are of class spatialpoints. I'm guessing they are data.frames, and you need one more step in between.



来源:https://stackoverflow.com/questions/32872843/batch-convert-csv-files-to-shp-files-in-r

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!