2016-02-14 1 views
1

J'essaie de lire dans un fichier json contenant des polylignes dans R pour tracer dans leaflet ou ggmap. Le problème est que je suis nouveau à json dans R et ne peux pas sembler faire les choses correctement. Je suis sûr que le fichier est au format geojson.Problème lors de la lecture du fichier geojson/json dans R pour tracer sur la carte

Le fichier peut être trouvé à: http://datasets.antwerpen.be/v4/gis/statistischesector.json

J'ai essayé:

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

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

Ce lit fait dans le fichier, mais il semble être dans un format incorrect pour un traitement ultérieur.

Autre possibilité:

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

Retours:

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

Toute aide est la bienvenue!

+0

Pouvez-vous prouver que le chemin est correct? –

+0

J'ai raccourci le chemin dans l'exemple pour la lisibilité. Quand je fais: chemin <- "C: //users//jbo//Dropbox//R_scripts//GO//statistischesector.json" File.Exists (chemin) #Ceci retourne TRUE readOGR (dsn = path, layer = "OGRGeoJSON") # ceci renvoie l'erreur décrite ci-dessus –

+0

Je suppose que je dois faire une sorte de transformation sur le fichier après l'avoir lu avec la fonction readLines .. –

Répondre

3

est ici une façon

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 ne veut en effet un format particulier. Par exemple, les chaînes de geojson sont bien sur http://geojsonlint.com/ mais ils doivent être modifiés pour fonctionner avec leaflet. En outre, il y avait au moins une chaîne qui était mal formé, donc j'ajouté un tryCatch sauter les

tous les polygones

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

Très gentil et merci pour éclaircir le format! – ekstroem

+0

Merci Sckott! Est-il possible de tracer toutes les polylignes à la fois? J'ai remarqué que vous pouvez tracer différents codes dans votre code actuel en augmentant l'index juste après 'geoms'. –

+1

Oui, wil éditer le message ci-dessus – sckott