计算到最近点xyz坐标的距离

时间:2019-02-12 17:42:51

标签: r distance spatstat

我正在使用spatstat软件包,根据xyz数据计算与其对应点的最近距离。该代码有效,但是我得到的答案不正确。见下文。

ex<- data.frame(long= c(-103.5664,-103.5664,-103.5586),lat= c(32.09539,32.10129,32.10799),elevation= c(5000,5500,5700))
####bounding box 3D
bb <- box3(range(ex$long), range(ex$lat), range(ex$elevation))

# Create a spatial points data frame:
comp_dist.pp3<- spatstat::pp3(ex$long,ex$lat,ex$elevation,bb)

nndist.pp3(comp_dist.pp3,k=1)

[1] 500 200 200

这些点相距一英里多,因此应该更接近6800。

2 个答案:

答案 0 :(得分:1)

不幸的是,spatstat无法自动识别纬度和经度 坐标。您的点在欧几里得中被解释为(x,y,z)坐标 空间,三个成对的距离由 sqrt((x2-x1)^2 + (y2-y1)^2 + (z2-z1)^2)很好(非常可疑) 四舍五入为200、500和700。这是对原始数字的小改动 计算所有成对距离的代码:

library(spatstat)
ex<- data.frame(long= c(-103.5664,-103.5664,-103.5586),
                lat= c(32.09539,32.10129,32.10799),
                elevation= c(5000,5500,5700))
bb <- box3(range(ex$long), range(ex$lat), range(ex$elevation))
comp_dist.pp3<- spatstat::pp3(ex$long,ex$lat,ex$elevation,bb)
pairdist(comp_dist.pp3)
#>      [,1] [,2] [,3]
#> [1,]    0  500  700
#> [2,]  500    0  200
#> [3,]  700  200    0

您可以使用sp::spTransformsf::transform从球面转换 (lon,lat)到平面(x,y),然后可以将标高附加为z坐标 当您定义pp3对象并且一切正常时。

reprex package(v0.2.1)于2019-02-12创建

答案 1 :(得分:0)

检查您的单位。如果您查看经度值:-103左右,纬度值:32左右,海拔高度:5000、5500、5700。引起距离最多的维度是海拔高度。由于它们之间仅相差500和200,因此我不希望距离“更接近6800”。

编辑:也就是说,我相信您的包裹将纬度和经度视为xyz平面上的数字尺寸,而不是实际的纬度和经度!