Снятие скобок [] с концов геойсона в R - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь импортировать геоджон в R как пространственный объект (т. Е. Sp) из веб-службы USGS (streamstats), и у меня возникают проблемы с переводом его в правильный формат для 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")

Возвращает функцию геоджона плюс кучу других вещей, которые мне не нужны.Я могу выбрать только тот кадр данных, который мне нужен, и записать его с помощью:

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

[{"type": "FeatureCollection", ... куча других вещей}]

ЕслиЯ вручную удаляю скобки «[]» на каждом конце файла json. Затем я могу импортировать его как пространственный объект с помощью:

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

В противном случае я получаю эту ошибку:

Ошибка в rgdal :: ogrListLayers (входная): невозможно открыть источник данных

Есть ли способ снять скобки на каждом конце?Может быть, есть даже более простое решение, которое мне не хватает, где я выбираю необходимый фрейм данных.

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

geojsonio keeper ...

Таким образом, в rgdal::readOGR произошло изменение, когда любая строка геоджона, длина которой превышает допустимый путь к файлу, усекается и, следовательно, не читается.См. 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 без предварительной записи на диск

0 голосов
/ 09 мая 2018

Другой geojsonio автор здесь ...

Я не думаю, что это проблема с какой-либо из библиотек / пакетов (geojsonio, rgdal и т. Д.), Но тот факт, что квадратные скобки делают его неподходящим объектом geojson согласно спецификации (квадратные скобки) обозначим массив).

Этот URL-адрес возвращает объект json, который содержит массив (вызывающе называемый featurecollection), который затем содержит два объекта, каждый из которых содержит name и особенность, и каждая особенность является правильной geojson FeatureCollection. Те 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)

Создано в 2018-05-09 пакетом Представить (v0.2.0).

0 голосов
/ 08 мая 2018

В этом ответе предполагалось, что сохранение файла было необходимым шагом (например, чтобы прочитать его с помощью другого 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')

Надеюсь, это поможет:)

...