我必须确定连接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)
但是在下一步中会出现错误(带有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")
我认为表格会出错,但我不知道如何取消它...任何想法?
答案 0 :(得分:0)
您的代码中有很多内容。这是我纠正我所看到的事情的最佳尝试。
sf
)st_set_crs
允许您在管道中使用它(不确定EPSG 2180是否重要)min
和max
,而不是使用which.min
和which.max
,然后索引,实际上返回1x1数据帧而不是“标量”(R实际上只有1个向量)st_linestring
将矩阵作为点的参数,而不是列表。这是错误的来源(字面意思是is.matrix(x) is not TRUE
)毕竟,您可以根据代码的需要获取该行。然而,正如你所说,这可能不是“x方向上的两个最极端点和y方向上的两个最极端点”。这实际上做的是采用x
中最极端的y
和dane
值,创建与它们对应的新点(原始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)