如何计算一组包含高程值的 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 坐标禁用
s2
,st_length
使用 Z 计算 3d 距离
我正在尝试计算包含高程数据的每个多线串的真实长度。
这是我的代码:
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 坐标禁用
s2
,st_length
使用 Z 计算 3d 距离