TransWikia.com

Using writeOGR on a list of SpatialPolygons

Geographic Information Systems Asked by canderson156 on April 25, 2021

This question has been asked before, but I find the answer confusing since there are no reproducible examples that link the question and the answer, and the answer doesn’t actually use the writeOGR function.
Use lapply and writeOGR to write multiple shapefiles within a list

I have a list of spatial objects. I want to export all of the using writeOGR. How can I apply this function to the list of spatial objects?

The solution I’ve come up with applies writeOGR to the outer list element, and I suppose I need to apply it to the inner list element, but I don’t know how to do this.

library(GISTools)
library(rgdal)
data(tornados)

torn_list <- list(torn, torn2)
lapply(torn_list, function(x) writeOGR(obj = x, dsn = "tempdir", layer = x, driver = "ESRI Shapefile"))

Error in as.character.default(layer) : 
  no method for coercing this S4 class to a vector

Any suggestions?


To clarify, I do want to do this to a list of shape files that have different coordinate reference systems. I would like to create a different shapefile for every element of the list. I realize now I would need to have some way of making the “layer =” argument for each element of this list as well.

2 Answers

A shapefile can only have one layer, and a layer has to have the same geometry type and the same columns, and the same coordinate system.

If all those conditions are true, you can use rbind to make a larger spatial data frame and write that with writeOGR.

torn and torn2 have different coordinate systems so you can't do this.

You can write multiple layers to a geopackage file. But no, not a shapefile.

Answered by Spacedman on April 25, 2021

you are trying to assign the spatial object itself as the name for the shapefile produced (the layer argument). Below an example that works for me

lapply(torn_list, function(x) writeOGR(obj = x, dsn = "tempdir", layer = as.character(round(runif(1,0,100),0)), driver = "ESRI Shapefile"))

the output will be shapefiles with random numbers. if you want the shapefiles to be named "torn" and "torned2", you will need to play with the layer argument so that lapply yields it in each of its "iterations"

Answered by Bruno Conte Leite on April 25, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP