如何在R中加载多功能geojson文件的* part *?

时间:2015-03-15 21:07:04

标签: r loading geojson ropensci

我的geojson是FeatureCollection,包含2种地理数据类型:LineStringwaypoint - 请参阅原始文件here - 这就是它的外观在GitHub

the-data

我只想加载LineString,所以这就是我所做的:

library(RCurl)
obj <- getURL("https://raw.githubusercontent.com/Robinlovelace/stplanr/master/inst/extdata/route_data.geojson")
writeLines(obj, "/tmp/obj.geojson")
obj <- readLines("/tmp/obj.geojson")
just_lines <- obj[14:(length(obj) - 28)]
just_lines[1] <- paste0("{",  just_lines[1])
just_lines[length(just_lines)] <- "}"
writeLines(just_lines, "/tmp/just_lines.geojson")

现在我们已经删除了文件开头和结尾的讨厌线条,它是一个很好的GeoJSON文件,我们可以加载和绘制,但是:

library(rgdal)
route <- readOGR("/tmp/just_lines.geojson", layer = "OGRGeoJSON")
plot(route)

line in R

除了对于任何R用户来说,这是一个非常笨拙和低效的方法,这涉及太多的代码行和不必要的读写硬盘,这是显而易见的。必须有另一种方式!

我看过的选项

上下文

我正在为可持续交通规划创建一个包stplanr。需要function来查找自行车路线(如下图所示),需要加载FeatureCollection geojson data中的CycleStreets.net api

flow

2 个答案:

答案 0 :(得分:3)

使用jsonlite direct直接从URL中读取数据:

 obj <- jsonlite::fromJSON("https://raw.githubusercontent.com/Robinlovelace/stplanr/master/inst/extdata/route_data.geojson")

将集合中的第一个对象转换为SpatialLines:

 sl = SpatialLines(list(Lines(list(Line(obj$features[1,]$geometry$coordinates[[1]])),ID=1)))
 plot(sl)

假设该特征是单行字符串。

使用以下属性创建SpatialLinesDataFrame:

 sldf=SpatialLinesDataFrame(sl=sl,data=obj$features[1,]$properties)

也许应该给它一个CRS:

 proj4string(sldf)=CRS("+init=epsg:4326")

答案 1 :(得分:0)

我不知道LeafletR中是否可以这样做但Leaflet的L.GeoJSON图层有一个filter方法,它可以根据特征所具有的属性渲染(或不渲染)一个集合的特征。一些代码:

L.geoJson(geojson, {
  'filter': function (feature) {
    return feature.geometry.type === 'LineString'
  }
});

示例:http://plnkr.co/edit/RXIO0X?p=preview

参考:http://leafletjs.com/reference.html#geojson-filter