geojson
aims to deal only with geojson data, without requiring any of the
sp
/rgdal
/rgeos
stack. That means this package is light weight.
We've defined classes (S3
) following the GeoJSON spec. These
classes sort of overlap with sp
's classes, but not really. There's also some
overlap in GeoJSON classes with Well-Known Text (WKT) classes, but GeoJSON has a
subset of WKT's classes.
Although not ready yet, geoops supports manipulations on the classes defined in this package.
Stable CRAN version
install.packages("geojson")
Dev version
devtools::install_github("ropensci/geojson")
library("geojson")
Essentially a character string with S3 class geojson
attached to make it
easy to perform operations on
x <- "{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[-99.74,32.45]},\"properties\":{}}]}"
as.geojson(x)
#> <geojson>
#> type: FeatureCollection
#> bounding box: 99.74 32.45 99.74 32.45
#> features (n): 1
#> features (geometry / length):
#> Point / 2
x <- '{
"type": "GeometryCollection",
"geometries": [
{
"type": "Point",
"coordinates": [100.0, 0.0]
},
{
"type": "LineString",
"coordinates": [ [101.0, 0.0], [102.0, 1.0] ]
}
]
}'
(y <- geometrycollection(x))
#> <GeometryCollection>
#> geometries (n): 2
#> geometries (geometry / length):
#> Point / 2
#> LineString / 2
get the string
y[[1]]
#> [1] "{\n \"type\": \"GeometryCollection\",\n \"geometries\": [\n {\n \"type\": \"Point\",\n \"coordinates\": [100.0, 0.0]\n },\n {\n \"type\": \"LineString\",\n \"coordinates\": [ [101.0, 0.0], [102.0, 1.0] ]\n }\n ]\n}"
get the type
geo_type(y)
#> [1] "GeometryCollection"
pretty print the geojson
geo_pretty(y)
#> {
#> "type": "GeometryCollection",
#> "geometries": [
#> {
#> "type": "Point",
#> "coordinates": [
#> 100.0,
#> 0.0
#> ]
#> },
#> {
#> "type": "LineString",
#> "coordinates": [
#> [
#> 101.0,
#> 0.0
#> ],
#> [
#> 102.0,
#> 1.0
#> ]
#> ]
#> }
#> ]
#> }
#>
write to disk
geo_write(y, f <- tempfile(fileext = ".geojson"))
jsonlite::fromJSON(f, FALSE)
#> $type
#> [1] "GeometryCollection"
#>
#> $geometries
#> $geometries[[1]]
#> $geometries[[1]]$type
#> [1] "Point"
#>
#> $geometries[[1]]$coordinates
#> $geometries[[1]]$coordinates[[1]]
#> [1] 100
#>
#> $geometries[[1]]$coordinates[[2]]
#> [1] 0
#>
#>
#>
#> $geometries[[2]]
#> $geometries[[2]]$type
#> [1] "LineString"
#>
#> $geometries[[2]]$coordinates
#> $geometries[[2]]$coordinates[[1]]
#> $geometries[[2]]$coordinates[[1]][[1]]
#> [1] 101
#>
#> $geometries[[2]]$coordinates[[1]][[2]]
#> [1] 0
#>
#>
#> $geometries[[2]]$coordinates[[2]]
#> $geometries[[2]]$coordinates[[2]][[1]]
#> [1] 102
#>
#> $geometries[[2]]$coordinates[[2]][[2]]
#> [1] 1
Add properties
x <- '{ "type": "LineString", "coordinates": [ [100.0, 0.0], [101.0, 1.0] ]}'
res <- linestring(x) %>% feature() %>% properties_add(population = 1000)
res
#> {
#> "type": "Feature",
#> "properties": {
#> "population": 1000
#> },
#> "geometry": {
#> "type": "LineString",
#> "coordinates": [
#> [
#> 100,
#> 0
#> ],
#> [
#> 101,
#> 1
#> ]
#> ]
#> }
#> }
Get a property
properties_get(res, property = 'population')
#> 1000
Add crs
crs <- '{
"type": "name",
"properties": {
"name": "urn:ogc:def:crs:OGC:1.3:CRS84"
}
}'
z <- x %>% feature() %>% crs_add(crs)
z
#> {
#> "type": "Feature",
#> "properties": {
#>
#> },
#> "geometry": {
#> "type": "LineString",
#> "coordinates": [
#> [
#> 100,
#> 0
#> ],
#> [
#> 101,
#> 1
#> ]
#> ]
#> },
#> "crs": {
#> "type": "name",
#> "properties": {
#> "name": "urn:ogc:def:crs:OGC:1.3:CRS84"
#> }
#> }
#> }
Get crs
crs_get(z)
#> $type
#> [1] "name"
#>
#> $properties
#> $properties$name
#> [1] "urn:ogc:def:crs:OGC:1.3:CRS84"
Add bbox
tt <- x %>% feature() %>% bbox_add()
tt
#> {
#> "type": "Feature",
#> "properties": {
#>
#> },
#> "geometry": {
#> "type": "LineString",
#> "coordinates": [
#> [
#> 100,
#> 0
#> ],
#> [
#> 101,
#> 1
#> ]
#> ]
#> },
#> "bbox": [
#> 100,
#> 0,
#> 101,
#> 1
#> ]
#> }
Get bbox
bbox_get(tt)
#> [1] 100 0 101 1
x <- '{ "type": "Point", "coordinates": [100.0, 0.0] }'
(pt <- point(x))
#> <Point>
#> coordinates: [100,0]
library("tibble")
data_frame(a = 1:5, b = list(pt))
#> # A tibble: 5 × 2
#> a b
#> <int> <list>
#> 1 1 <S3: geopoint>
#> 2 2 <S3: geopoint>
#> 3 3 <S3: geopoint>
#> 4 4 <S3: geopoint>
#> 5 5 <S3: geopoint>
x <- '{ "type": "MultiLineString",
"coordinates": [ [ [100.0, 0.0], [101.0, 1.0] ], [ [102.0, 2.0], [103.0, 3.0] ] ] }'
(mls <- multilinestring(x))
#> <MultiLineString>
#> no. lines: 2
#> no. nodes / line: 2, 2
#> coordinates: [[[100,0],[101,1]],[[102,2],[103,3]]]
data_frame(a = 1:5, b = list(mls))
#> # A tibble: 5 × 2
#> a b
#> <int> <list>
#> 1 1 <S3: geomultilinestring>
#> 2 2 <S3: geomultilinestring>
#> 3 3 <S3: geomultilinestring>
#> 4 4 <S3: geomultilinestring>
#> 5 5 <S3: geomultilinestring>
data_frame(a = 1:5, b = list(pt), c = list(mls))
#> # A tibble: 5 × 3
#> a b c
#> <int> <list> <list>
#> 1 1 <S3: geopoint> <S3: geomultilinestring>
#> 2 2 <S3: geopoint> <S3: geomultilinestring>
#> 3 3 <S3: geopoint> <S3: geomultilinestring>
#> 4 4 <S3: geopoint> <S3: geomultilinestring>
#> 5 5 <S3: geopoint> <S3: geomultilinestring>
- Please report any issues or bugs.
- License: MIT
- Get citation information for
geojson
in R doingcitation(package = 'geojson')
- Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.