如何计算一组包含高程值的 sf 线段的真实长度?

How do I calculate the true length of a set of sf line segments that contains elevation values?

我正在尝试计算包含高程数据的每个多线串的真实长度。

这是我的代码:

library(sf)
#Linking to GEOS 3.10.2, GDAL 3.4.2, PROJ 9.0.0; sf_use_s2() is TRUE

# Data creation
s1 <- st_multilinestring(list(rbind(c(0,3,1), c(0,4,1))))
s2 <- st_multilinestring(list(rbind(c(0,4,1), c(1,5,4))))
s3 <- st_multilinestring(list(rbind(c(1,5,4), c(2,5,6))))
s4 <- st_multilinestring(list(rbind(c(2,5,6), c(2.5,5,12))))
s5 <- st_multilinestring(list(rbind(c(2.5,5,12), c(4,7,4))))
s6 <- st_multilinestring(list(rbind(c(4,7,4), c(4.5,7,3))))
s7 <- st_multilinestring(list(rbind(c(4.5,7,3), c(5,7,3))))

sf_ml <- st_sf(section = 1,
               geometry=st_sfc(list(s1,s2,s3,s4,s5,s6,s7)),
               crs = 4326)
plot(sf_ml)

但是,在使用st_length()时提示正在删除Z坐标。因此,我认为它没有使用海拔值。

st_length(sf_ml)
# st_as_s2(): dropping Z and/or M coordinate
#Units: [m]
#[1] 111195.10 157010.41 110771.96  55385.98 277435.26  55183.13  55183.13

如果我不使用 S2,我会得到一组不同的值。

sf_use_s2(F)
#Spherical geometry (s2) switched off

st_length(sf_ml)
#Units: [m]
#[1] 110578.44 156665.64 110898.70  55449.35 276575.59  55247.61  55247.61

如果我不使用 S2,st_length() 是否会使用海拔值?还是我为此使用了错误的 R 包?

提前致谢。

st_length 计算在处理 lat-long 数据时确实使用 Z 值。

让我们创建一个长 1 米、高 1 米的要素。我将在英国投影系统中执行此操作并稍后转换为 lat-long。

> g1 = st_multilinestring(list(rbind(c(0,1,2),c(0,2,3))))
> sd = st_sf(geometry=st_sfc(g1), crs=27700)

st_length无视Z,默默给出1m​​长度:

> st_length(sd)
1 [m]

这与s2状态无关,当然,因为我们在笛卡尔坐标系中:

> sf_use_s2(TRUE)
> st_length(sd)
1 [m]
> sf_use_s2(FALSE)
Spherical geometry (s2) switched off
> st_length(sd)
1 [m]

现在转换成4326看看:

> sdg = st_transform(sd, 4326)
> sf_use_s2(TRUE)
Spherical geometry (s2) switched on
> st_length(sdg)
st_as_s2(): dropping Z and/or M coordinate
0.9981138 [m]

由于转换,这降低了 Z 并且 returned 距离略小于 1m。现在没有 s2:

> sf_use_s2(FALSE)
Spherical geometry (s2) switched off
> st_length(sdg)
1.413078 [m]

这大约是 sqrt(2),这是包括这条线的 Z 的 3d 距离 - 但一定有一些转换回米到 return 米的距离(并处理Z 坐标以米为单位)。 ?st_length 的详细信息中提到了这一点,并且将使用球形距离 - 也许它计算 X-Y 距离,然后通过毕达哥拉斯定理与 Z 距离结合。

所以我通过观察得出结论:

  • 对于投影笛卡尔坐标,st_length 默默地忽略 Z
  • 对于启用了 s2 的 lat-long 坐标,st_length 会大声地掉落 Z
  • 对于 lat-long 坐标禁用 s2st_length 使用 Z
  • 计算 3d 距离