GeoJSON to TopoJSON and back
Arguments
- x
GeoJSON or TopoJSON as a character string, json, a file path, or url
- object_name
(character) name to give to the TopoJSON object created. Default: "foo"
- quantization
(numeric) quantization parameter, use this to quantize geometry prior to computing topology. Typical values are powers of ten (
1e4
,1e5
, ...), default is0
to not perform quantization. For more information about quantization, see this by Mike Bostock https://stackoverflow.com/questions/18900022/topojson-quantization-vs-simplification/18921214#18921214- ...
for
geo2topo
args passed on tojsonlite::fromJSON()
, and fortopo2geo
args passed on tosf::st_read()
Examples
# geojson to topojson
x <- '{"type": "LineString", "coordinates": [ [100.0, 0.0], [101.0, 1.0] ]}'
z <- geo2topo(x)
jsonlite::prettify(z)
#> {
#> "type": "Topology",
#> "objects": {
#> "foo": {
#> "type": "LineString",
#> "arcs": [
#> 0
#> ]
#> }
#> },
#> "arcs": [
#> [
#> [
#> 100,
#> 0
#> ],
#> [
#> 101,
#> 1
#> ]
#> ]
#> ],
#> "bbox": [
#> 100,
#> 0,
#> 101,
#> 1
#> ]
#> }
#>
if (FALSE) { # \dontrun{
library(leaflet)
leaflet() %>%
addProviderTiles(provider = "Stamen.Terrain") %>%
addTopoJSON(z)
} # }
# geojson to topojson as a list
x <- list(
'{"type": "LineString", "coordinates": [ [100, 0], [101, 1] ]}',
'{"type": "LineString", "coordinates": [ [110, 0], [110, 1] ]}',
'{"type": "LineString", "coordinates": [ [120, 0], [121, 1] ]}'
)
geo2topo(x)
#> [[1]]
#> {"type":"Topology","objects":{"foo":{"type":"LineString","arcs":[0]}},"arcs":[[[100,0],[101,1]]],"bbox":[100,0,101,1]}
#>
#> [[2]]
#> {"type":"Topology","objects":{"foo":{"type":"LineString","arcs":[0]}},"arcs":[[[110,0],[110,1]]],"bbox":[110,0,110,1]}
#>
#> [[3]]
#> {"type":"Topology","objects":{"foo":{"type":"LineString","arcs":[0]}},"arcs":[[[120,0],[121,1]]],"bbox":[120,0,121,1]}
#>
# change the object name created
x <- '{"type": "LineString", "coordinates": [ [100.0, 0.0], [101.0, 1.0] ]}'
geo2topo(x, object_name = "HelloWorld")
#> {"type":"Topology","objects":{"HelloWorld":{"type":"LineString","arcs":[0]}},"arcs":[[[100,0],[101,1]]],"bbox":[100,0,101,1]}
geo2topo(x, object_name = "4")
#> {"type":"Topology","objects":{"4":{"type":"LineString","arcs":[0]}},"arcs":[[[100,0],[101,1]]],"bbox":[100,0,101,1]}
x <- list(
'{"type": "LineString", "coordinates": [ [100, 0], [101, 1] ]}',
'{"type": "LineString", "coordinates": [ [110, 0], [110, 1] ]}',
'{"type": "LineString", "coordinates": [ [120, 0], [121, 1] ]}'
)
geo2topo(x, "HelloWorld")
#> [[1]]
#> {"type":"Topology","objects":{"HelloWorld":{"type":"LineString","arcs":[0]}},"arcs":[[[100,0],[101,1]]],"bbox":[100,0,101,1]}
#>
#> [[2]]
#> {"type":"Topology","objects":{"HelloWorld":{"type":"LineString","arcs":[0]}},"arcs":[[[110,0],[110,1]]],"bbox":[110,0,110,1]}
#>
#> [[3]]
#> {"type":"Topology","objects":{"HelloWorld":{"type":"LineString","arcs":[0]}},"arcs":[[[120,0],[121,1]]],"bbox":[120,0,121,1]}
#>
geo2topo(x, c("A", "B", "C"))
#> [[1]]
#> {"type":"Topology","objects":{"A":{"type":"LineString","arcs":[0]}},"arcs":[[[100,0],[101,1]]],"bbox":[100,0,101,1]}
#>
#> [[2]]
#> {"type":"Topology","objects":{"B":{"type":"LineString","arcs":[0]}},"arcs":[[[110,0],[110,1]]],"bbox":[110,0,110,1]}
#>
#> [[3]]
#> {"type":"Topology","objects":{"C":{"type":"LineString","arcs":[0]}},"arcs":[[[120,0],[121,1]]],"bbox":[120,0,121,1]}
#>
# topojson to geojson
w <- topo2geo(z)
#> Loading required namespace: stringi
#> Loading required namespace: stringi
#> Loading required namespace: stringi
#> Loading required namespace: stringi
#> Loading required namespace: stringi
#> Loading required namespace: stringi
#> Loading required namespace: stringi
#> Loading required namespace: stringi
#> Loading required namespace: stringi
jsonlite::prettify(w)
#> {
#> "type": "FeatureCollection",
#> "features": [
#> {
#> "type": "Feature",
#> "properties": {
#> "id": "foo"
#> },
#> "geometry": {
#> "type": "LineString",
#> "coordinates": [
#> [
#> 100,
#> 0
#> ],
#> [
#> 101,
#> 1
#> ]
#> ]
#> }
#> }
#> ]
#> }
#>
## larger examples
file <- system.file("examples", "us_states.topojson", package = "geojsonio")
topo2geo(file)
#> Loading required namespace: stringi
#> Loading required namespace: stringi
#> Loading required namespace: stringi
#> Loading required namespace: stringi
#> Loading required namespace: stringi
#> Loading required namespace: stringi
#> Loading required namespace: stringi
#> Loading required namespace: stringi
#> Loading required namespace: stringi
#> <FeatureCollection>
#> type: FeatureCollection
#> no. features: 51
#> features (1st 5): MultiPolygon, MultiPolygon, MultiPolygon, MultiPolygon, MultiPolygon