我有一个关于给定市政当局街道的vector-type spatial data文件,另一个文件是关于地形坡度的raster-type spatial data文件.

我的目标是交叉这两个数据,找出哪些路段的街道最陡峭.

如果这两个数据都是sf类型的数据,我会使用st_cross函数.但当数据类型不同时,该如何继续呢?

我的最终目标是生成矢量形式的空间数据,并用一列表示该拉伸的坡度.

Reproducible example:

library(elevatr) 
library(terra)
library(geobr)
library(osmdata) # package for working with streets

# 2 - get the municipality shapefile (vectorized spatial data)
municipality_shape <- read_municipality(code_muni = 3305802)

# 3 - get the raster topographical data
t <- elevatr::get_elev_raster(locations = municipality_shape, 
                              z = 10, prj = "EPSG:4674") 
obj_raster <- rast(t) 

# 4 - calculate the slope
aspect <- terrain(obj_raster, "aspect", unit = "radians")
slope <- terrain(obj_raster, "slope", unit = "radians")
hillshade <- shade(slope, aspect)

# 5 - get the streets data

getbb("Teresópolis")
big_streets <- getbb("Teresópolis") |>
  opq() |> # função que faz a query no OSM
  add_osm_feature(key = "highway", # selecionar apenas ruas
                  value = "primary") |> # característica das ruas
  osmdata_sf() # retorna a query como um objeto sf

# 6 - intersects the raster hillshade object with the sf object from streets available in big_streets$osm_lines$geometry.

推荐答案

如果您只想提取街道,则可以细分行字符串:

big_streets <- getbb("Teresópolis")%>%
  opq()%>% # função que faz a query no OSM
  add_osm_feature(key = "highway", # selecionar apenas ruas
                  value = "primary") %>% # característica das ruas
  osmdata_sf() %>%
  osm_poly2line() %>%
  `[[`("osm_lines")

现在,对于每条街道,使用extract来获取对应于每条线串的数据.您需要对其进行平均,以便每条街道都有一个平均值(如果您愿意,您也可以同样获得最大斜率)

big_streets$avg_shade <- sapply(big_streets$geometry, function(x) {
  mean(extract(hillshade, vect(x))[[2]])
})

现在big_streets有一个额外的列,它给出了每条街道的平均值shade.我们可以看到这是什么样子的:

ggplot(big_streets) + geom_sf(aes(color = avg_shade)) + scale_color_viridis()

enter image description here

R相关问答推荐

使用ggplot将平滑线添加到条形图

寻找图片边缘

在位置周围设定一个半径并识别该半径内的其他位置

R中的时间序列(Ts)函数计数不正确

如何对2个列表元素的所有组合进行操作?

打印XTS对象

从圆到R中的多边形的标绘雷达图

将多个列值转换为二进制

使用未知字符数(不受限制的最大长度)的Lookback有什么好的替代方案?

提高圣彼得堡模拟的速度

如何在使用Alpha时让geom_curve在箭头中显示恒定透明度

如何判断代码是否在R Markdown(RMD)上下文中交互运行?

整理ggmosaic图的标签

R中的Desolve:返回的导数数错误

把代码写成dplyr中的group_by/摘要更简洁吗?

使用显式二元谓词子集化sfc对象时出错

为什么在POSIXct-times的向量上循环会改变R中的类型?

Gggvenn为Venn增加了不存在的价值

残差与拟合图上标记点的故障排除

使用另一列中的增长率外推R(使用dplyr)