1

我想使用 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 计算的点之间的距离,但我只是不知道在哪里。我尝试通过计算距离并在 $ 元素中查找值来解决这个问题,但我找不到它们。对我来说,使用这些信息的最佳方法是,如果我可以将绘图上每条线的长度绘制到每条单独的线上,那么我可以手动计算所有城市之间的距离。

谢谢你的帮助!

4

1 回答 1

0

解决方案:

all.distances计算所有可能的距离并将它们存储到称为(距离以米为单位)的矩阵中。(dat是一个源 data.frame 包含纬度和经度)

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

现在你的距离比你需要的多得多,所以你必须生成代码,只提取你需要的值。创建列表,您可以在其中查看哪些树是邻居(通过 Delaunay 三角测量)

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)

享受 :)

于 2013-07-11T07:18:14.083 回答