From b8ff604230ab3e6b484fd406abfaa957476b5d91 Mon Sep 17 00:00:00 2001 From: edzer Date: Tue, 23 Apr 2024 14:15:15 +0200 Subject: [PATCH] have st_layers() return sf_layers,data.frame objects --- NEWS.md | 2 ++ R/read.R | 2 +- src/gdal_read.cpp | 18 ++++++++---------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/NEWS.md b/NEWS.md index a509214ef..a71c43d62 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,7 @@ # version 1.0-17 +* `st_layers()` returns an object of class `c("sf_layers", "data.frame")`, with a dedicated `print` method. + * when `dim` is not `XYZM`, `sf_as_sf.data.frame()` interprets a length 4 `coords` argument to specify the corners of a rectangular polygon; #2357 * `st_interpolate_aw()` gains an `na.rm` argument, for removing features with `NA` attributes before interpolating; #830 diff --git a/R/read.R b/R/read.R index 93a73fdb7..99628f55c 100644 --- a/R/read.R +++ b/R/read.R @@ -700,7 +700,7 @@ st_layers = function(dsn, options = character(0), do_count = FALSE) { Encoding(ret[[1]]) <- "UTF-8" ret[[1]] <- enc2native(ret[[1]]) } - ret + structure(ret, row.names = seq_along(ret[[1]]), class = c("sf_layers", "data.frame")) } guess_driver = function(dsn) { diff --git a/src/gdal_read.cpp b/src/gdal_read.cpp index e2f44c349..a7c42053d 100644 --- a/src/gdal_read.cpp +++ b/src/gdal_read.cpp @@ -182,17 +182,15 @@ Rcpp::List CPL_get_layers(Rcpp::CharacterVector datasource, Rcpp::CharacterVecto feature_count(iLayer) = count_features(poLayer); } - Rcpp::List out(6); - out(0) = names; - out(1) = geomtype; - out(2) = poDS->GetDriverName(); - out(3) = feature_count; - out(4) = field_count; - out(5) = layer_crs; + Rcpp::List ret = Rcpp::List::create( + Rcpp::_["name"] = names, + Rcpp::_["geomtype"] = geomtype, + Rcpp::_["driver"] = poDS->GetDriverName(), + Rcpp::_["features"] = feature_count, + Rcpp::_["fields"] = field_count, + Rcpp::_["crs"] = layer_crs); GDALClose(poDS); // close & destroys data source - out.attr("names") = Rcpp::CharacterVector::create("name", "geomtype", "driver", "features", "fields", "crs"); - out.attr("class") = Rcpp::CharacterVector::create("sf_layers"); - return out; + return ret; } Rcpp::List sf_from_ogrlayer(OGRLayer *poLayer, bool quiet, bool int64_as_string,