从 R 中的 geojson 末尾删除方括号 []

Removing brackets [] from ends of geojson in R

我正在尝试从 USGS 网络服务 (streamstats) 将 geojson 作为空间对象(即 sp)导入 R,但无法将其转换为 R 的正确格式。

library(jsonlite)
mydata <- fromJSON("https://streamstats.usgs.gov/streamstatsservices/watershed.geojson?rcode=NY&xlocation=-74.524&ylocation=43.939&crs=4326&includeparameters=false&includeflowtypes=false&includefeatures=true&simplify=true")

这个 returns geojson 中的功能加上一堆我不需要的其他东西。我可以 select 只需要我需要的数据框,然后用:

写出来
tmp <- mydata$featurecollection[2,2]
write_json(tmp, 'test.json')

[{"type": "FeatureCollection", ...一堆其他东西}]

如果我手动删除 json 文件两端的方括号“[]”,然后我可以将其作为空间对象导入:

library(geojsonio)
test <- geojson_read('test.json', method='local', what='sp')

否则我会得到这个错误:

Error in rgdal::ogrListLayers(input) : Cannot open data source

有没有办法去掉两端的括号?也许还有一个更简单的解决方案,我从 select 出所需的数据框的地方遗漏了。

这个答案假设保存文件是一个必要的步骤(例如,用另一个 Rscript 读取它)。这样,你只进行一次缓慢的外部调用,然后你可以只请求你的本地文件来测试,这样就快多了。此外,外部请求可能并不总是可用。

作为解决方法,您可以删除 write_json 命令行并添加此命令行:

stringJson <- toJSON(tmp)
write(substr(stringJson, 2, nchar(stringJson) - 1), file = 'test.json')

另一种方法是使用 rjson 库来编写 json(但要小心,因为两个库都有同名的函数):

library(jsonlite)
library(rjson)
mydata <- jsonlite::fromJSON("https://streamstats.usgs.gov/streamstatsservices/watershed.geojson?rcode=NY&xlocation=-74.524&ylocation=43.939&crs=4326&includeparameters=false&includeflowtypes=false&includefeatures=true&simplify=true")

tmp <- mydata$featurecollection[2,2]
write(rjson::toJSON(tmp), file = 'test.json')

希望对您有所帮助:)

geojsonio 维护者 ...

因此 rgdal::readOGR 发生了变化,任何比有效文件路径长的 geojson 字符串都会被截断,因此不会被读取。参见 https://github.com/ropensci/geojsonio/issues/130

所以我们为 geojsonio::geojson_sp 做了一个解决方法,但没有为 geojsonio::geojson_read

虽然 jqr

可以解决这个问题
library(jqr)
library(geojsonio)
library(sf)
myurl <- "https://streamstats.usgs.gov/streamstatsservices/watershed.geojson?rcode=NY&xlocation=-74.524&ylocation=43.939&crs=4326&includeparameters=false&includeflowtypes=false&includefeatures=true&simplify=true"
jq(url(myurl), ".featurecollection[1]") %>% st_read(quiet = TRUE, stringsAsFactors = FALSE)

其中 jq 让我们无需先写入磁盘即可进入 JSON

这里还有一位 geojsonio 作者...

我认为 libraries/packages(geojsoniorgdal 等)中的任何一个都没有问题,但方括号使它不合适geojson 符合规范的对象(方括号表示数组)。

那个 url returns 一个 json 对象,它包含一个数组(容易混淆地称为 featurecollection),然后包含两个对象,每个对象包含一个 name和一个特征,每个特征都是一个合适的geojsonFeatureCollection。那些 FeatureCollections 是我们想要提取的 - 一个 Point(可能是分水岭的质心?),一个 Polygon 定义分水岭边界。

library(jsonlite)
library(geojsonio)
library(sp)

# Don't simplify the results so that it's easier to pull out the full geojson objects
mydata <- fromJSON("https://streamstats.usgs.gov/streamstatsservices/watershed.geojson?rcode=NY&xlocation=-74.524&ylocation=43.939&crs=4326&includeparameters=false&includeflowtypes=false&includefeatures=true&simplify=true", 
                   simplifyVector = FALSE, simplifyDataFrame = FALSE)

# Extract each geojson object and 'auto_unbox' to remove square brackets from 
# arrays of length 1:
point_geojsonsting <- toJSON(mydata$featurecollection[[1]]$feature, 
                             auto_unbox = TRUE)
poly_geojsonsting <- toJSON(mydata$featurecollection[[2]]$feature, 
                            auto_unbox = TRUE)

# Read directly to sp without writing to disk first:
point_sp <- geojson_sp(point_geojsonsting)
poly_sp <- geojson_sp(poly_geojsonsting)

plot(poly_sp)
plot(point_sp, add = TRUE, col = "red", pch = 21, cex = 5)

reprex package (v0.2.0) 创建于 2018-05-09。