在 R 中将调用的 OSM 数据从 SF 转换为 Shapefile 的最佳方法
Best way to convert called OSM data from SF to Shapefile within R
完全不懂R,见谅-
我正在尝试使用 R 创建一些历史 OSM 数据,这些数据在 R 脚本中存储为 sf
(简单功能)。我想将此数据导出为 QGIS 可读的 shapefile(或 GEOJSON)。我这样做的原因是,在我看来,通过 Rs osmdata
包提取特定历史数据集是在其编辑历史的给定时期内创建 OSM 历史数据特定段数据的最有效方法(让我知道是否有人有更快的方法来为不同年份的国家/地区批量数据执行此操作。)
我当前的代码,使用示例数据集,如下所示:
library(osmdata)
library(sf)
q1 <- opq('Sevilla') %>%
add_osm_feature(key = 'highway', value = 'cycleway')
cway_sev <- osmdata_sp(q1)
sp::plot(cway_sev$osm_lines)
我收到两种不同类型的错误:
当我添加特定的日期时间(如:q1 <- opq('Sevilla',datetime = "2015-01-01T12:00:00Z") %>%
)时,出现此错误:
Error in check_for_error(doc) : General overpass server error; returned:
The data included in this document is from www.openstreetmap.org. The data is made available under ODbL. runtime error: Query timed out in "query" at line 4 after 45 seconds.
此外,我猜更重要的是,当我添加 function 以从 SF 转换为 SHP 时
(st_write(cway_sev, "sev_t_1.shp")
)
我收到这个错误:
Error in UseMethod("st_write") :
no applicable method for 'st_write' applied to an object of class "c('list', 'osmdata', 'osmdata_sp')"
有什么建议吗?再次,在这里完成 R 新手。
我无法帮助您解决历史性的超时问题datetime
;据我所知,可能存在服务器端问题(我遇到了同样的错误,并且您对参数的构造似乎遵循了文档)。
关于其他问题:
在{sf}
的世界工作时,我建议通过osmdata_sf()
电话下载您的数据;除非绝对必要,否则避免混合 sf
和 sp
世界对你的理智有好处。
返回的对象不仅包含线,还包含点、多边形和(在您的情况下为空)多类型对象。
使用循环路径时,只需 select 将 osm_lines
对象指向一个新变量;它将包含几何类型为 linestring 的 Sevilla 自行车道。
目视检查后,您现在可以将其保存为 ESRI Shapefile;请注意,这是一种古老的文件格式,基于 Ashton Tate dBase IV(看在皮特的份上的 DOS 程序 :),因此允许数据列名称的字符数有限,因此出现警告。
library(osmdata)
library(dplyr)
library(sf)
sevilla <- opq('Sevilla') %>%
add_osm_feature(key = 'highway', value = 'cycleway') %>%
osmdata_sf()
names(sevilla) # note the points, polygons, multilines and multipolygons
# [1] "bbox" "overpass_call" "meta" "osm_points" "osm_lines"
# [6] "osm_polygons" "osm_multilines" "osm_multipolygons"
# just a single geometry type
sevilla_lines <- sevilla$osm_lines
# visual check of lines geometry only / does this look right?
plot(st_geometry(sevilla_lines))
# this will work, with the lines only
st_write(sevilla_lines, "sevilla.shp")
# Writing layer `sevilla' to data source `sevilla.shp' using driver `ESRI Shapefile'
# Writing 555 features with 34 fields and geometry type Line String.
# Warning message:
# In abbreviate_shapefile_names(obj) :
# Field names abbreviated for ESRI Shapefile driver
完全不懂R,见谅-
我正在尝试使用 R 创建一些历史 OSM 数据,这些数据在 R 脚本中存储为 sf
(简单功能)。我想将此数据导出为 QGIS 可读的 shapefile(或 GEOJSON)。我这样做的原因是,在我看来,通过 Rs osmdata
包提取特定历史数据集是在其编辑历史的给定时期内创建 OSM 历史数据特定段数据的最有效方法(让我知道是否有人有更快的方法来为不同年份的国家/地区批量数据执行此操作。)
我当前的代码,使用示例数据集,如下所示:
library(osmdata)
library(sf)
q1 <- opq('Sevilla') %>%
add_osm_feature(key = 'highway', value = 'cycleway')
cway_sev <- osmdata_sp(q1)
sp::plot(cway_sev$osm_lines)
我收到两种不同类型的错误:
当我添加特定的日期时间(如:q1 <- opq('Sevilla',datetime = "2015-01-01T12:00:00Z") %>%
)时,出现此错误:
Error in check_for_error(doc) : General overpass server error; returned:
The data included in this document is from www.openstreetmap.org. The data is made available under ODbL. runtime error: Query timed out in "query" at line 4 after 45 seconds.
此外,我猜更重要的是,当我添加 function 以从 SF 转换为 SHP 时
(st_write(cway_sev, "sev_t_1.shp")
)
我收到这个错误:
Error in UseMethod("st_write") :
no applicable method for 'st_write' applied to an object of class "c('list', 'osmdata', 'osmdata_sp')"
有什么建议吗?再次,在这里完成 R 新手。
我无法帮助您解决历史性的超时问题datetime
;据我所知,可能存在服务器端问题(我遇到了同样的错误,并且您对参数的构造似乎遵循了文档)。
关于其他问题:
在{sf}
的世界工作时,我建议通过osmdata_sf()
电话下载您的数据;除非绝对必要,否则避免混合 sf
和 sp
世界对你的理智有好处。
返回的对象不仅包含线,还包含点、多边形和(在您的情况下为空)多类型对象。
使用循环路径时,只需 select 将 osm_lines
对象指向一个新变量;它将包含几何类型为 linestring 的 Sevilla 自行车道。
目视检查后,您现在可以将其保存为 ESRI Shapefile;请注意,这是一种古老的文件格式,基于 Ashton Tate dBase IV(看在皮特的份上的 DOS 程序 :),因此允许数据列名称的字符数有限,因此出现警告。
library(osmdata)
library(dplyr)
library(sf)
sevilla <- opq('Sevilla') %>%
add_osm_feature(key = 'highway', value = 'cycleway') %>%
osmdata_sf()
names(sevilla) # note the points, polygons, multilines and multipolygons
# [1] "bbox" "overpass_call" "meta" "osm_points" "osm_lines"
# [6] "osm_polygons" "osm_multilines" "osm_multipolygons"
# just a single geometry type
sevilla_lines <- sevilla$osm_lines
# visual check of lines geometry only / does this look right?
plot(st_geometry(sevilla_lines))
# this will work, with the lines only
st_write(sevilla_lines, "sevilla.shp")
# Writing layer `sevilla' to data source `sevilla.shp' using driver `ESRI Shapefile'
# Writing 555 features with 34 fields and geometry type Line String.
# Warning message:
# In abbreviate_shapefile_names(obj) :
# Field names abbreviated for ESRI Shapefile driver