繁体   English   中英

每个多边形空间数据框的最长线?

[英]r longest line for each polygon spatial dataframe?

我怎样才能得到每个多边形的最长线(边)的长度? 什么包最不成问题? 我想知道除了逐点迭代之外是否还有其他功能(下面的一些虚拟示例)? 除此之外,我想知道是否有任何方法可以获取每个部分与相邻部分的方位角和/或角度,但由于一些专家对一次只问一个问题过于敏感,我将其留待其他时间;) 提前致谢

r1 = cbind(c(180114, 180553, 181127, 180114), c(332349, 332057, 332342, 332349))
r2 = cbind(c(180042, 180545, 180553,  180042), c(332373, 332026, 331426, 332373))
r3 = cbind(c(179110, 179907, 180433, 179110),  c(331086, 330620, 330494, 331086))
r4 = cbind(c(180304, 180403,179632,180304),  c(332791, 333204, 333635, 332791))
sr1=Polygons(list(Polygon(r1)),"r1")
sr2=Polygons(list(Polygon(r2)),"r2")
sr3=Polygons(list(Polygon(r3)),"r3")
sr4=Polygons(list(Polygon(r4)),"r4")
sr=SpatialPolygons(list(sr1,sr2,sr3,sr4))
srdf=SpatialPolygonsDataFrame(sr, data.frame(cbind(1:4,5:2),
                                             row.names=c("r1","r2","r3","r4")))

使用名为GeoAxe的 R 包,您可以将地理空间对象拆分为多个部分。 一旦你有单独的段,你可以使用另一个名为SpatialLines 的包来获取段的长度。 从这里您可以选择最大的一个。

这种方法的一个可能的缺点是数据必须是空间格式,例如用于输入的 .shp 但幸运的是还有一个用于创建这些的包。

这有帮助吗?

splitPolygon <- function(x){
  st_segment = function(r){st_linestring(t(matrix(unlist(r), 2, 2)))}
  m <- data.frame(st_coordinates(x)[, 1:2])
  nr <- nrow(m)
  m2 <- cbind(m[-nr,], m[-1,])
  names(m2) <- c("Xstart", "Ystart", "Xend", "Yend")
 m3 <- rbind(m2,
             data.frame(Xstart = m$Xend[nr],
                        Ystart = m$Yend[nr],
                        Xend = m$Xend[1],
                        Yend = m$Yend))
 m3$geom = st_sfc(sapply(1:nrow(m3), 
                         function(i){st_segment(m3[i,])},simplify=FALSE))
 st_sf(m3, crs = st_crs(x))
}

longest_side_of_polygon <- function(x){
  df <- splitPolygon(x)
  l <- st_length(df)
  lmat <- st_coordinates(df[which.max(l), ])[,1:2]
  st_sfc(st_linestring(rbind(lmat[1,], lmat[2,])),
         crs = st_crs(x))
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM