Converts Between GeoJSON and simple feature objects.
–
A simple, low-dependency and fast converter between GeoJSON and Simple Feature objects in R.
v1.2.1
Converts
sf
sfc
sf
–> GeoJSONsfc
–> GeoJSONAs per GeoJSON (RFC 7946
specification), foreign
members are ignored, and nested objects and arrays inside the
properties
object are converted to string/characters.
Install the CRAN version with
install.packages("geojsonsf")
To install the development version
# install.packages("devtools")devtools::install_github("SymbolixAU/geojsonsf")
To quickly parse between GeoJSON and sf
objects, and to handle cases
not supported by sf
, e.g. arrays of geometries
For example, sf
can’t read an array of GeoJSON objects, so I wanted to
make this work
js <- c('[{"type":"Point","coordinates":[0,0]},{"type":"LineString","coordinates":[[-1,-1],[1,1]]},{"type": "FeatureCollection","features": [{"type": "Feature","properties": {"id":1},"geometry": {"type": "Point", "coordinates": [100.0, 0.0]}}]}]')sf <- geojson_sf( js )sf# Simple feature collection with 3 features and 1 field# geometry type: GEOMETRY# dimension: XY# bbox: xmin: -1 ymin: -1 xmax: 100 ymax: 1# epsg (SRID): 4326# proj4string: +proj=longlat +datum=WGS84 +no_defs# id geometry# 1 NA POINT (0 0)# 2 NA LINESTRING (-1 -1, 1 1)# 3 1 POINT (100 0)
And going the other way you can also return a vector of GeoJSON
js <- sf_geojson( sf, atomise = T )js# {"type":"Feature","properties":{"id":null},"geometry":{"type":"Point","coordinates":[0.0,0.0]}}# {"type":"Feature","properties":{"id":null},"geometry":{"type":"LineString","coordinates":[[-1.0,-1.0],[1.0,1.0]]}}# {"type":"Feature","properties":{"id":1.0},"geometry":{"type":"Point","coordinates":[100.0,0.0]}}
It’s useful for when you work with geospatial databases and want an individual record for each individual feature.
atomise
?You get a single GeoJSON object
sf_geojson( sf )# {"type":"FeatureCollection","features":[{"type":"Feature","properties":{"id":null},"geometry":{"type":"Point","coordinates":[0.0,0.0]}},{"type":"Feature","properties":{"id":null},"geometry":{"type":"LineString","coordinates":[[-1.0,-1.0],[1.0,1.0]]}},{"type":"Feature","properties":{"id":1.0},"geometry":{"type":"Point","coordinates":[100.0,0.0]}}]}
Yes. Call sfc_geojson()
on the sfc
object.
sfc_geojson( sf$geometry )# {"type":"Point","coordinates":[0.0,0.0]}# {"type":"LineString","coordinates":[[-1.0,-1.0],[1.0,1.0]]}# {"type":"Point","coordinates":[100.0,0.0]}
sf
object without any properties, why does it ‘atomise’ by default?sf$id <- NULLsf_geojson( sf )# {"type":"Point","coordinates":[0.0,0.0]}# {"type":"LineString","coordinates":[[-1.0,-1.0],[1.0,1.0]]}# {"type":"Point","coordinates":[100.0,0.0]}
The simplify
argument is TRUE
by default, and it will try and
‘simplify’ the GeoJSON. If there are no properties in the sf
object,
then the GeoJSON won’t have any properties.
However, if you set simplify = FALSE
you’ll get a FeatureCollection
with an empty properties field.
sf_geojson(sf, simplify = F)# {"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"type":"Point","coordinates":[0.0,0.0]}},{"type":"Feature","properties":{},"geometry":{"type":"LineString","coordinates":[[-1.0,-1.0],[1.0,1.0]]}},{"type":"Feature","properties":{},"geometry":{"type":"Point","coordinates":[100.0,0.0]}}]}
This benchmark shows a comparison with library(sf)
for converting a
string of GeoJSON of 3,221 counties in the US in to an sf
object
myurl <- "http://eric.clst.org/assets/wiki/uploads/Stuff/gz_2010_us_050_00_500k.json"geo <- readLines(myurl)geo <- paste0(geo, collapse = "")library(microbenchmark)microbenchmark(geojsonsf = {geojson_sf(geo)},sf = {sf::st_read(geo, quiet = T)},times = 2)# Unit: milliseconds# expr min lq mean median uq max# geojsonsf 709.2268 709.2268 722.0626 722.0626 734.8984 734.8984# sf 1867.6840 1867.6840 1958.7968 1958.7968 2049.9097 2049.9097# neval# 2# 2
I’ve written a lot of tests to try and capture all eventualities. But if you find a mistake please let me know.
Here’s a quick visual check to see the output of the above benchmark data
library(googleway)set_key("GOOGLE_MAP_KEY")gsf <- geojson_sf(geo)google_map() %>%add_polygons(gsf[!gsf$STATE %in% c("02","15","72"), ],fill_colour = "CENSUSAREA",stroke_weight = 0)
sf <- sf::st_read(geo, quiet = T)plot(st_geometry(sf[!sf$STATE %in% c("02", "15", "72"), ]))
digits
argument for rounding coordinates'{"type":"FeatureCollection","features":[]}'
example Issue 58df_geojson()
converts data.frame to GeoJSON POINTssf_geojson()
and sfc_geojson()
output "json" class objectsnull
objects / geometries issue 36Date
and POSIX
objects handled issue 32simplify
argument for geojson_sf()
to keep FeatureCollection
s when converting sf
without propertiessf_geojson()
performance improvments using jsonify
sf_geojson()
and sfc_geojson()
to convert from sf
to GeoJSONgeojson_sf()
and geojson_sfc()
can now read from a url or filegeojson_sf()
convert GeoJSON to sf
objectgeojson_sfc()
convert GeoJSON to sfc
objectgeojson_wkt()
convert GeoJSON to data.frame
with a Well-known text column