如何在R中使用deldir进行Delaunay三角剖分后提取点之间的距离?

时间:2012-07-02 11:50:19

标签: r distance spatial delaunay deldir

我想使用Delaunay Triangulations计算城市之间的距离。我有二十个城市的经度和纬度,我想计算它们之间的距离,但是我很难弄清楚如何从三角测量中提取距离信息。到目前为止,我已经使用了deldir()(来自库deldir)。请参阅下面的代码。

x   <- c(2.3,3.0,7.0,1.0,3.0,8.0)
y   <- c(2.3,3.0,2.0,5.0,8.0,9.0)
try <- deldir(x,y,list(ndx=2,ndy=2),c(0,10,0,10))

str(try)
List of 8
$ delsgs  :'data.frame':    23 obs. of  6 variables:
..$ x1  : num [1:23] 3 7 7 1 1 3 3 3 8 8 ...
..$ y1  : num [1:23] 3 2 2 5 5 8 8 8 9 9 ...
..$ x2  : num [1:23] 2.3 2.3 3 2.3 3 3 7 1 7 3 ...
..$ y2  : num [1:23] 2.3 2.3 3 2.3 3 3 2 5 2 8 ...
..$ ind1: num [1:23] 2 3 3 4 4 5 5 5 6 6 ...
..$ ind2: num [1:23] 1 1 2 1 2 2 3 4 3 5 ...
$ dirsgs  :'data.frame':    15 obs. of  8 variables:
..$ x1  : num [1:15] 1.65 4.56 5.75 0 1.65 ...
..$ y1  : num [1:15] 3.65 0.74 5.5 2.86 3.65 ...
..$ x2  : num [1:15] 4.56 4.51 4.56 1.65 3.5 ...
..$ y2  : num [1:15] 0.74 0 0.74 3.65 5.5 ...
..$ ind1: num [1:15] 2 3 3 4 4 5 5 5 6 6 ...
..$ ind2: num [1:15] 1 1 2 1 2 2 3 4 3 5 ...
..$ bp1 : logi [1:15] FALSE FALSE FALSE TRUE FALSE FALSE ...
..$ bp2 : logi [1:15] FALSE TRUE FALSE FALSE FALSE FALSE ...
$ summary :'data.frame':    10 obs. of  9 variables:
..$ x       : num [1:10] 2.3 3 7 1 3 8 0 10 0 10
..$ y       : num [1:10] 2.3 3 2 5 8 9 0 0 10 10
..$ n.tri   : num [1:10] 4 4 6 5 5 5 4 3 4 2
..$ del.area: num [1:10] 4.5 6.05 18.67 7.5 15 ...
..$ del.wts : num [1:10] 0.045 0.0605 0.1867 0.075 0.15 ...
..$ n.tside : num [1:10] 4 4 5 4 5 3 1 1 2 1
..$ nbpt    : num [1:10] 4 0 4 2 2 4 2 2 2 2
..$ dir.area: num [1:10] 9.09 10.74 23.32 9.39 18.06 ...
..$ dir.wts : num [1:10] 0.0909 0.1074 0.2332 0.0939 0.1806 ...
$ n.data  : int 6
$ n.dum   : int 4
$ del.area: num 100
$ dir.area: num 100
$ rw      : num [1:4] 0 10 0 10
- attr(*, "class")= chr "deldir"

我很确定在'尝试'某处可以存储由deldir计算的点之间的距离,但我只是不知道在哪里。我已经尝试通过计算距离并在$元素中查找值来计算它,但我找不到它们。对我来说,使用这些信息的最佳方式是,如果我可以将绘图上每条线的长度绘制到每条线上,那么我可以手动计算所有城市之间的距离。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

<强>解决方案:

计算所有可能的距离并将其存储到名为all.distances的矩阵中(距离以米为单位)。 ( dat 是包含纬度和经度的源数据。)

library(BoSSA)
all.distances<-distGPS(dat$lat, dat$lon)

现在您的距离远远超过您的需要,因此您必须生成仅提取所需值的代码。创建列表,您可以在其中查看哪些树是邻居(通过Delaunay Triangulation)

library(tripack)
tree.nb<-neighbours(tri.mesh(dat$lat,dat$lon))

创建两个向量,因此您有邻居的组合

my.FC<-rep(c(1:length(tree.nb)), sapply(tree.nb, length))
my.SC<-unlist(tree.nb)

看起来像这样:

my.FC
[1]
1  1  1  2  2  2  2  3  4  4

my.SC
[1]
6  7  8  4  7  5  8  5  2  9

作为列读取,因此位置“1”是邻居,位置为“6”,“7”,“8”。位置“2”是邻居,位置“4”,“7”,“5”,“8”,等等......

现在来了聪明的部分...... 您需要使用邻域组合作为距离矩阵中所需值的坐标。并将这些值提取到矢量

为距离值创建空矢量:

nb.dist<-numeric(sum(sapply(tree.nb, length)))

提取值的代码:

for (i in 1:sum(sapply(tree.nb, length)))
    nb.dist[i] <- all.distances[my.FC[i],my.SC[i]]

然而,在创建的向量中,“nb.dist”将是所有值两次(因为“1”是“8”的邻居而“8”也是“1”的邻居。

所以只需使用unique()

unique(nb.dist)

享受:)