Skip to content

Commit

Permalink
fix #53
Browse files Browse the repository at this point in the history
Signed-off-by: Edzer Pebesma <edzer.pebesma@uni-muenster.de>
  • Loading branch information
edzer committed Nov 7, 2016
1 parent b980801 commit 26439f8
Show file tree
Hide file tree
Showing 8 changed files with 101 additions and 15 deletions.
37 changes: 34 additions & 3 deletions R/read.R
Original file line number Diff line number Diff line change
Expand Up @@ -76,14 +76,16 @@ st_read = function(dsn, layer, ..., options = NULL, quiet = FALSE, iGeomField =
#' layer_options = "OVERWRITE=true")
#' }
#' nc = st_read(system.file("shape/nc.shp", package="sf"), "nc", crs = 4267)
#' st_write(nc, ".", "nc")
#' st_write(nc, "nc.shp")
#' @export
st_write = function(obj, dsn, layer = basename(dsn), driver = "ESRI Shapefile", ..., dataset_options = NULL,
layer_options = NULL, quiet = FALSE, factorsAsCharacter = TRUE) {
st_write = function(obj, dsn, layer = basename(dsn), driver = guess_driver(dsn), ...,
dataset_options = NULL, layer_options = NULL, quiet = FALSE, factorsAsCharacter = TRUE) {

if (inherits(obj, "sfc"))
obj = st_sf(id = 1:length(obj), geom = obj)
stopifnot(inherits(obj, "sf"))
if (missing(dsn))
stop("dsn should specify a data source or filename")
geom = st_geometry(obj)
obj[[attr(obj, "sf_column")]] = NULL
if (factorsAsCharacter)
Expand Down Expand Up @@ -251,3 +253,32 @@ print.sf_layers = function(x, ...) {
st_list = function(dsn, options = character(0), do_count = FALSE) {
CPL_get_layers(dsn, options, do_count)
}

guess_driver = function(dsn) {
ext_map <- matrix (c(
"e00", "AVCE00",
"geojson","GeoJSON",
"gpkg", "GPKG",
"gps", "GPSBabel",
"gtm", "GPSTrackMaker",
"gxt", "Geoconcept",
"map", "WAsP",
"nc", "netCDF",
"osm", "OSM", # NO WRITE
"pbf", "OSM", # NO WRITE
"shp", "ESRI Shapefile"
),
ncol = 2, byrow = TRUE)
drv = ext_map[,2]
names(drv) = ext_map[,1]
drv = drv[tolower(tools::file_ext(dsn))]
if (is.na(drv))
stop("no driver specified, cannot guess driver from dsn extension")
drivers = st_drivers()
i = match(drv, drivers$name)
if (is.na(i))
stop(paste("guess_driver:", drv, "not available in supported drivers, see `st_drivers()'"))
if (! drivers[i, "write"])
warning(paste("guess_driver", drv, "is available but reports it will not allow writing"))
drv
}
4 changes: 2 additions & 2 deletions man/st_write.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions src/gdal_write.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,8 @@ void CPL_write_ogr(Rcpp::List obj, Rcpp::CharacterVector dsn, Rcpp::CharacterVec
Rcpp::Rcout << driver[0] << " driver not available." << std::endl;
throw std::invalid_argument("Driver not available.\n");
} else if (! quiet)
Rcpp::Rcout << "Writing layer " << layer[0] << " to data source " << dsn[0] <<
" using driver " << driver << std::endl;
Rcpp::Rcout << "Writing layer `" << layer[0] << "' to data source `" << dsn[0] <<
"' using driver `" << driver[0] << "'" << std::endl;

// open data set:
std::vector <char *> options = create_options(dco, quiet);
Expand Down
4 changes: 2 additions & 2 deletions tests/gdal_geom.Rout.save
Original file line number Diff line number Diff line change
Expand Up @@ -330,7 +330,7 @@ LINESTRING(1 3, 2 4)
[1] 1
>
> st_length(st_polygon(list(rbind(c(0,0), c(1,0), c(1,1), c(0,1), c(0,0)))))
[1] 0
[1] NA
>
> st_area(st_multilinestring(list(rbind(c(0,0),c(0,1)))))
[1] 0
Expand All @@ -348,4 +348,4 @@ MULTILINESTRING((0 0, 0.5 0.5), (0.5 0.5, 1 1),...
>
> proc.time()
user system elapsed
0.672 0.276 0.649
0.680 0.276 0.648
12 changes: 12 additions & 0 deletions tests/read.R
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,15 @@ class(st_geometry(tst)[[1]])
tst = st_read(system.file("shape/storms_xyzm_feature.shp", package="sf"), quiet = TRUE)
class(st_geometry(tst))
class(st_geometry(tst)[[1]])

sf:::guess_driver("nc.e00")
sf:::guess_driver("nc.shp")
sf:::guess_driver("nc.gxt")
sf:::guess_driver("nc.gps")
sf:::guess_driver("nc.gtm")
sf:::guess_driver("nc.nc")
sf:::guess_driver("nc.map")
try(sf:::guess_driver("nc.sh"))
try(sf:::guess_driver("nc.osm"))
try(sf:::guess_driver("nc.pbf"))
try(sf:::guess_driver("nc"))
45 changes: 44 additions & 1 deletion tests/read.Rout.save
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,49 @@ proj4string: +proj=longlat +datum=NAD27 +no_defs
> class(st_geometry(tst)[[1]])
[1] "XYM" "LINESTRING" "sfg"
>
> sf:::guess_driver("nc.e00")
e00
"AVCE00"
Warning message:
In sf:::guess_driver("nc.e00") :
guess_driver AVCE00 is available but reports it will not allow writing
> sf:::guess_driver("nc.shp")
shp
"ESRI Shapefile"
> sf:::guess_driver("nc.gxt")
gxt
"Geoconcept"
> sf:::guess_driver("nc.gps")
gps
"GPSBabel"
> sf:::guess_driver("nc.gtm")
gtm
"GPSTrackMaker"
> sf:::guess_driver("nc.nc")
nc
"netCDF"
> sf:::guess_driver("nc.map")
map
"WAsP"
> try(sf:::guess_driver("nc.sh"))
Error in sf:::guess_driver("nc.sh") :
no driver specified, cannot guess driver from dsn extension
> try(sf:::guess_driver("nc.osm"))
osm
"OSM"
Warning message:
In sf:::guess_driver("nc.osm") :
guess_driver OSM is available but reports it will not allow writing
> try(sf:::guess_driver("nc.pbf"))
pbf
"OSM"
Warning message:
In sf:::guess_driver("nc.pbf") :
guess_driver OSM is available but reports it will not allow writing
> try(sf:::guess_driver("nc"))
Error in sf:::guess_driver("nc") :
no driver specified, cannot guess driver from dsn extension
>
> proc.time()
user system elapsed
0.448 0.264 0.404
0.424 0.260 0.402
2 changes: 1 addition & 1 deletion tests/write.R
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ demo(meuse, ask = FALSE, echo = FALSE)
library(sf)
meuse = st_as_sf(meuse)
# write shapefile:
st_write(meuse, ".", "meuse")
st_write(meuse, "meuse.shp")
library(RPostgreSQL)
# -- doesn't work on appveyor:
#cn = dbConnect(PostgreSQL(), dbname = "postgis")
Expand Down
8 changes: 4 additions & 4 deletions tests/write.Rout.save
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

R version 3.3.1 (2016-06-21) -- "Bug in Your Hair"
R version 3.3.2 (2016-10-31) -- "Sincere Pumpkin Patch"
Copyright (C) 2016 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

Expand All @@ -21,8 +21,8 @@ Type 'q()' to quit R.
Linking to GEOS 3.5.0, GDAL 2.1.0
> meuse = st_as_sf(meuse)
> # write shapefile:
> st_write(meuse, ".", "meuse")
Writing layer meuse to data source . using driver "ESRI Shapefile"
> st_write(meuse, "meuse.shp")
Writing layer `meuse.shp' to data source `meuse.shp' using driver `ESRI Shapefile'
features: 155
fields: 12
geometry type: POINT
Expand All @@ -36,4 +36,4 @@ Loading required package: DBI
>
> proc.time()
user system elapsed
0.636 0.304 0.633
0.648 0.312 0.645

0 comments on commit 26439f8

Please sign in to comment.