如何在 R 中加载多功能 geojson 文件的*部分*?
How to load *part* of a multifeature geojson file in R?
我有一个 FeatureCollection
的 geojson,它包含 2 种地理数据类型:LineString
和 waypoint
- 查看原始文件 here - this is how it looks on GitHub:
我只想加载 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)
除了对任何 R 用户来说显而易见的是,这是一种非常笨拙且效率低下的方法,涉及太多的代码行和不必要的读写硬盘。一定有别的办法!
我看过的选项
上下文
我正在为可持续交通规划创建一个包,stplanr. A function to find cycling routes (like in the image below) needs to load in the FeatureCollection geojson data from the CycleStreets.net api。
我不知道这在 LeafletR 中是否可行,但 Leaflet 的 L.GeoJSON
层有一个 filter
方法可以根据特征具有的属性呈现(或不呈现)集合的特征.一些代码:
L.geoJson(geojson, {
'filter': function (feature) {
return feature.geometry.type === 'LineString'
}
});
使用 jsonlite 直接从 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")
我有一个 FeatureCollection
的 geojson,它包含 2 种地理数据类型:LineString
和 waypoint
- 查看原始文件 here - this is how it looks on GitHub:
我只想加载 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)
除了对任何 R 用户来说显而易见的是,这是一种非常笨拙且效率低下的方法,涉及太多的代码行和不必要的读写硬盘。一定有别的办法!
我看过的选项
上下文
我正在为可持续交通规划创建一个包,stplanr. A function to find cycling routes (like in the image below) needs to load in the FeatureCollection geojson data from the CycleStreets.net api。
我不知道这在 LeafletR 中是否可行,但 Leaflet 的 L.GeoJSON
层有一个 filter
方法可以根据特征具有的属性呈现(或不呈现)集合的特征.一些代码:
L.geoJson(geojson, {
'filter': function (feature) {
return feature.geometry.type === 'LineString'
}
});
使用 jsonlite 直接从 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")