
R Under development (unstable) (2024-03-19 r86153 ucrt) -- "Unsuffered Consequences"
Copyright (C) 2024 The R Foundation for Statistical Computing
Platform: x86_64-w64-mingw32/x64

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> Sys.setenv(TZ="UTC")
> suppressPackageStartupMessages(library(sf))
> if ("GPKG" %in% st_drivers()$name) {
+ 	tst = st_read(system.file("gpkg/nc.gpkg", package="sf"), "nc.gpkg", crs = 4267, quiet = TRUE)
+ 	tst = st_read(system.file("gpkg/nc.gpkg", package="sf"), quiet = TRUE) # default layer name
+ }
> 
> tst = st_read(system.file("shape/nc.shp", package="sf"), quiet = TRUE) # no layer specified
> 
> # data from https://github.com/edzer/sfr/issues/6
> tst = st_read(system.file("shape/storms_xyz.shp", package="sf"), quiet = TRUE)
> class(st_geometry(tst))
[1] "sfc_LINESTRING" "sfc"           
> class(st_geometry(tst)[[1]])
[1] "XYZ"        "LINESTRING" "sfg"       
> tst = st_read(system.file("shape/storms_xyzm.shp", package="sf"), quiet = TRUE)
> class(st_geometry(tst))
[1] "sfc_LINESTRING" "sfc"           
> class(st_geometry(tst)[[1]])
[1] "XYM"        "LINESTRING" "sfg"       
> tst = st_read(system.file("shape/storms_xyz_feature.shp", package="sf"), quiet = TRUE)
> class(st_geometry(tst))
[1] "sfc_LINESTRING" "sfc"           
> class(st_geometry(tst)[[1]])
[1] "XYZ"        "LINESTRING" "sfg"       
> tst = st_read(system.file("shape/storms_xyzm_feature.shp", package="sf"), quiet = TRUE)
> class(st_geometry(tst))
[1] "sfc_LINESTRING" "sfc"           
> class(st_geometry(tst)[[1]])
[1] "XYM"        "LINESTRING" "sfg"       
> 
> if ("GPKG" %in% st_drivers()$name) { # read Int64
+     print(st_read(system.file("gpkg/tl.gpkg", package="sf"), quiet = TRUE)$AWATER)
+     print(st_read(system.file("gpkg/tl.gpkg", package="sf"), quiet = TRUE, int64_as_string = TRUE)$AWATER)
+ }
[1] 1028678842
[1] "1028678842"
> 
> # see https://github.com/edzer/sfr/issues/45 :
> if ("OSM" %in% st_drivers()$name && Sys.info()['sysname'] != "Darwin") {
+ 	osm = system.file("osm/overpass.osm", package="sf")
+ 	osm_l = st_layers(osm)
+ 	osm_lc = suppressWarnings(st_layers(osm, do_count = TRUE))
+ 	osm_r = suppressWarnings(st_read(osm, "multipolygons", quiet = TRUE))
+ }
> 
> # layer opening option:
> st_read(system.file("shape/nc.shp", package="sf"), quiet = TRUE,
+ 	options = c("ADJUST_TYPE=YES", "ENCODING=CPL_ENC_UTF8"))
Simple feature collection with 100 features and 14 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
Geodetic CRS:  NAD27
First 10 features:
    AREA PERIMETER CNTY_ CNTY_ID        NAME  FIPS FIPSNO CRESS_ID BIR74 SID74
1  0.114     1.442  1825    1825        Ashe 37009  37009        5  1091     1
2  0.061     1.231  1827    1827   Alleghany 37005  37005        3   487     0
3  0.143     1.630  1828    1828       Surry 37171  37171       86  3188     5
4  0.070     2.968  1831    1831   Currituck 37053  37053       27   508     1
5  0.153     2.206  1832    1832 Northampton 37131  37131       66  1421     9
6  0.097     1.670  1833    1833    Hertford 37091  37091       46  1452     7
7  0.062     1.547  1834    1834      Camden 37029  37029       15   286     0
8  0.091     1.284  1835    1835       Gates 37073  37073       37   420     0
9  0.118     1.421  1836    1836      Warren 37185  37185       93   968     4
10 0.124     1.428  1837    1837      Stokes 37169  37169       85  1612     1
   NWBIR74 BIR79 SID79 NWBIR79                       geometry
1       10  1364     0      19 MULTIPOLYGON (((-81.47276 3...
2       10   542     3      12 MULTIPOLYGON (((-81.23989 3...
3      208  3616     6     260 MULTIPOLYGON (((-80.45634 3...
4      123   830     2     145 MULTIPOLYGON (((-76.00897 3...
5     1066  1606     3    1197 MULTIPOLYGON (((-77.21767 3...
6      954  1838     5    1237 MULTIPOLYGON (((-76.74506 3...
7      115   350     2     139 MULTIPOLYGON (((-76.00897 3...
8      254   594     2     371 MULTIPOLYGON (((-76.56251 3...
9      748  1190     2     844 MULTIPOLYGON (((-78.30876 3...
10     160  2038     5     176 MULTIPOLYGON (((-80.02567 3...
> 
> x <- st_sf(a = 1:2, geom = st_sfc(st_point(0:1), st_multipoint(matrix(1:4,2,2))))
> 
> try(st_layers("foo")) # cannot open datasource
Cannot open data source foo
Error : Open failed.

> try(st_read("foo")) # cannot open datasource
Error : Cannot open "foo"; The file doesn't seem to exist.
> try(st_read("x.gpkg", "xyz")) # cannot open layer
Error : Cannot open "x.gpkg"; The file doesn't seem to exist.
> try(st_write(c("foo", "bar")))
Error in UseMethod("st_write") : 
  no applicable method for 'st_write' applied to an object of class "character"
> try(st_write(x, c("foo", "bar")))
writing: substituting ENGCRS["Undefined Cartesian SRS with unknown unit"] for missing CRS
Error in guess_driver(dns) : length(dsn) == 1 is not TRUE
> try(st_write(x, "foo", driver = "foo"))
writing: substituting ENGCRS["Undefined Cartesian SRS with unknown unit"] for missing CRS
driver `foo' not available.
Error : Driver not available.

> if (Sys.getenv("USER") == "travis") {
+ 	try(st_write(x, "/x", driver = "ESRI Shapefile"))
+ 	st_write(x, "xxx.gpkg")
+ 	st_write(x, "xxx.gpkg", append = TRUE, quiet = FALSE) # appends to layer
+ 	y <- st_sf(b = 1:2, geom = st_sfc(st_point(0:1), st_multipoint(matrix(1:4,2,2))))
+ 	try(st_write(y, "xxx.gpkg"))
+ }
> 
> geom = st_sfc(st_point(0:1), st_multipoint(matrix(1:4,2,2)))
> st_write(geom, "geom.gpkg")
writing: substituting ENGCRS["Undefined Cartesian SRS with unknown unit"] for missing CRS
Writing layer `geom' to data source `geom.gpkg' using driver `GPKG'
Writing 2 features with 0 fields and geometry type Unknown (any).
> st_write(geom, "geom1.gpkg", layer = "foo")
writing: substituting ENGCRS["Undefined Cartesian SRS with unknown unit"] for missing CRS
Writing layer `foo' to data source `geom1.gpkg' using driver `GPKG'
Writing 2 features with 0 fields and geometry type Unknown (any).
> 
> df <- data.frame(
+     a = c(0, 1, NA, -Inf, Inf),
+     b = c("a", "b", NA, "c", ""),
+     c = c(as.Date("2001-01-01"),
+           as.Date(c(NA, -99, 0, 1), origin = "1970-01-01")),
+     d = c(as.POSIXct("2001-01-01"),
+           as.POSIXct(c(NA, -99, 0, 1), origin = "1970-01-01")),
+     x = 1:5,
+     y = 1:5)
> 
> x  = st_as_sf(df, coords = c("x", "y"))
> 
> if ("GPKG" %in% st_drivers()$name) {
+  st_write(x, "x2.gpkg", quiet = TRUE)
+  y = st_read("x2.gpkg", quiet = TRUE)
+  print(y)
+ }
writing: substituting ENGCRS["Undefined Cartesian SRS with unknown unit"] for missing CRS
Simple feature collection with 5 features and 4 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 1 ymin: 1 xmax: 5 ymax: 5
Projected CRS: Undefined Cartesian SRS with unknown unit
     a    b          c                   d        geom
1    0    a 2001-01-01 2001-01-01 00:00:00 POINT (1 1)
2    1    b       <NA>                <NA> POINT (2 2)
3   NA <NA> 1969-09-24 1969-12-31 23:58:21 POINT (3 3)
4 -Inf    c 1970-01-01 1970-01-01 00:00:00 POINT (4 4)
5  Inf      1970-01-02 1970-01-01 00:00:01 POINT (5 5)
> 
> if ("SQLite" %in% st_drivers()$name && require(RSQLite)) {
+ 	db = system.file("sqlite/meuse.sqlite", package = "sf")
+ 	dbcon <- dbConnect(dbDriver("SQLite"), db)
+ 	m = dbReadTable(dbcon, "meuse.sqlite")
+ 	m$GEOMETRY = st_as_sfc(m$GEOMETRY, spatialite = FALSE) # ISO wkb
+ 	print(st_sf(m), n = 3)
+ 	# or:
+ 	(s = st_read(dbcon, "meuse.sqlite"))[1:3,]
+ 	dbDisconnect(dbcon)
+ 
+ 	db = system.file("sqlite/nc.sqlite", package = "sf")
+ 	dbcon <- dbConnect(dbDriver("SQLite"), db)
+ 	m = dbReadTable(dbcon, "nc.sqlite")
+ 	m$GEOMETRY = st_as_sfc(m$GEOMETRY, spatialite = FALSE) # ISO wkb
+ 	print(st_sf(m), n = 3)
+ 	dbDisconnect(dbcon)
+ 
+ 	db = system.file("sqlite/b.sqlite", package = "sf") # has an INT8 field
+ 	b = st_read(db, quiet = TRUE)
+ 	print(b)
+ 	b = st_read(db, int64_as_string = TRUE, quiet = TRUE)
+ 	print(b)
+ 
+ 	if (.Platform$endian == "little") {
+ 	  db = system.file("sqlite/test3.sqlite", package = "sf")
+ 	  dbcon <- dbConnect(dbDriver("SQLite"), db)
+ 	  m = dbReadTable(dbcon, "HighWays")
+ 	  m$Geometry = st_as_sfc(m$Geometry, spatialite = TRUE) # spatialite wkb
+ 	  print(st_sf(m), n = 1)
+ 	  m = dbReadTable(dbcon, "Towns")
+ 	  m$Geometry = st_as_sfc(m$Geometry, spatialite = TRUE) # spatialite wkb
+ 	  print(st_sf(m), n = 1)
+ 	  m = dbReadTable(dbcon, "Regions")
+ 	  m$Geometry = st_as_sfc(m$Geometry, spatialite = TRUE) # spatialite wkb
+ 	  print(st_sf(m), n = 1)
+ 	}
+ }
Loading required package: RSQLite
Simple feature collection with 155 features and 13 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 178605 ymin: 329714 xmax: 181390 ymax: 333611
CRS:           NA
First 3 features:
  ogc_fid cadmium copper lead zinc  elev       dist   om ffreq soil lime
1       1    11.7     85  299 1022 7.909 0.00135803 13.6     1    1    1
2       2     8.6     81  277 1141 6.983 0.01222430 14.0     1    1    1
3       3     6.5     68  199  640 7.800 0.10302900 13.0     1    1    1
  landuse dist.m              GEOMETRY
1      Ah     50 POINT (181072 333611)
2      Ah     30 POINT (181025 333558)
3      Ah    150 POINT (181165 333537)
Simple feature collection with 100 features and 15 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
CRS:           NA
First 3 features:
  ogc_fid  area perimeter cnty_ cnty_id      name  fips fipsno cress_id bir74
1       1 0.114     1.442  1825    1825      Ashe 37009  37009        5  1091
2       2 0.061     1.231  1827    1827 Alleghany 37005  37005        3   487
3       3 0.143     1.630  1828    1828     Surry 37171  37171       86  3188
  sid74 nwbir74 bir79 sid79 nwbir79                       GEOMETRY
1     1      10  1364     0      19 MULTIPOLYGON (((-81.47276 3...
2     0      10   542     3      12 MULTIPOLYGON (((-81.23989 3...
3     5     208  3616     6     260 MULTIPOLYGON (((-80.45634 3...
Integer64 values larger than 9.0072e+15 lost significance after conversion to double;
use argument int64_as_string = TRUE to import them lossless, as character
Simple feature collection with 1 feature and 2 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 0 ymin: 1 xmax: 0 ymax: 1
CRS:           NA
  a       bigint    GEOMETRY
1 1 4.611686e+18 POINT (0 1)
Simple feature collection with 1 feature and 2 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 0 ymin: 1 xmax: 0 ymax: 1
CRS:           NA
  a              bigint    GEOMETRY
1 1 4611686018427387904 POINT (0 1)
Simple feature collection with 10 features and 2 fields
Geometry type: LINESTRING
Dimension:     XY
Bounding box:  xmin: 645003 ymin: 4822568 xmax: 748805.6 ymax: 4992001
Projected CRS: WGS 84 / UTM zone 32N
First 1 features:
  PK_UID    Name                       Geometry
1      1 Unknown LINESTRING (668540.7 485826...
Simple feature collection with 8101 features and 6 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 319224 ymin: 3934674 xmax: 1308585 ymax: 5214373
Projected CRS: WGS 84 / UTM zone 32N
First 1 features:
  PK_UID    Name Peoples LocalCounc County Region                 Geometry
1      1 Brozolo     435          1      0      0 POINT (427002.8 4996361)
Simple feature collection with 10 features and 2 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 378359.8 ymin: 4198234 xmax: 1211486 ymax: 5036803
Projected CRS: WGS 84 / UTM zone 32N
First 1 features:
  PK_UID   Name                       Geometry
1      1 VENETO MULTIPOLYGON (((752912.3 50...
> 
> csv = system.file("csv/pt.csv", package = "sf")
> identical(st_read(quiet = TRUE, csv, options = "AUTODETECT_TYPE=Yes")$Int64[3], NA_real_)
[1] TRUE
> identical(st_read(quiet = TRUE, csv, int64_as_string = TRUE, stringsAsFactors = FALSE,
+ 	options = "AUTODETECT_TYPE=Yes")$Int64[3], NA_character_)
[1] TRUE
> identical(st_read(quiet = TRUE, csv, options = "AUTODETECT_TYPE=Yes")$Int32[3], NA_integer_)
[1] TRUE
> 
> if ("GML" %in% st_drivers()$name) {
+   gml = system.file("gml/fmi_test.gml", package = "sf")
+   print(dim(st_read(gml, quiet = TRUE, use_stream = FALSE)))
+   gml = system.file("gml/20170930_OB_530964_UKSH.xml.gz", package = "sf")
+   print(dim(st_read(gml, layer = "Parcely", quiet = TRUE, use_stream = FALSE)))
+   print(dim(st_read(gml, layer = "Parcely", int64_as_string=TRUE, quiet = TRUE, use_stream = FALSE)))
+ }
[1] 22 11
[1] 644  25
[1] 644  25
Warning messages:
1: In CPL_read_ogr(dsn, layer, query, as.character(options), quiet,  :
  GDAL Message 1: Field with same name (identifier) already exists in (PointTimeSeriesObservation). Skipping newer ones
2: In CPL_read_ogr(dsn, layer, query, as.character(options), quiet,  :
  GDAL Message 1: Field with same name (name) already exists in (PointTimeSeriesObservation). Skipping newer ones
> 
> # logical:
> if ("GPKG" %in% st_drivers()$name) {
+ 	tst = read_sf(system.file("gpkg/nc.gpkg", package="sf"), quiet = TRUE) # default layer name
+ 	tst$bool = tst$NWBIR79 > 800 # logical
+ 	tst$bool[1:3] = NA
+ 	write_sf(tst, "tst__.gpkg")
+ 	tst2 = read_sf("tst__.gpkg")
+ 	stopifnot(identical(tst$bool, tst2$bool))
+ }
> 
> # spatial filter:
> nc = read_sf(system.file("gpkg/nc.gpkg", package="sf"))
> wkt = st_as_text(st_geometry(nc[1,]))
> wkt
[1] "MULTIPOLYGON (((-81.47276 36.23436, -81.54084 36.27251, -81.56198 36.27359, -81.63306 36.34069, -81.74107 36.39178, -81.69828 36.47178, -81.7028 36.51934, -81.67 36.58965, -81.3453 36.57286, -81.34754 36.53791, -81.32478 36.51368, -81.31332 36.4807, -81.26624 36.43721, -81.26284 36.40504, -81.24069 36.37942, -81.23989 36.36536, -81.26424 36.35241, -81.32899 36.3635, -81.36137 36.35316, -81.36569 36.33905, -81.35413 36.29972, -81.36745 36.2787, -81.40639 36.28505, -81.41233 36.26729, -81.43104 36.26072, -81.45289 36.23959, -81.47276 36.23436)))"
> nc_filtered = read_sf(system.file("gpkg/nc.gpkg", package="sf"), wkt_filter = wkt)
> try(read_sf(system.file("gpkg/nc.gpkg", package="sf"), wkt_filter = "wrong"))
Cannot create geometry from: wrong
Error : wkt parse error.

> nc_filtered$NAME
[1] "Watauga"   "Ashe"      "Wilkes"    "Alleghany"
> 
> proc.time()
   user  system elapsed 
   1.56    0.21    1.73 
