尝试汇总R中栅格单元内的线长度

尝试汇总R中栅格单元内的线长度,r,line,polygon,sf,R,Line,Polygon,Sf,我试图计算R中网格单元内的线长度之和。我一直使用它作为参考 我遇到的问题是,当我使用st_make_grid创建网格时,当我将线交点长度与网格匹配时,没有ID列。我曾尝试使用as.Spatial将网格转换为SpatialPolygonsDataFrame,以便添加列,但由于网格不再是“sf”对象,因此st_长度和st_交点将不起作用。最好的解决方法是什么?您需要通过sf::st_as_sf() 考虑这个例子,它建立在{sf}附带的著名且深受喜爱的nc.shp数据集之上 library(sf) l

我试图计算R中网格单元内的线长度之和。我一直使用它作为参考


我遇到的问题是,当我使用st_make_grid创建网格时,当我将线交点长度与网格匹配时,没有ID列。我曾尝试使用as.Spatial将网格转换为SpatialPolygonsDataFrame,以便添加列,但由于网格不再是“sf”对象,因此st_长度和st_交点将不起作用。最好的解决方法是什么?

您需要通过
sf::st_as_sf()

考虑这个例子,它建立在{sf}附带的著名且深受喜爱的nc.shp数据集之上

library(sf)
library(dplyr)

shape <- st_read(system.file("shape/nc.shp", package="sf")) %>%  
  summarise() %>% 
  st_geometry() %>% 
  st_cast("POLYGON") %>% 
  st_cast("LINESTRING")

# a line around North Carolina - to get a line object
plot(shape)
库(sf)
图书馆(dplyr)
形状%
摘要()%>%
st_几何体()%>%
st_铸造(“多边形”)%%>%
st_铸造(“线串”)
#围绕北卡罗来纳州的直线-获取直线对象
绘图(形状)

grid%
这就是部分!
mutate(id=1:nrow()#现在可以添加行id
交叉点%
突变(长度=st_长度(%)%%>
st_drop_geometry()#稍后会使连接中的事情复杂化
网格%
左连接(交叉点,by=“id”)
绘图(网格[“长度”])

很高兴为您服务!:)实际上我还有一个问题。如何获得网格单元中所有线长度的总和?按照当前的设置方式,我得到了单元中每个线段的长度,但由于我有多个线段,我需要求和。我可以在st_length函数中使用fun=sum吗?这很棘手,因为我几乎没有想象力,实际上看不到数据,但理论上,你应该能够运行summary()调用你的相交对象,按新引入的
id
字段分组&对每个单元格的相交长度求和
grid <- st_make_grid(x = st_bbox(shape),
                     n = c(30, 10)) %>% 
  st_as_sf() %>% # this is the part!
  mutate(id = 1:nrow(.)) # now tis possible to add a row id

intersection <- st_intersection(grid, shape) %>% 
  mutate(lenght = st_length(.)) %>% 
  st_drop_geometry() # complicates things in joins later on


grid <- grid %>% 
  left_join(intersection, by = "id")

plot(grid["lenght"])