test_that("Writing SF objects", { skip_if_not_installed("sf") compare_to_geojson_obj <- function(sf_obj){ sf_as_dataframe <- fromJSON(toJSON(sf_obj, digits = 8)) sf_as_features <- fromJSON(toJSON(sf_obj, sf = 'features', digits = 8)) geojson_string <- toJSON(sf_obj, sf = 'geojson', digits = 8) sf_as_geojson <- parse_json(geojson_string) tmp <- file.path(tempdir(), 'sfdata.geojson') on.exit(unlink(tmp)) sf::write_sf(sf_obj, tmp, driver = 'GeoJSON') geojson <- fromJSON(tmp) geojson_exact <- read_json(tmp) geojson_exact$crs = NULL # We don't add CRS because it was deprecated in geojson spec expect_equal(sf_as_dataframe[[attr(sf_obj, 'sf_column')]], geojson$features$geometry) expect_equal(sf_as_features, geojson$features) expect_equal(sf_as_geojson, geojson_exact) } compare_to_geojson_file <- function(file){ sf_obj <- sf::st_read(file, quiet = TRUE) compare_to_geojson_obj(sf_obj) compare_to_geojson_obj(sf_obj[1,]) compare_to_geojson_obj(sf_obj[0,]) } # Test with some standard data compare_to_geojson_file(system.file("shape/storms_xyz.shp", package = "sf")) compare_to_geojson_file(system.file("shape/nc.shp", package = "sf")) #compare_to_geojson_file(system.file("examples", "us_states.topojson", package = "geojsonio")) # Test special types, from ?st examples outer = matrix(c(0,0,10,0,10,10,0,10,0,0.0), ncol=2, byrow=TRUE) hole1 = matrix(c(1,1,1,2,2,2,2,1,1,1.0), ncol=2, byrow=TRUE) hole2 = matrix(c(5,5,5,6,6,6,6,5,5,5.0), ncol=2, byrow=TRUE) pts = list(outer, hole1, hole2) ml1 = sf::st_multilinestring(pts) pl1 = sf::st_polygon(pts) pol1 = list(outer, hole1, hole2) pol2 = list(outer + 12, hole1 + 12) pol3 = list(outer + 24) mpl1 = sf::st_multipolygon(list(pol1,pol2,pol3)) p1 = sf::st_point(as.double(1:2)) mp1 = sf::st_multipoint(matrix(as.double(1:10), ncol = 2)) ls1 = sf::st_linestring(matrix(as.double(1:10), ncol = 2)) gcol = sf::st_geometrycollection(list(p1, ls1, pl1, mp1)) geometry = sf::st_sfc( p1, mp1, ls1, ml1, pl1, mpl1, gcol ) sf_obj <- sf::st_sf(geoms = geometry) compare_to_geojson_obj(sf_obj) # One very strict test geojson_string <- toJSON(sf_obj, sf = 'geojson', always_decimal = TRUE, digits = 8) tmp <- file.path(tempdir(), 'sfdata.geojson') on.exit(unlink(tmp)) sf::write_sf(sf_obj, tmp, driver = 'GeoJSON') expect_equal(minify(geojson_string), minify(readLines(tmp))) })