确定连接两个最极端点的线

时间:2018-02-08 13:45:48

标签: r dataframe geometry rstudio lapply

我必须确定连接x方向上两个最极端点和y方向上两个最极端点的直线。

我对coords的观点:

x <- rpois(200,485000)
y <- rpois(200,625000)
dane <- data.frame(x,y)
dane$ID  <- seq(1,200)
df_punkty <- st_as_sf(dane,coords = c("x","y"))
st_crs(df_punkty) <- 2180

我试着用这样的极端点制作表格:

min_x  <- dane[which.min(dane$x),]
max_x  <- dane[which.max(dane$x),]
X  <- full_join(min_x, max_x, by = c("y", "x"))
dane[dane$x == min_x,]
X$ID =1
min_y  <- dane[which.min(dane$y),]
max_y  <- dane[which.max(dane$y),]
Y  <- full_join(min_y, max_y, by = c("y", "x"))
Y$ID = 1

tab <- data.frame(X,Y)
head(tab)

enter image description here

但是在下一步中会出现错误(带有geom_lines的行) - “错误:变量is.matrix(x)&amp;&amp; is.numeric(x)没有TRUE”

list_lines <- split(tab,f=tab$ID) 
list_lines <- lapply(list_lines,as.matrix) 
list <-split(tab[,1:2],f=tab$ID) 
geom_lines <- lapply(list,st_linestring,dim="XY")

我认为表格会出错,但我不知道如何取消它...任何想法?

1 个答案:

答案 0 :(得分:0)

您的代码中有很多内容。这是我纠正我所看到的事情的最佳尝试。

  • 通常包含您的依赖项(在这种情况下为sf
  • 您可以直接在
  • 中创建包含这些功能的数据框
  • st_set_crs允许您在管道中使用它(不确定EPSG 2180是否重要)
  • 如果您想要数据框的列的最小值或最大值,则可以使用minmax,而不是使用which.minwhich.max,然后索引,实际上返回1x1数据帧而不是“标量”(R实际上只有1个向量)
  • st_linestring将矩阵作为点的参数,而不是列表。这是错误的来源(字面意思是is.matrix(x) is not TRUE

毕竟,您可以根据代码的需要获取该行。然而,正如你所说,这可能不是“x方向上的两个最极端点和y方向上的两个最极端点”。这实际上做的是采用x中最极端的ydane值,创建与它们对应的新点(原始df_punkty中不存在)并划出它们之间的界限。如果您想在x-y上绘制df_punkty 之间的最长行,那么我需要编辑此答案...

library(tidyverse)
library(sf)
dane <- tibble(
  x = rpois(200, 485000),
  y = rpois(200,625000),
  ID = 1:200
  )

df_punkty <- dane %>%
  st_as_sf(coords = c("x","y")) %>%
  st_set_crs(2180)

extremes <- matrix(, 2, 2)
extremes[1, 1] <- min(dane$x)
extremes[2, 1] <- max(dane$x)
extremes[1, 2] <- min(dane$y)
extremes[2, 2] <- max(dane$y)

extremes %>%
  st_linestring() %>%
  plot()

编辑:以下是将点与x和y值的极值连接的线:

x_ex <- y_ex <- matrix(, 2, 2)
x_ex[1, 1:2] <- as.matrix(dane[which.min(dane$x), 1:2])
x_ex[2, 1:2] <- as.matrix(dane[which.max(dane$x), 1:2])
y_ex[1, 1:2] <- as.matrix(dane[which.min(dane$y), 1:2])
y_ex[2, 1:2] <- as.matrix(dane[which.max(dane$y), 1:2])

plot(df_punkty)
plot(x_ex %>% st_linestring(), add = TRUE)
plot(y_ex %>% st_linestring(), add = TRUE)

enter image description here