还有一些其他的帖子,比如Post 1Post 2Post 3.然而,它们都没有实现我的期望.我想要的是能够从一个特定的点(采样位置)到一个完全围绕该点(湖泊边界)的多边形边缘,在一个特定的方向("正南"即向下)绘制一条线段.然后我想测量采样点和多边形边之间的线段的长度(实际上,这只是我想要的距离,所以如果我们不绘制线段就可以得到距离,那就更好了!).不幸的是,sf
包See closed issue here中似乎没有实现这一点的功能.
I suspect,但是,这是可能的,通过修改这里提供的解决方案: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
对象,我不知道如何使其成为sf
对象.理想情况下,我可以用st_distance
点的交点来测量,如果我可以用st_distance
点的交点来测量的话.然而,由于湖泊多边形通常是复杂的,因此一段可能会多次与多边形相交(例如,如果给定点以南有一个半岛),在这种情况下,我想我可以找到每个采样点的"最北边"交点,并使用该交点,或者取每个采样点的最小距离.
不管怎样,如果有人能告诉我我错过的几步,那就太好了!我觉得我离得很近,但却离得很远...