【发布时间】:2022-02-24 16:35:14
【问题描述】:
还有一些其他帖子相关与此相关,例如:Post 1、Post 2、Post 3。但是,它们都没有提供我所希望的。我想要的是能够在特定方向(“正南”又名向下)从特定点(采样位置)到完全围绕该点(湖泊边界)的多边形边缘绘制一条线段。然后我想测量采样点和多边形边缘之间的线段的长度(真的,这只是我想要的距离,所以如果我们可以在不绘制线段的情况下获得距离,那就更好了!)。不幸的是,sf 包中似乎不存在执行此操作的功能:See closed issue here。
我怀疑,不过,这可以通过修改此处提供的解决方案来实现:See copy-pasted code below, modified by me。但是,我对sf 中的工具非常不满意--我只制作了从点本身到多边形南部范围的线段,在某个点与多边形相交:
library(sf)
library(dplyr)
df = data.frame(
lon = c(119.4, 119.4, 119.4, 119.5, 119.5),
lat = c(-5.192,-5.192,-5.167,-5.167,-5.191)
)
polygon <- df %>%
st_as_sf(coords = c("lon", "lat"), crs = 4326) %>%
summarise(geometry = st_combine(geometry)) %>%
st_cast("POLYGON")
plot(polygon)
df2 <- data.frame(lon = c(119.45, 119.49, 119.47),
lat = c(-5.172,-5.190,-5.183))
points <- df2 %>%
st_as_sf(coords = c("lon", "lat"), crs = 4326) %>%
summarise(geometry = st_combine(geometry)) %>%
st_cast("MULTIPOINT")
plot(points, add = TRUE, col = "red")
# Solution via a loop
xmin <- min(df$lat)
m = list()
# Iterate and create lines
for (i in 1:3) {
m[[i]] = st_linestring(matrix(
c(df2[i, "lon"],
df2[i, "lat"],
df2[i, "lon"],
xmin),
nrow = 2,
byrow = TRUE
))
}
test = st_multilinestring(m)
# Result is line MULTILINESTRING object
plot(test, col = "green", add = TRUE)
但现在我不知道如何使用st_intersection 或任何此类函数来确定交点的位置。我认为,大部分问题在于我创建的不是sf 对象,我不知道如何让它成为一个对象。我假设,如果我能找出线段与多边形相交的位置(或者理想情况下它们相交的最北时间),我可以使用类似st_distance 的函数以某种方式从交点到采样点进行测量。但是,由于湖泊多边形通常真的很复杂,因此一个线段可能会多次与多边形相交(例如,如果在给定点以南有一个半岛),在这种情况下,我想我可以找到每个采样点的“最北”交点并使用该交点,否则为每个采样点取最小的此类距离。
无论如何,如果有人可以告诉我我缺少的几个步骤,那就太好了!我觉得我很近,但又很远......
【问题讨论】:
标签: r geospatial sf