2016-02-14 1 views
1

Я пытаюсь прочитать в json-файле, который содержит полилинии в R для построения в листовке или ggmap. Проблема в том, что я новичок в json в R и, похоже, не понимаю. Я уверен, что файл находится в формате geojson.Чтение неисправностей в файле geojson/json в R для построения на карте

Файл можно найти по адресу: http://datasets.antwerpen.be/v4/gis/statistischesector.json

Я пробовал:

library(rgdal) 
library(jsonlite) 
library(leaflet) 

geojson <- readLines("statistischesector.json", warn = FALSE) %>% 
    paste(collapse = "\n") %>% 
    fromJSON(simplifyVector = FALSE) 

Это на самом деле читает в файле, но это, кажется, в неправильном формате для дальнейшей обработки.

В качестве альтернативы:

readOGR(dsn="~/statistischesector.json", layer="OGRGeoJSON") 

Возвращает:

Error in ogrInfo(dsn = dsn, layer = layer, encoding = encoding, use_iconv = use_iconv, : 
    Cannot open data source 

Любая помощь приветствуется!

+0

Можете ли вы доказать, что путь является правильным? –

+0

Я сократил путь в примере для удобочитаемости. Когда я делаю: путь <- "C: //users//jbo//Dropbox//R_scripts//GO//statistischesector.json" File.Exists (путь) возвращает TRUE, # Эта readOGR (dsn = path, layer = "OGRGeoJSON") #this возвращает ошибку, описанную выше –

+0

Мое предположение: я должен сделать какое-то преобразование в файле после того, как прочитал его с помощью функции readLines. –

ответ

3

Вот один из способов

library("jsonlite") 
library("leaflet") 
x <- jsonlite::fromJSON("http://datasets.antwerpen.be/v4/gis/statistischesector.json", FALSE) 

geoms <- lapply(x$data, function(z) { 
    dat <- tryCatch(jsonlite::fromJSON(z$geometry, FALSE), error = function(e) e) 
    if (!inherits(dat, "error")) { 
    list(type = "FeatureCollection", 
     features = list(
      list(type = "Feature", properties = list(), geometry = dat) 
     )) 
    } 
}) 

leaflet() %>% 
    addTiles() %>% 
    addGeoJSON(geojson = geoms[1]) %>% 
    setView(
    lng = mean(vapply(geoms[1][[1]]$features[[1]]$geometry$coordinates[[1]], "[[", 1, 1)), 
    lat = mean(vapply(geoms[1][[1]]$features[[1]]$geometry$coordinates[[1]], "[[", 1, 2)), 
    zoom = 12) 

enter image description here

leaflet::addGeoJSON действительно хотите определенный формат. Например, строки geojson являются точными на http://geojsonlint.com/, но их необходимо настроить для работы с leaflet. Кроме того, существует по крайней мере одна строка, которая была уродливы, поэтому я добавил tryCatch пропустить эти

все многоугольники

gg <- list(type = "FeatureCollection", 
      features = 
      Filter(Negate(is.null), lapply(x$data, function(z) { 
       dat <- tryCatch(jsonlite::fromJSON(z$geometry, FALSE), error = function(e) e) 
       if (!inherits(dat, "error")) { 
       list(type = "Feature", 
         properties = list(), 
         geometry = dat) 
       } else { 
       NULL 
       } 
      })) 
) 

leaflet() %>% 
    addTiles() %>% 
    addGeoJSON(geojson = gg) %>% 
    setView(lng = 4.5, lat = 51.3, zoom = 10) 

enter image description here

+0

Очень приятно и спасибо за очистку формата! – ekstroem

+0

Спасибо, Sckott! Можно ли сразу построить все полилинии? Я заметил, что вы можете создавать разные теги в своем текущем коде, увеличивая индекс сразу после «геометров». –

+1

yep, wil редактировать пост выше – sckott

Смежные вопросы