Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/SymbolixAU/geojsonsf
Conversion between sf and geojson
https://github.com/SymbolixAU/geojsonsf
geojson geospatial gis r rstats simplefeature well-known-text
Last synced: 13 days ago
JSON representation
Conversion between sf and geojson
- Host: GitHub
- URL: https://github.com/SymbolixAU/geojsonsf
- Owner: SymbolixAU
- License: other
- Created: 2018-03-28T01:14:20.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2024-07-30T05:06:23.000Z (3 months ago)
- Last Synced: 2024-09-30T11:48:22.213Z (about 1 month ago)
- Topics: geojson, geospatial, gis, r, rstats, simplefeature, well-known-text
- Language: R
- Size: 11.2 MB
- Stars: 81
- Watchers: 6
- Forks: 7
- Open Issues: 8
-
Metadata Files:
- Readme: README.Rmd
- License: LICENSE
Awesome Lists containing this project
- jimsghstars - SymbolixAU/geojsonsf - Conversion between sf and geojson (R)
README
---
title: geojsonsf
output: github_document
always_allow_html: yes
---```{r setup, include = FALSE}
knitr::opts_chunk$set(
collapse = TRUE,
comment = "# ",
fig.path = "man/figures/README-",
out.width = "100%"
)
```[![CRAN_Status_Badge](http://www.r-pkg.org/badges/version/geojsonsf)](https://CRAN.R-project.org/package=geojsonsf)
![downloads](http://cranlogs.r-pkg.org/badges/grand-total/geojsonsf)
[![CRAN RStudio mirror downloads](http://cranlogs.r-pkg.org/badges/geojsonsf)](https://CRAN.R-project.org/package=geojsonsf)
[![Github Stars](https://img.shields.io/github/stars/SymbolixAU/geojsonsf.svg?style=social&label=Github)](https://github.com/SymbolixAU/geojsonsf)
[![R build status](https://github.com/symbolixau/geojsonsf/workflows/R-CMD-check/badge.svg)](https://github.com/symbolixau/geojsonsf/actions)
[![Coverage Status](https://codecov.io/github/SymbolixAU/geojsonsf/coverage.svg?branch=master)](https://codecov.io/github/SymbolixAU/geojsonsf?branch=master)--
## geojsonsf
A simple, low-dependency and **fast** converter between GeoJSON and Simple Feature objects in R.
---
**v1.3.2**
Converts
- GeoJSON --> `sf`
- GeoJSON --> `sfc`
- `sf` --> GeoJSON
- `sfc` --> GeoJSON
- GeoJSON --> Well-known text
- data.frame --> GeoJSON (POINT only)As per GeoJSON ([RFC 7946 specification)](https://tools.ietf.org/html/rfc7946#page-11), foreign members are ignored, and nested objects and arrays inside the `properties` object are converted to string/characters.
Also, as per the specification, **CRS**
> The coordinate reference system for all GeoJSON coordinates is a
geographic coordinate reference system, using the World Geodetic
System 1984 (WGS 84) [WGS84] datum, with longitude and latitude units
of decimal degrees. This is equivalent to the coordinate reference
system identified by the Open Geospatial Consortium (OGC) URN
urn:ogc:def:crs:OGC::CRS84From **v1.3.2**, if your coordinates are in a different CRS you can specify the CRS & proj4string values in the `geojson_sf()` and `geojson_sfc()` functions.
## Installation
Install the CRAN version with
```{r, eval = F}
install.packages("geojsonsf")
```To install the development version
```{r gh-installation, eval = FALSE}
# install.packages("devtools")
devtools::install_github("SymbolixAU/geojsonsf")
```## Why did you build it?
To quickly parse between GeoJSON and `sf` objects, and to handle cases not supported by `sf`, e.g. arrays of geometries
```{r, echo=FALSE, warning=FALSE, message=FALSE}
library(geojsonsf)
library(sf) ## Loaded for sf print methods
```## What do you mean, 'cases not supported'
For example, `sf` can't read an array of GeoJSON objects, so I wanted to make this work
```{r}
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
```And going the other way you can also return a vector of GeoJSON
```{r}
js <- sf_geojson( sf, atomise = T )
js
```### What's the benefit of 'atomising'?
It's useful for when you work with geospatial databases and want an individual record for each individual feature.
### What happens if you don't `atomise`?
You get a single GeoJSON object
```{r}
sf_geojson( sf )
```### Can you remove the properites and just return the geometries
Yes. Call `sfc_geojson()` on the `sfc` object.
```{r}
sfc_geojson( sf$geometry )
```### If I have an `sf` object without any properties, why does it 'atomise' by default?
```{r}
sf$id <- NULL
sf_geojson( sf )
```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.
```{r}
sf_geojson(sf, simplify = F)
```### How fast is it?
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
```{r,eval= FALSE}
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 neval
# geojsonsf 709.2268 709.2268 722.0626 722.0626 734.8984 734.8984 2
# sf 1867.6840 1867.6840 1958.7968 1958.7968 2049.9097 2049.9097 2
```